linux檢測(cè)i2c命令 linux i2c應(yīng)用程序

i2c 在Linux下編程,測(cè)試i2c模塊是否能正常通信

如果你用的IC自己帶I2C模塊那肯定有一個(gè)寄存器可以給你寫(xiě)地址進(jìn)去

創(chuàng)新互聯(lián)2013年至今,先為八步等服務(wù)建站,八步等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢(xún)服務(wù)。為八步企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。

然后傳輸中 會(huì)自動(dòng)判斷地址是否匹配

如果你是IO口模擬I2C傳輸

那就要主機(jī)先發(fā)送地址

從機(jī)用if判斷 主機(jī)那邊發(fā)過(guò)來(lái)的地址數(shù)據(jù) 是不是 我這邊想收到的地址數(shù)據(jù)

linux下怎么直接使用iic接口

利用Linux中IIC設(shè)備子系統(tǒng)移植IIC設(shè)備驅(qū)動(dòng)

背景描述

IIC總線在嵌入式系統(tǒng)中應(yīng)用十分廣泛,常見(jiàn)的有eeprom,rtc。一般的處理器會(huì)包含IIC的控制器,用來(lái)完成IIC時(shí)序的控制;另外一方面,由于IIC的時(shí)序簡(jiǎn)單,使用GPIO口來(lái)模擬時(shí)序也是常見(jiàn)的做法。面對(duì)不同的IIC控制器,各種各樣的芯片以及l(fā)inux源碼,如何更快做好IIC設(shè)備驅(qū)動(dòng)。

問(wèn)題描述

在我們的方案中,我們會(huì)用到eeprom,rtc以及tw2865。由于Hi3520的IIC控制器設(shè)計(jì)有問(wèn)題,無(wú)法正常使用。而IIC控制器的SDA和SCL管腳正好是和兩個(gè)GPIO管腳復(fù)用的。Hisi將控制gpio來(lái)實(shí)現(xiàn)IIC的時(shí)序,從而對(duì)IIC設(shè)備進(jìn)行操作。這種設(shè)計(jì)方式簡(jiǎn)單明了,但使用IIC子系統(tǒng),可以更方便的移植和維護(hù)其他的設(shè)備驅(qū)動(dòng)。

問(wèn)題分析

Hisi對(duì)于gpio口,rtc芯片以及tw2865的處理方式如下:將gpio口做成一個(gè)模塊化的驅(qū)動(dòng),該驅(qū)動(dòng)模擬IIC時(shí)序,并向外提供一些函數(shù)接口,比如:EXPORT_SYMBOL(gpio_i2c_read_tw2815);等。對(duì)于具體的rtc芯片,將其注冊(cè)為一個(gè)misc設(shè)備,并利用gpio模塊導(dǎo)出的函數(shù)進(jìn)行rtc芯片的配置操作。

其實(shí)對(duì)于linux-2.6.24\drivers\i2c目錄下代碼,我們可以加以利用。

Linux的IIC字結(jié)構(gòu)分為三個(gè)組成部分:

IIC核心

IIC核心提供了IIC總線驅(qū)動(dòng)和設(shè)備驅(qū)動(dòng)的注冊(cè)、注銷(xiāo)方法,IICalgorithm上層的、與具體適配器無(wú)關(guān)的代碼以及探測(cè)設(shè)備、檢測(cè)設(shè)備地址的上層代碼。

IIC總線驅(qū)動(dòng)

IIC總線驅(qū)動(dòng)是對(duì)IIC硬件體系結(jié)構(gòu)中適配器端的實(shí)現(xiàn)。

IIC設(shè)備驅(qū)動(dòng)

IIC設(shè)備驅(qū)動(dòng)是對(duì)IIC硬件體系總設(shè)備端的實(shí)現(xiàn)。

我們查看下該目錄下的makefile和kconfig:

obj-$(CONFIG_I2C_BOARDINFO) +=i2c-boardinfo.o

obj-$(CONFIG_I2C) += i2c-core.o

obj-$(CONFIG_I2C_CHARDEV) +=i2c-dev.o

obj-y +=busses/ chips/ algos/

i2c-core.c就是IIC核心,buses中的文件是主流處理器中IIC總線的總線驅(qū)動(dòng),而chips中的文件就是常用芯片的驅(qū)動(dòng),algos中的文件實(shí)現(xiàn)了一些總線適配器的algorithm,其中就包括我們要用到的i2c-algo-bit.c文件。

我們首先利用i2c-gpio.c和i2c-algo-bit.c做好總線驅(qū)動(dòng)。

在i2c-gpio.c中,module_init?i2c_gpio_init?platform_driver_probe(i2c_gpio_driver,i2c_gpio_probe);

將其注冊(cè)為platform虛擬總線的驅(qū)動(dòng)。

在staticint __init i2c_gpio_probe(struct platform_device *pdev)中,

