日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

3.X内核下设备树–platform设备驱动

發(fā)布時(shí)間:2023/12/10 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 3.X内核下设备树–platform设备驱动 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1。歷史的車輪總是向前,技術(shù)更替。在linus 同學(xué)發(fā)出那句 WFK 后內(nèi)核進(jìn)入了設(shè)備樹時(shí)代(站在驅(qū)動(dòng)工程師角度)。

前幾天我已經(jīng)被mach-imx 中的文件折磨的夜不能眠。我終于在一個(gè)清晨,喝完一杯咖啡后決定放棄蹩腳的傳統(tǒng)device描述方式。

這里我先不討論內(nèi)核實(shí)現(xiàn)流程的源代碼,簡單描述下語法,和我的第一個(gè)test_platform_device

設(shè)備樹文件 arch\arm\boot\dts 在修改dst文件后要make dtbs,

http://www.xuebuyuan.com/2128963.html 這篇文章可以惡補(bǔ)下設(shè)備書的基礎(chǔ)

如圖是一個(gè)完整節(jié)點(diǎn)

Documentation\devicetree\bindings 文件夾中有很多的樣例可以供開發(fā)人員參考

2。 我的測試

我在我的設(shè)備樹中添加如下代碼(這里我把一個(gè)ds18b20做成platform設(shè)備,僅僅為了練習(xí))

