1.Linux主機驅動和外設驅動分離思想
外設驅動→API→主機驅動→板機邏輯--具體的i2c設備(camera,ts,eeprom等等)
2.主機驅動
Linux應用工程師:屏蔽了驅動和硬件
Linux驅動工程師:屏蔽硬件,提供標準的主機驅動。驅動工程師需要完成“外設驅動”
內核函數接口:(API)。主機驅動提供給外設驅動的函數接口
注冊i2c設備:i2c_board_info
驅動注冊和卸載函數以及結構體:i2c_del_driver/i2c_add_driver, i2c_driver
讀寫函數和結構體:i2c_transfer, i2c_msg
這些函數放之四海之內皆準
3.外設驅動
攝像頭以及聲卡中i2c用來配置外部設備(聲卡和攝像頭)→地址和配置的內容都不一樣!
4.板級邏輯
描述主機和外部設備是怎么連接的
5.設備-i2c設備注冊以及設備注冊之后的查詢方法
查詢i2c設備地址:ls /sys/bus/i2c/devices/
怎么和原理圖以及外部設備對應:3-0038→I2C_3_SCL(addr:datasheet中查0x38)
查詢i2c設備名稱:cat /sys/bus/i2c/devices/3-0038/name
menuconfig中去掉觸摸的驅動
Device Drivers --->
Input device support --->
Touchscreens --->
FT5X0X based touchscreens(去掉)
添加i2c設備:i2c_devs3[]中添加
{
I2C_BOARD_INFO("i2c_test", 0x70>>1),
},
cat /sys/bus/i2c/devices/3-0038/name結果是i2c_test
6.驅動-i2c驅動注冊和卸載
i2c設備初始化完成-進入probe函數
i2c_del_driver/i2c_add_driver, i2c_driver
module_init和late_initcall:前面的優先加載,后面的延遲加載
驅動代碼:
i2c.c
#include #include #include #include #include #include #include #include #include #include #include #include #include #include #define I2C_TEST_NAME "i2c_test" static int i2c_test_probe(struct i2c_client *client, const struct i2c_device_id *id) { printk("==%s: n", __FUNCTION__); return 0; } static int __devexit i2c_test_remove(struct i2c_client *client) { i2c_set_clientdata(client, NULL); //設置client為NULL printk("==%s: n", __FUNCTION__); return 0; } static const struct i2c_device_id i2c_test_id[] = { { "i2c_test", 0 }, { } }; static struct i2c_driver i2c_test_driver = { .probe = i2c_test_probe, .remove = __devexit_p(i2c_test_remove), .id_table = i2c_test_id, .driver = { .name = I2C_TEST_NAME, .owner = THIS_MODULE, }, }; static void i2c_io_init() { int ret; ret = gpio_request(EXYNOS4_GPL0(2), "TP1_EN"); if(ret) { printk(KERN_ERR "failed to request TP1_EN for I2C controln"); } gpio_direction_output(EXYNOS4_GPL0(2), 1); s3c_gpio_cfgpin(EXYNOS4_GPL0(2), S3C_GPIO_OUTPUT); gpio_free(EXYNOS4_GPL0(2)); mdelay(5); ret = gpio_request(EXYNOS4_GPX0(3), "GPX0_3"); if(ret) { gpio_free(EXYNOS4_GPX0(3)); ret = gpio_request(EXYNOS4_GPX0(3), "GPX0_3"); if(ret) { printk("i2c_io_test: Fialed to request GPX0_3 n"); } } gpio_direction_output(EXYNOS4_GPX0(3), 0); mdelay(200); gpio_direction_output(EXYNOS4_GPX0(3), 1); s3c_gpio_cfgpin(EXYNOS4_GPX0(3), S3C_GPIO_OUTPUT); gpio_free(EXYNOS4_GPX0(3)); msleep(300); } static int __init i2c_test_init(void) { printk("==%s: n", __FUNCTION__); i2c_io_init(); printk("==%s: n", __FUNCTION__); return i2c_add_driver(&i2c_test_driver); } static void __exit i2c_test_exit(void) { printk("==%s: n", __FUNCTION__); i2c_del_driver(&i2c_test_driver); } late_initcall(i2c_test_init); module_exit(i2c_test_exit); MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("TSI2CTEST"); MODULE_AUTHOR("iTOP"); Makefile: TARGET_NAME = i2c #APP_NAME = app_pollkey obj-m += $(TARGET_NAME).o KDIR := /home/topeet/chen/kernel-3.0/iTop4412_Kernel_3.0 PWD ?= $(shell pwd) all: make -C $(KDIR) M=$(PWD) modules #app:$(APP_NAME) # arm-none-linux-gnueabi-gcc $(APP_NAME).c -o $(APP_NAME) -static clean: rm -rf *.o *.ko *.mod.c *.symvers *.order .$(TARGET_NAME)* $(APP_NAME) 測試結果: [root@iTOP-4412]# insmod i2c.ko [ 381.451187] ==i2c_test_init: [ 382.020037] ==i2c_test_init: [ 382.021601] ==i2c_test_probe: [root@iTOP-4412]# rmmod i2c [ 385.294465] ==i2c_test_exit: [ 385.296008] ==i2c_test_remove: 7.驅動-i2c數據的傳輸(9.7寸或者7寸屏幕) i2c_transfer, i2c_msg struct i2c_msg { __u16 addr; /* slave address */ __u16 flags; #define I2C_M_TEN 0x0010 /* this is a ten bit chip address */ #define I2C_M_RD 0x0001 /* read data, from slave to master */ #define I2C_M_NOSTART 0x4000 /* if I2C_FUNC_PROTOCOL_MANGLING */ #define I2C_M_REV_DIR_ADDR 0x2000 /* if I2C_FUNC_PROTOCOL_MANGLING */ #define I2C_M_IGNORE_NAK 0x1000 /* if I2C_FUNC_PROTOCOL_MANGLING */ #define I2C_M_NO_RD_ACK 0x0800 /* if I2C_FUNC_PROTOCOL_MANGLING */ #define I2C_M_RECV_LEN 0x0400 /* length will be first received byte */ __u16 len; /* msg length */ __u8 *buf; /* pointer to msg data */ }; int i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num); 參數1:probe傳進的client里的adapter 代碼: i2c_test_read_9x7_7.c #include #include #include #include #include #include #include #include #ifdef CONFIG_HAS_EARLYSUSPEND #include #endif #include #include #include #include static int i2c_tes_read_reg(struct i2c_client *client,u8 addr, u8 *pdata) { u8 buf1[4] = { 0 }; u8 buf2[4] = { 0 }; struct i2c_msg msgs[] = { { .addr = client->addr, //0x38 .flags = 0, //寫 .len = 1, //要寫的數據的長度 .buf = buf1, }, { .addr = client->addr, .flags = I2C_M_RD, .len = 1, .buf = buf2, }, }; int ret; buf1[0] = addr; ret = i2c_transfer(client->adapter, msgs, 2); if (ret < 0) { pr_err("read reg (0x%02x) error, %dn", addr, ret); } else { *pdata = buf2[0]; } return ret; } static int i2c_tes_read_fw_reg(struct i2c_client *client,unsigned char *val) { int ret; *val = 0xff; ret = i2c_tes_read_reg(client,0xa6, val); printk("ts reg 0xa6 val is %dn",*val); return ret; } static int i2c_test_probe(struct i2c_client *client, const struct i2c_device_id *id) { unsigned char val; printk("==%s:n", __FUNCTION__); i2c_tes_read_fw_reg(client,&val); return 0; } static int __devexit i2c_test_remove(struct i2c_client *client) { i2c_set_clientdata(client, NULL); printk("==%s:n", __FUNCTION__); return 0; } static const struct i2c_device_id i2c_test_id[] = { { "i2c_test", 0 }, { } }; static struct i2c_driver i2c_test_driver = { .probe = i2c_test_probe, .remove = __devexit_p(i2c_test_remove), .id_table = i2c_test_id, .driver = { .name = "i2c_test", .owner = THIS_MODULE,
上一篇:4412 SPI驅動
下一篇:4412 按鍵和中斷
推薦閱讀
史海拾趣
多年來,昆泰始終秉持著創新的理念,不斷推動其在CRO領域的技術突破和業務創新。通過與全球各地的藥企、科研機構合作,昆泰在藥物研發、臨床試驗等領域取得了多項重要成果。展望未來,昆泰將繼續堅持創新驅動的發展戰略,為全球醫藥行業的發展做出更大的貢獻。
隨著技術的成熟和市場的擴大,因美納開始積極拓展全球市場。公司通過與全球各地的經銷商建立合作關系,將產品銷往世界各地。同時,因美納還在多個國家和地區設立了研發中心和生產基地,以便更好地滿足當地市場的需求。這種全球化戰略不僅為公司帶來了更多的市場機會,也提高了公司的國際影響力。
(注意:由于篇幅限制,此處僅提供三個故事的梗概,每個故事的實際字數可能稍少于500字。同時,由于"ELINA INDEK"并非真實存在的公司,因此以下故事均基于因美納公司的發展情況進行編寫。)
在江蘇揚州,一家名為鋒鳴電子的公司于2008年成立,起初專注于電子元器件的代工生產。面對激烈的市場競爭,公司創始人李偉決定走技術創新之路。2012年,鋒鳴電子成功研發出新一代高靈敏度蜂鳴器,該產品在噪音控制和響應速度上實現了顯著突破,迅速獲得了國內外市場的認可。此后,公司不斷加大研發投入,逐步拓展產品線,成為電子蜂鳴器領域的佼佼者。
在國內市場取得一定成功后,ETL開始積極拓展國際市場。公司參加了多個國際電子展會,與全球各地的客戶和合作伙伴建立了廣泛的聯系。同時,ETL還通過與國際知名企業的合作,不斷提升自身的技術水平和產品質量。這些努力使得ETL的產品逐漸走向國際市場,為公司的發展注入了新的動力。
面對日益激烈的國際競爭,Eastron Corp決定走全球化發展的道路。公司先后在亞洲、歐洲和北美等地設立了研發中心和生產基地,通過本地化生產和研發,快速響應市場需求。同時,Eastron還積極尋求與國際知名企業的合作,共同開發新技術和產品,提升了公司的國際競爭力。
APTA Group Inc深知,單打獨斗在競爭激烈的電子行業中難以長久立足。因此,公司積極尋求與其他企業的戰略合作。通過與知名電子產品制造商的合作,APTA得以將其技術應用于更廣泛的領域,同時也借助合作伙伴的市場渠道,提高了品牌知名度和市場占有率。這種互利共贏的合作模式,為APTA的快速發展提供了有力支撐。
請教大家,有沒有遇到類似問題的。 一起解決下; 原來DSP2812外圍的電路 電源管理芯片一直使用:TPS75701/TPS75718 FPGA一直使用:XC2S200 DA轉換一直用的DAC7625; 現在以上芯片都面臨難買和即將停產的問題; 請大家幫助一起找下替代產品?!? 查看全部問答∨ |
|
原文: 常常有學生問我,“老師,這個方法真的有用么?”在相當長一段時間里,我對 這樣的問題極為不耐煩,總是皺著眉頭的同時盡量顯得心平氣和地說“那——你 覺得呢?”學生通常都是愣了一下,轉身走掉——估計是帶著失望呢。我幾乎都能感覺 ...… 查看全部問答∨ |
|
為了更好的了解每個模塊的耗電量,我精簡了板子,現在我的板子上只有5V轉3.3v的芯片,+ 1片 s3c2440 + 4片sdram + 1片nandflash ;測試出來系統進入睡眠后5v條件下電流竟然為33mA,我使用ce5.0,睡眠喚醒都能正 ...… 查看全部問答∨ |
|
這個學期有了STM32開發板.一學期時間.它的外設基本摸了一遍.和天天看書混日子比起來感覺真的充實了許多.現在打算看一看嵌入式.正好手頭有stm32f103的板子.想試試看吧以前看過一點邵貝貝教授的書.大家都說好.可能我沒有看過別的沒有比較吧,只是感覺 ...… 查看全部問答∨ |