微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > 嵌入式系统设计讨论 > 4.在Yocto框架添加驱动程序验证

4.在Yocto框架添加驱动程序验证

时间:10-02 整理:3721RD 点击:
  Yocto框架接触一段时间以后就会越来越感觉到它的优势。原有layer可以让我们非常方便的利用现有资源,各种模版也可以根据自己的需求任意添加需求,不论是应用程序,还是驱动程序,还是系统组件和驱动模块。
  前面的帖子尝试新添加应用程序和驱动模块,这次我们尝试在现在kernel里面新加一个驱动程序,并读取dts的一些属性设置。
1)源代码和dts相关
  kernel的根目录:warp7_yocto/build/tmp/work-shared/imx7s-warp/kernel-source
  c文件:drivers/char/unflattendts.c

  1. #include <linux/init.h>
  2. #include <linux/module.h>
  3. #include <linux/device.h>
  4. #include <linux/platform_device.h>
  5. #include <linux/sysfs.h>
  6. #include <linux/slab.h>
  7. #include <linux/kernel.h>
  8. #include <linux/kobject.h>
  9. #include <linux/string.h>
  10. #include <linux/of.h>

  11. #include <linux/cdev.h>  
  12. #include <linux/fs.h>  
  13. #include <linux/vmalloc.h>

  14. #define unflattendts_TIP "unflattendts_tip"
  15. int g_nNum = 0;
  16. char unflattendts_string[64] = "unflattendts, unflattendts_show";
  17. int unflattendts_major = 217;  

  18. int unflattendts_open(struct inode *inode, struct file *filep)  
  19. {
  20.         int nNum = 99;
  21.         printk("unflattendts_open nNum=%d g_nNum=%d\n", nNum, g_nNum);
  22.         return 0;  
  23. }  
  24.   
  25. static const struct file_operations unflattendts_fops = {  
  26.     .owner = THIS_MODULE,  
  27.     .open = unflattendts_open,  
  28. };  
  29. static ssize_t show_unf(struct device_driver *driver, char *buf)
  30. {
  31.         if(NULL != buf)
  32.         {
  33.                 /* Newline is not appended on purpose, for convenience of reader programs */
  34.                 snprintf(buf, PAGE_SIZE, "%s\n", unflattendts_string);
  35.                 return strlen(buf);
  36.         }

  37.         return 0;
  38. }

  39. static DRIVER_ATTR(unflattendts, 0444, show_unf, NULL);

  40. static struct attribute *unflattendts_attrs[] = {
  41.         &driver_attr_unflattendts.attr,
  42.         NULL,
  43. };

  44. static struct attribute_group unflattendts_group = {
  45.         .name = "unflattendts",
  46.         .attrs = unflattendts_attrs,
  47. };

  48. static const struct attribute_group *unflattendts_groups[] = {
  49.         &unflattendts_group,
  50.         NULL,
  51. };

  52. static int unflattendts_probe(struct platform_device *pdev)
  53. {
  54.         int nNum;
  55.         int         ret;  
  56.         const char *m_string;
  57.         printk("-0000-unflattendts_probe\n");
  58.         if(NULL == pdev)
  59.         {
  60.                 printk("unflattendts_probe: unflattendts_probe failed, pdev is NULL\n");
  61.                 return 0;
  62.         }

  63.         if(NULL == pdev->dev.of_node)
  64.         {
  65.                 printk( "unflattendts_probe: unflattendts_probe failed, of_node is NULL\n");
  66.                 return 0;
  67.         }
  68.         /* unflattendts_TIP*/
  69.         if(of_property_read_bool(pdev->dev.of_node, unflattendts_TIP))
  70.         {
  71.                 printk( "unflattendts_probe: dtsi<%s> is existing\n", unflattendts_TIP);
  72.         }
  73.         if (of_property_read_u32(pdev->dev.of_node, "linux,code", &nNum))
  74.         {
  75.                 printk(KERN_INFO "=11= nNum=%d\n", nNum);
  76.         }
  77.         else
  78.         {
  79.                 printk(KERN_INFO "=0101= nNum=%d\n", nNum);
  80.         }
  81.         g_nNum = nNum;
  82.         if (of_property_read_string(pdev->dev.of_node, "linux,string", &m_string))
  83.         {
  84.                 strcpy(unflattendts_string, m_string);
  85.                 printk(KERN_INFO "=11= m_string=%s unflattendts_string=%s\n", m_string, unflattendts_string);
  86.         }
  87.         else
  88.         {
  89.                 printk(KERN_INFO "=12= m_string=%s\n", m_string);
  90.         }

  91.         return 0;
  92. }

  93. static struct of_device_id unflattendts_info_match_table[] = {
  94.         { .compatible = "fsl,unflattendts",},
  95.         { },
  96. };

  97. static struct platform_driver unflattendts = {
  98.         .driver = {
  99.                 .name  = "unflattendts",
  100.                 .owner  = THIS_MODULE,
  101.                 .of_match_table = unflattendts_info_match_table,
  102.         },

  103.         .probe = unflattendts_probe,
  104.         .remove = NULL,
  105. };

  106. static int __init unflattendts_init(void)
  107. {
  108.         printk("unflattendts_init\n");
  109.         return platform_driver_register(&unflattendts);
  110. }

  111. static void __exit unflattendts_exit(void)
  112. {
  113.         platform_driver_unregister(&unflattendts);
  114.         printk("unflattendts_exit\n");
  115. }

  116. module_init(unflattendts_init);
  117. module_exit(unflattendts_exit);
  118. MODULE_LICENSE("GPL");

复制代码


  Makefile:driver/char
obj-$(CONFIG_UNFLATTENDTS)   += unflattendts.o
  imx_v7_defconfig:arch/arm/configs
CONFIG_UNFLATTENDTS=y
   dts文件:arch/arm/boot/dts/imx7s-warp.dts

  1. memory {
  2.                 reg = <0x80000000 0x40000000>;
  3.         };
  4.         unflattendts {
  5.                 compatible = "fsl,unflattendts";
  6.                 #address-cells = <3>;
  7.                 #size-cells = <1>;
  8.                 unflattendts_tip;
  9.                 linux,code = <20170111>;
  10.                 linux,string = "NXP fsl";
  11.         };
  12.         gpio-keys {
  13.                 compatible = "gpio-keys";
  14.                 pinctrl-0 = <&pinctrl_gpio>;
  15.                 autorepeat;
  16.                 back {
  17.                         label = "Back";
  18.                         gpios = <&gpio7 1 GPIO_ACTIVE_HIGH>;
  19.                         linux,code = <KEY_BACK>;
  20.                         gpio-key,wakeup;
  21.                         autorepeat;
  22.                 };
  23.         };

复制代码


2)编译

  1. bitbake linux-warp7 -c compile -f

复制代码


3)下载运行
unflattendts_init
-0000-unflattendts_probe
unflattendts_probe: dtsi<unflattendts_tip> is existing
=0101= nNum=20170111
=12= m_string=NXP fsl
后面尝试把开发板自带WIFI使能起来。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top