zoukankan      html  css  js  c++  java
  • 设备树驱动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 
    ");
     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
    ");
     42         printk("node name = %s
    ", np->name);
     43         printk("node full name = %s
    ", np->full_name);
     44 
     45     }else{
     46         printk("find test node failed
    ");
     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
    ");
     56         printk("compatible value = %s
    ", prop->value);
     57         printk("compatible name = %s
    ", prop->name);
     58     }else{
     59         printk("find compatible failed
    ");
     60 
     61     }
     62 
     63     if(of_device_is_compatible(np, "farsight,test"))
     64     {
     65         printk("we have a compatible named farsight,test
    ");
     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
    ", i,regdata[i]);
     79         
     80     }else{
     81         printk("get reg data failed
    ");
     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
    ", i,pstr[i]);
     94         }else{
     95             printk("get pstr data failed
    ");
     96         }
     97     }
     98 
     99     // 属性的值为空,实际可以用于设置标志
    100     if(of_find_property(np, "testprop,mytest", NULL))
    101     {
    102             is_good = 1;
    103             printk("is_good = %d
    ", is_good);
    104     }
    105 
    106     // 获取到中断的号码
    107     irqno = irq_of_parse_and_map(np, 0);
    108     printk("-----irqno = %d
    ", 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
    ");
    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");
  • 相关阅读:
    chaos —— 混沌
    《菊与刀》original 的阅读
    《菊与刀》original 的阅读
    十六进制(二进制)编辑器
    十六进制(二进制)编辑器
    Hopfield 神经网络及稳态性的证明
    Hopfield 神经网络及稳态性的证明
    OpenGL(一)绘制圆、五角星、正弦曲线
    NYOJ 8 一种排序(comparator排序)
    oc 第五天(内存管理)
  • 原文地址:https://www.cnblogs.com/zzb-Dream-90Time/p/6474526.html
Copyright © 2011-2022 走看看