my-ds18b20 {compatible = "ds18b20";gpios = <&gpio2 3 1>; //有更改,以這里為準(zhǔn)};

我ds18b20使用的是GPIO2_3 管腳。

這里的gpios = <&gpio2 3 0>; 在 imx6qdl.dtsi 文件中定義

然后執(zhí)行 # make dtbs

生成的dtbs文件在dts文件同一目錄,燒寫 內(nèi)核 和 DTBS 文件

編寫ds18b20的driver 端(為了使結(jié)構(gòu)簡單明了,我屏蔽了其他代碼,留下了骨架)

#include <linux/module.h> #include <linux/ioport.h> #include <linux/netdevice.h> #include <linux/etherdevice.h> #include <linux/interrupt.h> #include <linux/skbuff.h> #include <linux/spinlock.h> #include <linux/crc32.h> #include <linux/mii.h> #include <linux/of.h> #include <linux/of_net.h> #include <linux/ethtool.h> #include <linux/dm9000.h> #include <linux/delay.h> #include <linux/platform_device.h> #include <linux/irq.h> #include <linux/slab.h>#include <asm/delay.h> #include <asm/irq.h> #include <asm/io.h>static int ds18b20_probe(struct platform_device *pdev) {struct resource *addr_res = NULL; /* resources found */printk("probe!!!!!!!!!! \n");addr_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);if (addr_res == NULL) printk("get_re error");return 0; }static int ds18b20_drv_remove(struct platform_device *pdev) {return 0; }static const struct of_device_id ds18b20_of_matches[] = {{ .compatible = "my-ds18b20", }, //和dts文件中名字匹配{ /* sentinel */ } }; MODULE_DEVICE_TABLE(of, ds18b20_of_matches);static struct platform_driver ds18b20_driver = {.driver = {.name = "ds18b20", //可以與dts文件中名字不同.owner = THIS_MODULE,.of_match_table = of_match_ptr(ds18b20_of_matches),},.probe = ds18b20_probe,.remove = ds18b20_drv_remove,};module_platform_driver(ds18b20_driver);MODULE_LICENSE("GPL");

編譯,拷貝,加載模塊

/************************以下為完全測試*************************/


成功獲取到溫度,有個(gè)小bug就是第一獲取時(shí)溫度有問題

以下是完全代碼

#include <linux/module.h> #include <linux/ioport.h> #include <linux/netdevice.h> #include <linux/etherdevice.h> #include <linux/interrupt.h> #include <linux/skbuff.h> #include <linux/spinlock.h> #include <linux/crc32.h> #include <linux/mii.h> #include <linux/of.h> #include <linux/of_gpio.h>#include <linux/of_net.h> #include <linux/ethtool.h> #include <linux/dm9000.h> #include <linux/delay.h> #include <linux/platform_device.h> #include <linux/irq.h> #include <linux/slab.h>#include <asm/delay.h> #include <asm/irq.h> #include <asm/io.h>int ds18_gpio = -1;#define GPIO_DS18B20 ds18_gpio#define DS18B20_IO_UP gpio_set_value(GPIO_DS18B20, 1) #define DS18B20_IO_DOWN gpio_set_value(GPIO_DS18B20, 0)#define DS18B20_OUT gpio_direction_output(GPIO_DS18B20, 1) #define DS18B20_IN gpio_direction_input(GPIO_DS18B20)static void ds18_write(uint16_t data ) {uint8_t i, temp;DS18B20_OUT;for(i=0; i<8; i++){temp = data & 0x01;data = data >> 1;if(temp) //寫1{DS18B20_IO_DOWN;udelay(6); DS18B20_IO_UP;udelay(64); } else{DS18B20_IO_DOWN;udelay(60);DS18B20_IO_UP;udelay(10);}}}static uint8_t ds18_read(void) //讀位 {uint8_t data;DS18B20_OUT;DS18B20_IO_DOWN;udelay(6);DS18B20_IO_UP;DS18B20_IN;udelay(9);if(gpio_get_value(GPIO_DS18B20)==1){data =1;}else{data =0;}udelay(45);return data; }static uint8_t ds18_reads(void){uint8_t i = 0,temp = 0,mydata = 0;for(i=0;i<8;i++){temp = ds18_read();mydata = mydata | (temp<<i); }udelay(2);return mydata;}static uint8_t ds18_reset(void){DS18B20_OUT;DS18B20_IO_DOWN;udelay(300);udelay(300);DS18B20_IO_UP;DS18B20_IN; // 600 usudelay(100);if (gpio_get_value(GPIO_DS18B20) == 0){printk("reset bingo \n");return 0;}printk("reset fail \n");return -1;}static long ds18b20_ctl(struct file * file,unsigned int cmd,unsigned long num) {uint8_t tp_msb = 0,tp_lsb = 0;uint32_t data;if(cmd){ //readprintk("star read \n");if (ds18_reset() != 0)goto error1;ds18_write(0xCC);udelay(1);ds18_write(0x44); //轉(zhuǎn)換溫度//mdelay(100);//ssleep(1);if (ds18_reset() != 0)goto error1;ds18_write(0xCC);udelay(1);ds18_write(0xBE); //讀取溫度tp_lsb= ds18_reads();udelay(1);tp_msb= ds18_reads();data = tp_msb<<8;data = data | tp_lsb;if( data < 0 ) data = (~data+1) * 625; elsedata = data * 625; printk("tmp = %d \n", data);}return 0;error1:printk("read error \n");return -1;}struct file_operations ds18b20_fops = {.unlocked_ioctl= ds18b20_ctl,};struct miscdevice ds18b20_misc={.minor = 200,.name = "misc_ds18b20",.fops = &ds18b20_fops,};static int ds18b20_probe(struct platform_device *pdev) {struct resource *addr_res = NULL; /* resources found */int re = -1;printk("probe!!!!!!!!!! \n");ds18_gpio = of_get_named_gpio(pdev->dev.of_node, "gpios", 0);printk("%d\n", ds18_gpio);re = gpio_request(ds18_gpio, "ds18b20");if (re != 0) return -1;if (ds18_gpio > 0){gpio_direction_output(ds18_gpio, 1);}re = ds18_reset(); //檢測是否存在if (!re){printk("finded ds18b20 \n");misc_register(&ds18b20_misc);return 0;}else{gpio_free(GPIO_DS18B20);printk("no find ds18b20 \n");return -1;}return 0; }static int ds18b20_drv_remove(struct platform_device *pdev) {gpio_free(ds18_gpio);return 0; }static const struct of_device_id ds18b20_of_matches[] = {{ .compatible = "ds18b20", },{ /* sentinel */ } }; MODULE_DEVICE_TABLE(of, ds18b20_of_matches);static struct platform_driver ds18b20_driver = {.driver = {.name = "ds18b20",.owner = THIS_MODULE,.of_match_table = of_match_ptr(ds18b20_of_matches),},.probe = ds18b20_probe,.remove = ds18b20_drv_remove,};module_platform_driver(ds18b20_driver);MODULE_LICENSE("GPL");

總結(jié)

以上是生活随笔為你收集整理的3.X内核下设备树–platform设备驱动的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。