導航:首頁 > 操作系統 > linuxi2c

linuxi2c

發布時間:2022-05-06 00:07:43

linux i2c設備驅動移植問題 請大師們賜教啊

linux下驅動代碼分為兩個層次,一個是設備抽象,一個是真實設備
像i2c-dev.c屬於設備抽象,你沒有它,所有char設備的i2c機制都失效
像ad7417.c屬於真實設備,沒有它只是影響ad7417對應的具體設備。

所以你想使用ad7417的對應設備,這兩個文件必須都得有
i2c-dev.c是核心代碼,它的輸出產物是個k-object:
MODULE_DESCRIPTION("I2C /dev entries driver");

至於你的ad7417.c是否有用到i2c-dev.c的代碼,我就不知道了,如果有則需要聯編

❷ 如何在linux下實現一個I2C與SPI的從機驅動

最簡情況下:
I2C:SDA數據線、SCL時鍾線。
SPI:DI輸入線、DO輸出線、CS片選先、CLK時鍾線。
可能不能寫到一個驅動中。

但是好在一般很少用到這么簡單的情況,廠家會對其擴展和改進。

比如 W25Q128FB/W25R128FV 系列快閃記憶體,支持 SPI、Dual SPI、Quad SPI 和 QPI。就拿 Quad SPI 來說,有 6 個引腳:

Quad SPI:D0-D3 輸入輸出線、CS片選先、CLK時鍾線。

其中 輸入為一位串列輸入 D0,輸出為四位串列輸出 D0-D3。(四位仍少於一個位元組,可姑且稱為串列)

Winbond華邦 這么做是為了加快快閃記憶體讀取速度(四位串列相比一位串列提高了四倍)。

因此關鍵在於 要進行怎樣的 IO。至於是否將二者寫到一個驅動看來並不重要。

❸ linux 下的I2C驅動怎麼管理多個相同的設備,設備地址不同

驅動程序可能不需要做太多工作。
三個設備接入系統之後,I2C匯流排會創建3個不同的Node,然後,你的驅動程序就會被載入。最後結果是,每個設備都有自己的驅動程序實例,互相之間不會有干擾和依賴。
參考:http://bbs.csdn.net/topics/390847077

❹ linux中i2c匯流排中從機地址怎麼設置

S3C2410X集成了一個LCD控制器(支持STN和TFT帶有觸摸屏的液晶顯示屏)、SDRAM控制器、3個通道的UART、4個通道的DMA、4個具有PWM功能的計時器和一個內部時鍾、8通道的10位ADC。S3C2410還有很多豐富的外部介面,例如觸摸屏介面、I2C匯流排介面、I2S匯流排介面、兩個USB主機介面、一個USB設備介面、兩個SPI介面、SD介面和MMC卡介面。在時鍾方面S3C2410X也有突出的特點,該晶元集成了一個具有日歷功能的RTC和具有PLL(MPLL和UPLL)的晶元時鍾發生器。MPLL產生主時鍾,能夠使處理器工作頻率最高達到203MHz。這個工作頻率能夠使處理器輕松運行WIN CE、LINUX等操作系統以及進行較為復雜的信息處理。
S3C2410X晶元相關數據:
? 203MHz ARM920T 內核,0.18um工藝,超低功耗,272 pin BGA封裝
? 帶MMU,16KB指令緩存,16KB數據緩存
? 1.8V內核電源,3.3V I/O電壓,兼容1.8,2.5,3.3V內存電壓
? 內含SDRAM控制器
? 117個GPIO,24個外部中斷
? 內置LCD控制器,可接真彩色,大屏幕TFT液晶
? 豐富的外部介面:4通道DMA,3個串口,一個SPI口,一個IIC介面,一個USB device口,一個USB host口
? 8通道10-bit AD,4通道PWM輸出
? 內置RTC,PLL
? 內置SD,MMC,Smart Media等存儲卡介面
? 支持從SmartMedia (Nand Flash)中啟動系統
請採納答案,支持我一下。

❺ linux i2c的設備和驅動是怎樣匹配的

linux下驅動代碼分為兩個層次,一個是設備抽象,一個是真實設備
像i2c-dev.c屬於設備抽象,你沒有它,所有char設備的i2c機制都失效
像ad7417.c屬於真實設備,沒有它只是影響ad7417對應的具體設備。
所以你想使用ad7417的對應設備,這兩個文件必...

❻ linux 怎麼載入i2c驅動

假設手上有一塊從淘寶上買來的開發板,我要在開發板的I2C匯流排上增加一個從設備(如at24c08),那麼我要怎樣寫這個「I2C設備驅動」,讓

應用程序可以訪問at24c08呢?

先來看一個最簡單的i2c設備驅動:
static struct i2c_board_info at24cxx_info = { //所支持的i2c設備的列表
I2C_BOARD_INFO("at24c08", 0x50), //一項代表一個支持的設備,它的名字叫做「at24c08」,器件地址是0x50
};
static struct i2c_client *at24cxx_client;
static int at24cxx_dev_init(void)
{
struct i2c_adapter *i2c_adap; //分配一個適配器的指針
i2c_adap = i2c_get_adapter(0); //調用core層的函數,獲得一個i2c匯流排。這里我們已經知道新增的器件掛接在編號為0的i2c匯流排上
at24cxx_client = i2c_new_device(i2c_adap, &at24cxx_info); // 把i2c適配器和新增的I2C器件關聯起來,這個用了i2c匯流排0,地址是0x50。這就組成了一個客戶端
at24cxx_client i2c_put_adapter(i2c_adap);
return 0;
}
static void at24cxx_dev_exit(void)
{
i2c_unregister_device(at24cxx_client);
}
mole_init(at24cxx_dev_init);
mole_exit(at24cxx_dev_exit);

