1. linux內核i2c設備驅動里的s3c_i2c_irq_nextbyte()函數中的retry_write為什麼不在ack
to_i2c_client(dev) 這個函數返回值是一個指針,這個指針是個struct i2c_client 類型的指針,這個指針指向塊內存,內存中存放著 to_i2c_client(dev)這個函數產生的數據。。
2. 用linux 調用內核中的統一I2C驅動 i2c總是 busy,求大神支招,謝謝! 程序很短
最近我也遇到這個問題了,糾結了一天,在網友的支持下解決了,這個天嵌的版本中,i2c和他的攝像頭驅動(OV9650驅動)相沖突,你在編譯內核之前,將攝像頭的驅動全部去掉,這樣子重新編譯之後,i2c就可以正常測試使用了。
3. Linux內核gpio
本文基於 RockPI 4A 單板 Linux 4.4 內核介紹 RK3399 Linux GPIO 功能。
GPIO(General Purpose Input/Output Port) :通用輸入輸出埠。
除作為一般的輸入/輸出功能外,還可以配置為中斷和模擬 PWM、I2C 等介面功能。
RK3399 GPIO 屬性如下:
1、一共有5組 GPIO(GPIO0~4) ,每組 GPIO 為一個 Bank ,共32個引腳。每個 Bank 包括4個 Group (GPIOA(0~7) ~ D(0~7)) 。不是所有 Bank 都有 GPIOA~D 的編號, RK3399 共122個 GPIO 引腳。
2、所有 GPIO 都可被配置為 CA55或CA53 的中斷功能,且 GPIO0 和 GPIO1 可用於系統低功耗喚醒模式。
3、在上電復位後,所有 GPIO 默認輸入狀態。
4、軟體可配置 GPIO 驅動強度。
RK3399 引腳在系統中顯示如下:
RK3399 GPIO 引腳號計算方式:
例:
以 ROCKPI 4A 單板 WIFI 模塊電源( GPIO0_B2 )為例,介紹 DTS 中 GPIO 配置。
在系統啟動後,可以查看 GPIO ,命令如下:
註:
如果debugfs沒有掛載,使用下面命令掛載
Linux 內核 GPIO 主要實現文件:
GPIO 子系統有兩套 API :
1、基於描述符(descriptor-based)
前綴為: gpiod_ 。
參考: Documentation/gpio/consumer.txt
2、老版本介面(legacy)
前綴為: gpio_ 。
參考: Documentation/gpio/gpio-legacy.txt
3、常用API
GPIO 還有很多介面,就不一一列舉了。
RK3399 GPIO 控制器驅動實現文件: drivers/pinctrl/pinctrl-rockchip.c ,涉及主要函數:
所有 GPIO 子系統的 API 最終都會調到 SOC 的 GPIO 控制器驅動函數。
ROCKPi 4A 單板有個40個引腳的擴展口,引用 radxa 圖片,見下圖。
1、進入測試目錄
2、導出GPIO
在使用 GPIO2_A7 前,需要導出該引腳。方法:配置 export 後,會出現 gpio71 節點。
測試時,注意不要使用在程序中已經申請過或配置為其它功能的 GPIO 引腳。
3、配置GPIO方向
設置 GPIO2_A7 的輸入/輸出方向。
in :表示輸入。
out :表示輸出。
active_low :用於中斷配置中高電平或低電平有效。
edge :用於中斷配置中上升沿或下降沿有效。
4、配置GPIO輸出值
在 GPIO 為輸入時,通過 value 查詢 GPIO 的輸入電平(高或低電平)。
在 GPIO 為輸出時,通過 value 配置 GPIO 的輸出電平(高或低電平)。
5、查看GPIO
查看已經導出的 GPIO71 。
6、取消導出
使用完 GPIO2_A7 後,需要進行釋放。方法:配置 unexport 後, gpio71 節點會消失。
4. 用linux 調用內核中的統一I2C驅動 i2c總是 busy,求大神支招
希望能幫到你。
沒這樣用過,以前都是直接對/sys/bus/i2c/devices/0-0050/eeprom操作。
代碼里有兩次寫,一次讀,是在哪一次出錯?
5. 如何用linux 內核提供的i2c bus匯流排進行fan風扇驅動開發
希望能幫到你。 沒這樣用過,以前都是直接對/sys/bus/i2c/devices/0-0050/eeprom操作。 代碼里有兩次寫,一次讀,是在哪一次出錯?
6. linux i2c時鍾rtc該怎樣配置內核
i2c是master和client架構,master就是主控制器這邊的驅動,client就是設備這邊的驅動,master一般都寫好了,你只需要寫相應的client驅動,也就是設備驅動,然後在板級文件裡面注冊一個設備。就可以啦。
7. linux下怎麼直接使用iic介面
利用Linux中IIC設備子系統移植IIC設備驅動
背景描述
IIC匯流排在嵌入式系統中應用十分廣泛,常見的有eeprom,rtc。一般的處理器會包含IIC的控制器,用來完成IIC時序的控制;另外一方面,由於IIC的時序簡單,使用GPIO口來模擬時序也是常見的做法。面對不同的IIC控制器,各種各樣的晶元以及linux源碼,如何更快做好IIC設備驅動。
問題描述
在我們的方案中,我們會用到eeprom,rtc以及tw2865。由於Hi3520的IIC控制器設計有問題,無法正常使用。而IIC控制器的SDA和SCL管腳正好是和兩個GPIO管腳復用的。Hisi將控制gpio來實現IIC的時序,從而對IIC設備進行操作。這種設計方式簡單明了,但使用IIC子系統,可以更方便的移植和維護其他的設備驅動。
問題分析
Hisi對於gpio口,rtc晶元以及tw2865的處理方式如下:將gpio口做成一個模塊化的驅動,該驅動模擬IIC時序,並向外提供一些函數介面,比如:EXPORT_SYMBOL(gpio_i2c_read_tw2815);等。對於具體的rtc晶元,將其注冊為一個misc設備,並利用gpio模塊導出的函數進行rtc晶元的配置操作。
其實對於linux-2.6.24\drivers\i2c目錄下代碼,我們可以加以利用。
Linux的IIC字結構分為三個組成部分:
IIC核心
IIC核心提供了IIC匯流排驅動和設備驅動的注冊、注銷方法,IICalgorithm上層的、與具體適配器無關的代碼以及探測設備、檢測設備地址的上層代碼。
IIC匯流排驅動
IIC匯流排驅動是對IIC硬體體系結構中適配器端的實現。
IIC設備驅動
IIC設備驅動是對IIC硬體體系總設備端的實現。
我們查看下該目錄下的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匯流排的匯流排驅動,而chips中的文件就是常用晶元的驅動,algos中的文件實現了一些匯流排適配器的algorithm,其中就包括我們要用到的i2c-algo-bit.c文件。
我們首先利用i2c-gpio.c和i2c-algo-bit.c做好匯流排驅動。
在i2c-gpio.c中,mole_initi2c_gpio_initplatform_driver_probe(&i2c_gpio_driver,i2c_gpio_probe);
將其注冊為platform虛擬匯流排的驅動。
在staticint __init i2c_gpio_probe(struct platform_device *pdev)中,
定義了如下三個結構體:
structi2c_gpio_platform_data *pdata;//平台相關的gpio的設置
structi2c_algo_bit_data *bit_data;//包含algorithm的具體函數,setor
get SDA和SCL
structi2c_adapter *adap;//適配器
i2c_gpio_probe主要做了下面幾件事:
填充bit_data結構的各個函數指針,關聯到具體的操作SDA和SCl函數。
填充adap結構,adap->algo_data= bit_data;
pdata= pdev->dev.platform_data;
bit_data->data= pdata;
pdev->dev->driver_data= adap;
在i2c-core中注冊適配器類型。
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關聯上。
static const structi2c_algorithm i2c_bit_algo = {
.master_xfer = bit_xfer,
.functionality = bit_func,
};
其中,master_xfer函數指針就是IIC傳輸函數指針。
I2c-algo-bit.c還實現了IIC開始條件,結束條件的模擬,發送位元組,接收位元組以及應答位的處理。
i2c-gpio.c中的i2c_gpio_setsda_val等函數是與具體平台gpio相關的。
修改對應arch-hi3520v100目錄下的gpio.h中的各個函數,這些函數是通過操作寄存器來控制gpio的方向和值。
在對應mach-hi3520v100中的platform-devices.c中添加如下:
static structi2c_gpio_platform_data pdata = {
.sda_pin = 1<<0,
.sda_is_open_drain = 1,
.scl_pin = 1<<1,
.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;
}
通過platform添加devices和driver,使得pdev->dev.platform_data=pdata
綜合上面的過程,我們完成了adapter的注冊,並將用gpio口模擬的algorithm與adapter完成了關聯。
這樣,在rtc-x1205.c中,x1205_attach函數利用i2c核心完成client和adap的關聯。
在x1205_probe函數中填充i2c_client結構體,並調用i2c_attach_client通知iic核心。
接著注冊rtc驅動。
最後我們要讀取時間,就需要構造i2c_msg結構體,如下所示:
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。
8. linux內核中i2c匯流排驅動對所有的i2c設備是否是通用的
i2C匯流排的驅動程序一般針對不同的CPU是不一樣的,所以都位於arch目錄下對應的cpu架構的common文件夾下。
對同一種架構的來看,I2C驅動僅實現底層的通信。故其是通用的。
9. 求教高手,在linux內核中怎麼修改i2c的通信速率為400KHz
1、先查看I2C設備速率。
sudocat/sys/mole/i2c_bcm2708/parameters/baudrate
默認的I2C速度為100KHz,對於多數I2C設備而言100KHz並不算快。
cd/etc/modprobe.d#進入/etc/modprobe.d目錄
sudonanocustom.conf#在該目錄新建一個名為custom.conf文件,並插入以下內容
#optionsi2c_bcm2708baudrate=400000
sudoreboot#重啟系統