發(fā)一份Linux2.6.24下用的CH452驅(qū)動(dòng)程序

自己寫的……2線制,使用了內(nèi)核的I2C子系統(tǒng)。只用到了自己需要的幾個(gè)命令,還有幾個(gè)命令(如左/右移)沒有寫

原文發(fā)在自己的博客http://ujimori.info/?p=729

驅(qū)動(dòng)程序源碼+測試代碼:http://ujimori.info/wordpress/wp-content/uploads/2012/05/ch452.zip

一、總述

驅(qū)動(dòng)的基本結(jié)構(gòu)與MCP2510類似,可分為I2C控制器驅(qū)動(dòng)與CH452芯片驅(qū)動(dòng)。因?yàn)槲覀兪褂玫膬?nèi)核中已經(jīng)有很完善的S3C6410的I2C控制器驅(qū)動(dòng),因此我們要完成的只有CH452芯片驅(qū)動(dòng)。

因?yàn)闆]有發(fā)送數(shù)據(jù)的需求(控制LED的工作由Ioctl來做),所以沒有write函數(shù)。所多的無非是向內(nèi)核的I2C子系統(tǒng)注冊驅(qū)動(dòng)的過程。而關(guān)于內(nèi)核I2C子系統(tǒng)的內(nèi)容,很多書上都已經(jīng)介紹得很詳細(xì),不再贅述。

二、CH452的簡單介紹

具體的內(nèi)容請自行參考CH452的芯片手冊。在此只說幾個(gè)可能要特別注意的地方。

CH452接收的I2C命令都是12bit長度。這12bit中,高4bit構(gòu)成了I2C的7位地址中的低4bit,低8bit則作為后續(xù)數(shù)據(jù)進(jìn)行讀/寫(是讀是寫視I2C發(fā)送地址的最末一位而定。具體請參見I2C總線規(guī)范)。而7位地址的高3bit,最高兩位固定是01b,第3位為芯片管腳ADDR的值(詳見數(shù)據(jù)手冊P9)。在我們的電路中,ADDR被接到VCC上,所以應(yīng)該為1。 所以, 我們在對CH452進(jìn)行操作時(shí),要用到的I2C地址不止有1個(gè)。詳細(xì)對照之后可以看到7bit的I2C地址是在0×30~0x3F范圍內(nèi)。這在驅(qū)動(dòng)程序注冊i2c client時(shí)要特別注意 二線制的CH452應(yīng)該說只是兼容I2C的時(shí)序,但不能嚴(yán)格稱之為I2C設(shè)備。默認(rèn)情況下,它是不會(huì)向I2C主設(shè)備發(fā)送ACK信號的。這一點(diǎn)要特別留意。雖然芯片手冊說可以用一條I2C命令開啟ACK發(fā)送功能,但實(shí)際測試中發(fā)現(xiàn)并沒有出現(xiàn)應(yīng)有的ACK信號。 CH452芯片手冊上稱I2C數(shù)據(jù)速率可在500bps~400Kbps之間。但實(shí)際測試時(shí),使用344kbps速率時(shí)發(fā)現(xiàn)I2C總線工作不穩(wěn)定。因而應(yīng)將I2C速率適當(dāng)降低。

三、向I2C子系統(tǒng)注冊驅(qū)動(dòng)程序

ch452_init()中調(diào)用的i2c_add_driver()函數(shù)完成了驅(qū)動(dòng)向I2C子系統(tǒng)注冊的過程。調(diào)用順序如下:

ch452_init()

→i2c_add_driver()

→i2c_register_driver()

I2C設(shè)備驅(qū)動(dòng)有new style與legacy style的區(qū)別。兩者似乎使用了不同的注冊/操作接口,不可混用。我們這里討論的都是legacy style。i2c_register_driver()函數(shù)中,會(huì)對每個(gè)I2C adapter調(diào)用一次driver->attach_adapter(adapter)。此函數(shù)也是由我們自己來實(shí)現(xiàn)的,具體到本驅(qū)動(dòng)中就是ch452_attach_adapter()函數(shù)。

