设备树驱动API【原创】

  1 #include <linux/init.h>
  2 #include <linux/module.h>
  3 #include <linux/of.h>
  4 #include <linux/of_irq.h>
  5 #include <linux/interrupt.h>
  6 
  7 
  8 #define U32_DATA_LEN 4
  9 
 10 static  int is_good;
 11 static int irqno;
 12 
 13 irqreturn_t key_irq_handler(int irqno, void *devid)
 14 {
 15     printk("------------------------key pressed \n");
 16     return IRQ_HANDLED;
 17 }
 18 
 19 static int __init dt_drv_init(void)
 20 {
 21     /*
 22          test_nod@12345678{
 23                 compatible = "farsight,test";
 24                 reg = <0x12345678 0x24
 25                         0x87654321 0x24>;
 26                 testprop,mytest;
 27                 test_list_string = "red fish","fly fish", "blue fish";
 28                  interrupt-parent = <&gpx1>;
 29                 interrupts = <1 4>;
 30 
 31         };
 32     */
 33 
 34     // 在代码中获取节点的所有信息
 35     //先把节点获取到
 36     struct device_node *np = NULL;
 37     
 38     
 39     np = of_find_node_by_path("/test_nod@12345678");
 40     if(np){
 41         printk("find test node ok\n");
 42         printk("node name = %s\n", np->name);
 43         printk("node full name = %s\n", np->full_name);
 44 
 45     }else{
 46         printk("find test node failed\n");
 47 
 48     }
 49 
 50     //获取到节点中的属性
 51     struct property *prop = NULL;
 52     prop = of_find_property(np, "compatible",NULL);
 53     if(prop)
 54     {
 55         printk("find compatible ok\n");
 56         printk("compatible value = %s\n", prop->value);
 57         printk("compatible name = %s\n", prop->name);
 58     }else{
 59         printk("find compatible failed\n");
 60 
 61     }
 62 
 63     if(of_device_is_compatible(np, "farsight,test"))
 64     {
 65         printk("we have a compatible named farsight,test\n");
 66     }
 67 
 68     //读取到属性中的整数的数组
 69     
 70     u32 regdata[U32_DATA_LEN];
 71     int ret;
 72     
 73     ret = of_property_read_u32_array(np, "reg", regdata, U32_DATA_LEN);
 74     if(!ret)
 75     {
 76         int i;
 77         for(i=0; i<U32_DATA_LEN; i++)
 78             printk("----regdata[%d] = 0x%x\n", i,regdata[i]);
 79         
 80     }else{
 81         printk("get reg data failed\n");
 82     }
 83 
 84     //读取到属性中的字符串的数组
 85     const char *pstr[3];
 86 
 87     int i;
 88     for(i=0; i<3; i++)
 89     {
 90         ret = of_property_read_string_index(np, "test_list_string", i, &pstr[i]);
 91         if(!ret)
 92         {
 93             printk("----pstr[%d] = %s\n", i,pstr[i]);
 94         }else{
 95             printk("get pstr data failed\n");
 96         }
 97     }
 98 
 99     // 属性的值为空,实际可以用于设置标志
100     if(of_find_property(np, "testprop,mytest", NULL))
101     {
102             is_good = 1;
103             printk("is_good = %d\n", is_good);
104     }
105 
106     // 获取到中断的号码
107     irqno = irq_of_parse_and_map(np, 0);
108     printk("-----irqno = %d\n", irqno);
109     
110     //验证中断号码是否有效
111     ret = request_irq(irqno, key_irq_handler, IRQF_TRIGGER_FALLING|IRQF_TRIGGER_RISING, 
112                 "key_irq", NULL);
113     if(ret)
114     {
115         printk("request_irq error\n");
116         return -EBUSY;
117     }
118     
119     
120     return 0;
121 
122 }
123 
124 static void __exit dt_drv_exit(void)
125 {
126     free_irq(irqno,  NULL);
127 
128 }
129 
130 
131 
132 
133 module_init(dt_drv_init);
134 module_exit(dt_drv_exit);
135 MODULE_LICENSE("GPL");

 

posted @ 2017-02-27 15:43  请给我倒杯茶  阅读(964)  评论(0编辑  收藏  举报