❼ 求教高手,在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#重啟系統

❽ linux i2c時鍾rtc該怎樣配置內核

i2c是master和client架構,master就是主控制器這邊的驅動,client就是設備這邊的驅動,master一般都寫好了,你只需要寫相應的client驅動,也就是設備驅動,然後在板級文件裡面注冊一個設備。就可以啦。

❾ 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_initi2c_gpio_initplatform_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。

❿ 在linux上怎樣增加一個i2c設備

假設手上有一塊從淘寶上買來的開發板,我要在開發板的I2C匯流排上增加一個從設備(如at24c08),那麼我要怎樣寫這個「I2C設備驅動」,讓

應用程序可以訪問at24c08呢?

先來看一個最簡單的i2c設備驅動:
static struct i2c_board_info at24cxx_info = { //所支持的i2c設備的列表
I2C_BOARD_INFO("at24c08", 0x50), //一項代表一個支持的設備,它的名字叫做「at24c08」,器件地址是0x50
};
static struct i2c_client *at24cxx_client;
static int at24cxx_dev_init(void)
{
struct i2c_adapter *i2c_adap; //分配一個適配器的指針
i2c_adap = i2c_get_adapter(0); //調用core層的函數,獲得一個i2c匯流排。這里我們已經知道新增的器件掛接在編號為0的i2c匯流排上
at24cxx_client = i2c_new_device(i2c_adap, &at24cxx_info); // 把i2c適配器和新增的I2C器件關聯起來,這個用了i2c匯流排0,地址是0x50。這就組成了一個客戶端
at24cxx_client i2c_put_adapter(i2c_adap);
return 0;
}
static void at24cxx_dev_exit(void)
{
i2c_unregister_device(at24cxx_client);
}
mole_init(at24cxx_dev_init);
mole_exit(at24cxx_dev_exit);

從上面的程序可以看到,寫一個i2c設備驅動程序,與寫普通的字元驅動基本一樣。特別之處是它調用了i2c的core層的函數,以獲得對i2c匯流排的控制。因為用的是開發板,板上的與soc晶元(一般來說就是arm的晶元)i2c匯流排驅動一般都做好了,直接調用core層的函數就可以控制soc的i2c模塊了。也就是說,寫i2c設備驅動不需要關注arm內部的i2c模塊的寄存器,我們需要關注的是設備(at24c08)的寄存器以及它的datasheet對時序的要求。

其實,添加i2c設備的方法很靈活。根據Linux的官方文檔《linux-3.4.2\Documentation\i2c\instantiating-devices》,添加i2c設備的方法總結有4種:

1. i2c_register_board_info:根據匯流排編號、設備名字(「at24c08」)、設備地址(0x50)注冊一個字元驅動。這種方法最簡單、最粗暴,最貼近平時在開片機上開發i2c器件的。

2. i2c_new_device:根據i2c匯流排的編號,聲明一個i2c設備:這種方法就是上面例子用的方法。這種方法也簡單,但是需要事先知道器件掛接在哪條匯流排上。對於設備,還實現知道了設備地址0x50,匯流排適配器也支持名字為「at24c08」的設備

3. i2c_new_probed_device:

4.從用戶空間實例化一個器件:這個方法相當智能快速,如下輸入指令,即可增加一個i2c設備,同時增加了對應的設備文件。

# echo eeprom 0x50 > /sys/bus/i2c/devices/i2c-3/new_device

根據英文文檔的標題,添加i2c設備有稱之為「i2c設備的實例化」。

從上述可以知道,在實例化一個i2c設備之前,除了有對應的驅動支持匯流排外(這里是匯流排0),還需要有一個驅動使用了匯流排0發送時序,支持名字為"at24c08"的器件。這個驅動用匯流排驅動的函數,配置了at24c08的寄存器。

閱讀全文

與linuxi2c相關的資料

熱點內容
考駕照怎麼找伺服器 瀏覽:882
阿里雲伺服器如何更換地區 瀏覽:968
手機app調音器怎麼調古箏 瀏覽:501
銳起無盤系統在伺服器上需要設置什麼嗎 瀏覽:17
紅旗計程車app怎麼應聘 瀏覽:978
如何編寫linux程序 瀏覽:870
吉利車解壓 瀏覽:248
java輸入流字元串 瀏覽:341
安卓軟體沒網怎麼回事 瀏覽:785
dvd壓縮碟怎麼導出電腦 瀏覽:274
冒險島什麼伺服器好玩 瀏覽:541
如何在伺服器上做性能測試 瀏覽:793
命令序列錯 瀏覽:259
javaif的條件表達式 瀏覽:576
手機app上傳的照片怎麼找 瀏覽:531
雲伺服器面臨哪些威脅 瀏覽:748
c語言各種編譯特點 瀏覽:177
路由器多種加密方法 瀏覽:604
程序員阻止電腦自動彈出定位 瀏覽:168
如何做伺服器服務商 瀏覽:762