新版基於ARM的Linux都會基於Device Tree去代替以前的device驅動。更加多的瞭解Device Tree能夠訪問寶哥的Bolg:ARM Linux 3.x的設備樹(Device Tree)node
這裏只是舉例在arch/arm/boot/dts中添加dtsi文件並在驅動中讀取dtsi中節點信息,並將節點信息寫入sys文件系統,至於怎麼建立、讀寫sys文件能夠參考: linux sysfs下建立文件linux
添加的dtsi文件能夠基於你所用的手機或者開發板肯定放入什麼位置。dts總目錄:arch/arm/boot/dtsapp
例中dtsi所放位置位於: spa
xm-test.dtsi:code
/ { xm-test { compatible = "xiaomi,xm-test"; xm_test_tip; }; };
其中xm-test、」xiaomi,xm-test」必須具備惟一性。orm
注:須要在audio.dtsi文件中添加#include 「xm-test.dtsi」具體在哪一個文件下添加include根據實際狀況而定。圖片
#include <linux/init.h> #include <linux/module.h> #include <linux/device.h> #include <linux/platform_device.h> #include <linux/sysfs.h> #include <linux/slab.h> #include <linux/kernel.h> #include <linux/kobject.h> #include <linux/string.h> #include <linux/of.h> #define HW_TEST "xm_test_tip" #define i2c_info "xm_test, i2c_show" static ssize_t show(struct device_driver *driver, char *buf) { if(NULL != buf) { /* Newline is not appended on purpose, for convenience of reader programs */ snprintf(buf, PAGE_SIZE, "%s\n", i2c_info); return strlen(buf); } return 0; } DRIVER_ATTR(i2c_test, 0444, show, NULL); static struct attribute *audio_attrs[] = { &driver_attr_i2c_test.attr, NULL, }; static struct attribute_group audio_group = { .name ="xm_test", .attrs = audio_attrs, }; static const struct attribute_group *groups[] = { &audio_group, NULL, }; static int xm_test_probe(struct platform_device *pdev) { if(NULL == pdev) { printk( "xiaomi_test: xm_test_probe failed, pdev is NULL\n"); return 0; } if(NULL == pdev->dev.of_node) { printk( "xiaomi_test: xm_test_probe failed, of_node is NULL\n"); return 0; } /* 存在 xm_test_tip 就會在手機/開發板啓動的時候打印出來 */ if(of_property_read_bool(pdev->dev.of_node, HW_TEST)) { printk( "xm_test: %s is existing\n", HW_TEST); } printk("============== hanshubo ================\n"); return 0; } /* .compatible的信息要與dtsi中的compatible一致 */ static struct of_device_id audio_info_match_table[] = { { .compatible = "xiaomi,xm-test",}, { }, }; static struct platform_driver xm_test = { // device_driver .driver = { /* 這裏的name不須要跟dtsi的節點xm-test一致 */ .name = "xm-test", .of_match_table = audio_info_match_table, .owner = THIS_MODULE, .groups = groups, }, .probe = xm_test_probe, .remove = NULL, }; static int __init audio_info_init(void) { return platform_driver_register(&xm_test); } static void __exit audio_info_exit(void) { platform_driver_unregister(&xm_test); } module_init(audio_info_init); module_exit(audio_info_exit); MODULE_LICENSE("GPL");
在sys/bus/platform/drivers/xm_test中會找到文件i2c_test文件:ip
# cat i2c_test # xm_test, i2c_show
OK,搞定了。開發
注:當使用設備樹註冊設備時,設備節點名稱「xm-test」沒必要和platform_driver.driver.name 保持一致。rem
也就是說:總線不會經過此兩項,將設備和驅動進行匹配