在ch452_attach_adapter()函數(shù)中,有對CH452芯片的初始化操作,最后調(diào)用i2c_probe()函數(shù),將i2c client結(jié)構(gòu)關(guān)聯(lián)到i2c adapter上。i2c_probe()函數(shù)的第二參數(shù)為一個(gè)struct i2c_client_address_data類型的指針,該結(jié)構(gòu)提供了待注冊的i2c client的地址。我們要關(guān)注的只有其中的normal_i2c成員。這個(gè)指針提供的I2C地址,如果沒有出現(xiàn)在ignore結(jié)構(gòu)中,就對其調(diào)用i2c_probe_address()函數(shù)。在此函數(shù)中,確認(rèn)該地址的可用性(即確認(rèn)該地址沒有被其它i2c cilent使用)后,調(diào)用函數(shù)第三個(gè)參數(shù)found_proc指向的函數(shù)。具體到我們的驅(qū)動(dòng)程序中,就是ch452_detect()函數(shù)。在這個(gè)函數(shù)中,初始化i2c client結(jié)構(gòu)、調(diào)用i2c_attach_client(),真正完成i2c client與i2c adapter的關(guān)聯(lián)過程。在對normal_i2c內(nèi)所有地址都完成這個(gè)調(diào)用過程后,驅(qū)動(dòng)向I2C子系統(tǒng)的注冊過程才算結(jié)束。

如上所述,CH452要用到I2C地址為0×30 ~ 0x3F,因而在驅(qū)動(dòng)初始化時(shí),向struct ch452_dev結(jié)構(gòu)的client成員分配了16個(gè)struct i2c_client的空間,用于這16個(gè)地址的i2c client的注冊。

四、I2C控制器工作過程

向CH452發(fā)送I2C命令,全部是通過i2c_transfer()函數(shù)來實(shí)現(xiàn)。注意所有struct i2c_msg的flags都被加上了I2C_M_IGNORE_NAK標(biāo)志。這是因?yàn)槟壳耙驗(yàn)槲粗驔]能打開CH452的ACK使能。I2C控制器驅(qū)動(dòng)在沒有接收到ACK的時(shí)候會(huì)認(rèn)為發(fā)送失敗并中止發(fā)送過程。因此,加上I2C_M_IGNORE_NAK標(biāo)志,讓I2C控制器忽略對ACK的處理。

i2c_transfer()函數(shù)中,通過調(diào)用i2c_adapter的algo->master_xfer(adap,msgs,num),實(shí)現(xiàn)真正的發(fā)送。在i2c-s3c2410.c中的第579行可看到:

static const struct i2c_algorithm s3c24xx_i2c_algorithm = {

.master_xfer = s3c24xx_i2c_xfer,

.functionality = s3c24xx_i2c_func,

};

s3c24xx_i2c_xfer()中有一個(gè)重發(fā)循環(huán),通過調(diào)用s3c24xx_i2c_doxfer()進(jìn)行發(fā)送,如果發(fā)送失敗則等待+重發(fā)。s3c24xx_i2c_doxfer()中,先s3c24xx_i2c_set_master()將控制器配置為主設(shè)備(該驅(qū)動(dòng)不支持從設(shè)備模式),s3c24xx_i2c_enable_irq()使能I2C中斷,最后用s3c24xx_i2c_message_start()開啟發(fā)送過程。在中斷處理中,再根據(jù)s3c24xx_i2c控制器設(shè)備的state進(jìn)行不同的處理。可以說整個(gè)I2C發(fā)送過程就是由中斷驅(qū)動(dòng)的,具體的工作過程請自己跟蹤代碼。很多書上也有相關(guān)的講解。

看了你寫的流程,實(shí)際上你需要使用硬件IIC來操作CH452,你可以到這里去下載例子程序。 http://www.findthetime.net/bbs/View.asp?S=103&I=28488


正好想學(xué)習(xí)這個(gè),,誰知道下載不了... 求樓主回復(fù)!


剛試了下可以下載的啊


樓主的資料可以下載?


樓主,您好!現(xiàn)在這個(gè)Linux2.6.24下用的CH452驅(qū)動(dòng)程序還有嗎?我現(xiàn)在使用Linux 內(nèi)核驅(qū)動(dòng)CH452遇到了些問題,想請教您,可否留一下聯(lián)系方法?我的微信13193356406,謝謝


有關(guān)CH452驅(qū)動(dòng)的問題,可直接與我們的技術(shù)支持聯(lián)系025-52638376


只有登錄才能回復(fù),可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频