定義了如下三個(gè)結(jié)構(gòu)體:

structi2c_gpio_platform_data *pdata;//平臺(tái)相關(guān)的gpio的設(shè)置

structi2c_algo_bit_data *bit_data;//包含algorithm的具體函數(shù),setor

get SDA和SCL

structi2c_adapter *adap;//適配器

i2c_gpio_probe主要做了下面幾件事:

填充bit_data結(jié)構(gòu)的各個(gè)函數(shù)指針,關(guān)聯(lián)到具體的操作SDA和SCl函數(shù)。

填充adap結(jié)構(gòu),adap-algo_data= bit_data;

pdata= pdev-dev.platform_data;

bit_data-data= pdata;

pdev-dev-driver_data= adap;

在i2c-core中注冊(cè)適配器類(lèi)型。

inti2c_bit_add_numbered_bus(struct i2c_adapter *adap)

在staticint i2c_bit_prepare_bus(struct i2c_adapter *adap)中

adap-algo= i2c_bit_algo;

將i2c_bit_algo與adap關(guān)聯(lián)上。

static const structi2c_algorithm i2c_bit_algo = {

.master_xfer = bit_xfer,

.functionality = bit_func,

};

其中,master_xfer函數(shù)指針就是IIC傳輸函數(shù)指針。

I2c-algo-bit.c還實(shí)現(xiàn)了IIC開(kāi)始條件,結(jié)束條件的模擬,發(fā)送字節(jié),接收字節(jié)以及應(yīng)答位的處理。

i2c-gpio.c中的i2c_gpio_setsda_val等函數(shù)是與具體平臺(tái)gpio相關(guān)的。

修改對(duì)應(yīng)arch-hi3520v100目錄下的gpio.h中的各個(gè)函數(shù),這些函數(shù)是通過(guò)操作寄存器來(lái)控制gpio的方向和值。

在對(duì)應(yīng)mach-hi3520v100中的platform-devices.c中添加如下:

static structi2c_gpio_platform_data pdata = {

.sda_pin = 10,

.sda_is_open_drain = 1,

.scl_pin = 11,

.scl_is_open_drain = 1,

.udelay = 4, /* ~100 kHz */

};

static struct platform_devicehisilicon_i2c_gpio_device = {

.name = "i2c-gpio",

.id = -1,

.dev.platform_data = pdata,

};

static struct platform_device*hisilicon_plat_devs[] __initdata = {

hisilicon_i2c_gpio_device,

};

int __inithisilicon_register_platform_devices(void)

{

platform_add_devices(hisilicon_plat_devs,ARRAY_SIZE (hisilicon_plat_devs));

return 0;

}

通過(guò)platform添加devices和driver,使得pdev-dev.platform_data=pdata

綜合上面的過(guò)程,我們完成了adapter的注冊(cè),并將用gpio口模擬的algorithm與adapter完成了關(guān)聯(lián)。

這樣,在rtc-x1205.c中,x1205_attach函數(shù)利用i2c核心完成client和adap的關(guān)聯(lián)。

在x1205_probe函數(shù)中填充i2c_client結(jié)構(gòu)體,并調(diào)用i2c_attach_client通知iic核心。

接著注冊(cè)rtc驅(qū)動(dòng)。

最后我們要讀取時(shí)間,就需要構(gòu)造i2c_msg結(jié)構(gòu)體,如下所示:

struct i2c_msg msgs[] = {

{ client-addr, 0, 2,dt_addr }, /* setup read ptr */

{ client-addr, I2C_M_RD,8, buf }, /* read date */

};

/* read date registers */

if((i2c_transfer(client-adapter, msgs[0], 2)) != 2) {

dev_err(client-dev,"%s: read error\n", __FUNCTION__);

return -EIO;

}

dt_addr是寄存器的地址,I2C_M_RD表示iicread。

用linux 調(diào)用內(nèi)核中的統(tǒng)一I2C驅(qū)動(dòng) i2c總是 busy,求大神支招,謝謝! 程序很短

最近我也遇到這個(gè)問(wèn)題了,糾結(jié)了一天,在網(wǎng)友的支持下解決了,這個(gè)天嵌的版本中,i2c和他的攝像頭驅(qū)動(dòng)(OV9650驅(qū)動(dòng))相沖突,你在編譯內(nèi)核之前,將攝像頭的驅(qū)動(dòng)全部去掉,這樣子重新編譯之后,i2c就可以正常測(cè)試使用了。

文章標(biāo)題:linux檢測(cè)i2c命令 linux i2c應(yīng)用程序
網(wǎng)頁(yè)地址:http://muchs.cn/article32/hgihsc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、企業(yè)網(wǎng)站制作、虛擬主機(jī)、定制開(kāi)發(fā)、做網(wǎng)站、電子商務(wù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站