linuxi2c
㈠ linux 應用可以直接使用/dev/i2c-0 讀寫i2c 設備嗎
#include <sys/ioctl.h>
#include <fcntl.h>
#include <linux/i2c-dev.h>
#include <linux/i2c.h>
#define CHIP "/dev/i2c-1"
#define CHIP_ADDR 0x50
int main()
{
printf("hello, this is i2c tester\n");
int fd = open(CHIP, O_RDWR);
if (fd < 0)
{
printf("open "CHIP"failed\n");
goto exit;
}
if (ioctl(fd, I2C_SLAVE_FORCE, CHIP_ADDR) < 0)
{ /* 設置晶元地址 */
printf("oictl:set slave address failed\n");
goto close;
}
unsigned char rddata;
unsigned char rdaddr[2] = {0, 0}; /* 將要讀取的數據在晶元中的偏移量 */
unsigned char wrbuf[3] = {0, 0, 0x3c}; /* 要寫的數據,頭兩位元組為偏移量 */
printf("input a char you want to write to E2PROM\n");
wrbuf[2] = getchar();
printf("write return:%d, write data:%x\n", write(fd, wrbuf, 3), wrbuf[2]);
sleep(1);
printf("write address return: %d\n",write(fd, rdaddr, 2)); /* 讀取之前首先設置讀取的偏移量 */
printf("read data return:%d\n", read(fd, &rddata, 1));
printf("rddata: %c\n", rddata);
close:
close(fd);
exit:
return 0;
}
㈡ 關於linux的I2C驅動的to_i2c_client()問題
to_i2c_client(dev) 這個函數返回值是一個指針,這個指針是個struct i2c_client 類型的指針,這個指針指向塊內存,內存中存放著 to_i2c_client(dev)這個函數產生的數據。。
㈢ linux i2c時鍾rtc該怎樣配置內核
i2c是master和client架構,master就是主控制器這邊的驅動,client就是設備這邊的驅動,master一般都寫好了,你只需要寫相應的client驅動,也就是設備驅動,然後在板級文件裡面注冊一個設備。就可以啦。
㈣ linux i2c驅動怎麼寫
1、使用linux系統i2c體系,包括設備驅動,匯流排驅動,一般匯流排驅動已經寫好了,需要你寫一個設備驅動
2、使用gpio模擬i2c協議
3、望採納
4、謝謝
㈤ 在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的寄存器。
㈥ 跪求linux中 i2c的 程序代碼
會51嗎?會C嗎?如果不會的話就有點難度哦!會的話就學起來稍微輕松一點,只是輕松一點。學ARM肯定要先看匯編指令的,等指令看完了呢,就先看看別人寫的匯編程序,能看懂就行了。然後了解ARM運行次序,首先不要過多的琢磨啟動代碼,只要理解啟動代碼是幹些什麼事就行,當然像有些ARM處理器是固化了啟動代碼的。先借用官方的或別人的啟動代碼用著,然後自己用C編寫程序寫些簡單的程序像跑馬燈啊、串口啊、I2C、SPI、AD、TFT、攝像頭啊什麼的,不過攝像頭和TFT稍微難理解一點。先弄簡單的,就當單片機一樣用,這階段主要是熟悉內部寄存器及其使用的。等資源懂了熟悉了,你再返過來看啟動代碼,那你就會豁然開朗。當然裸奔並不是ARM的精華部分,如果只是裸奔的話那麼ARM就只能算個增強型單片機了,ARM的核心是操作系統的移植,及操作系統下應用程序、驅動程序的編寫。WINDOWS CE的話容易入門點,但目前學LINUX的比較多,但難學一點,因為是免費開源的嘛!當然現在還有很多操作系統的,建議先弄懂一個。再弄其它。(註:這只是我個人學習ARM的見解,不一定適合每個人,希望對你有所幫助)
㈦ 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 頻率怎麼修改
to_i2c_client(dev) 這個函數返回值是一個指針,這個指針是個struct i2c_client 類型的指針,這個指針指向塊內存,內存中存放著 to_i2c_client(dev)這個函數產生的數據。。