• petalinux之简易字符设备驱动开发


    目录

    一、模块工程

    1.创建驱动模块

    2.模块编译

    二、运行


    在传统的Linux驱动开发中,一般是以Linux内核为基础进行模块编译,但是以petalinux创建的工程系统,并没有找到对应的内核源码,不过赛灵思的官网肯定能找得到的。

    这里直接使用 petalinux 工具进行驱动的编写,而不使用在内核源码目录下进行编译,只不过 Petalinux 编译有点慢。

    关于字符设备驱动开发相关内容可参考:字符设备驱动开发   这里是记录petalinux工具的使用。

    一、模块工程

    1.创建驱动模块

    petalinux-create -t modules --name chrdevbase --enable

    注意要在原来搭建Linux系统下创建驱动模块,并且要使能相关petalinux的环境变量

     执行该指令后, 会创建一个内核模块,工具会自动在project-spec/meta-user/recipes-modules下创建chrdevbase设备模块。

     进入chrdevbase目录

     然后进入files,在该目录下所有驱动相关的配置都已经配置好了,我们只需要修改chrdevbase.c文件,完成驱动开发。

    打开chrdevbase.c文件替换成如下内容

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #define CHRDEVBASE_MAJOR 200 // 主设备号
    8. #define CHRDEVBASE_NAME "chrdevbase" //设备名字
    9. static char readbuf[100];
    10. static char writebuf[100];
    11. static char kerneldata[]={"kernel data!"};
    12. static int chrdevbase_open(struct inode* inode,struct file* filp)
    13. {
    14. printk("chrdevbase open!\r\n");
    15. return 0;
    16. }
    17. static ssize_t chrdevbase_read(struct file* filp,char __user *buf,size_t cnt,loff_t* offt)
    18. {
    19. int retvalue=0;
    20. printk("chrdevbase read\r\n");
    21. memcpy(readbuf,kerneldata,sizeof(kerneldata));
    22. retvalue=copy_to_user(buf,readbuf,cnt);
    23. if(retvalue==0)
    24. {
    25. printk("kernel send data ok!\r\n");
    26. }
    27. else
    28. {
    29. printk("kernel send data failed\e\n");
    30. }
    31. return 0;
    32. }
    33. static ssize_t chrdevbase_write(struct file* filp,const char __user *buf,size_t cnt,loff_t* offt)
    34. {
    35. int retvalue=0;
    36. printk("chrdevbase write\r\n");
    37. retvalue=copy_from_user(writebuf,buf,cnt);
    38. if(retvalue==0)
    39. {
    40. printk("kernel recv data:%s\r\n",writebuf);
    41. }
    42. else
    43. {
    44. printk("kernel recv data failed\r\n");
    45. }
    46. return 0;
    47. }
    48. static int chrdevbase_release(struct inode* inode,struct file* filp)
    49. {
    50. printk("chrdevbase release\r\n");
    51. return 0;
    52. }
    53. static struct file_operations chrdevbase_fops={
    54. .owner=THIS_MODULE,
    55. .open=chrdevbase_open,
    56. .read=chrdevbase_read,
    57. .write=chrdevbase_write,
    58. .release=chrdevbase_release,
    59. };
    60. static int __init chrdevbase_init(void)
    61. {
    62. int retvalue=0;
    63. printk("chrdevbase character device init\r\n");
    64. retvalue=register_chrdev(CHRDEVBASE_MAJOR,CHRDEVBASE_NAME,&chrdevbase_fops);
    65. if(retvalue<0)
    66. {
    67. printk("chrdevbase driver register failed\r\n");
    68. }
    69. return 0;
    70. }
    71. static void __exit chrdevbase_exit(void)
    72. {
    73. printk("chrdevbase_exit\r\n");
    74. unregister_chrdev(CHRDEVBASE_MAJOR,CHRDEVBASE_NAME);
    75. }
    76. module_init(chrdevbase_init);
    77. module_exit(chrdevbase_exit);
    78. MODULE_LICENSE("GPL");
    79. MODULE_AUTHOR("mingfei");

     一个简单字符设备驱动就完成了。

    2.模块编译

    modules里面查看是否加载成功

    petalinux-config -c rootfs

     

    可以看到在modules模块下,已经使能了刚刚创建的字符设备驱动模块。保存退出即可。

    编译整个工程

    petalinux-build 

    也可以编译单个模块

    petalinux-build  -c  chrdevbase

    编译成功后,编译完成后,将会生成设备树 DTB 文件、 fsbl 文件、 U-Boot 文件, Linux 内核和根文件系统映像。,生成的映像将位于工程的 images 目录下。

    编译生成的模块在工程目录下/build/tmp/sysroots-components/zynq_generic/chrdevbase/lib/modules/5.4.0-xilinx-v2020.2/extra

     这里使用的编译整个工程,然后生成BOOT.BIN启动文件,因为后面会操作设备树。

    petalinux-package --boot --fsbl --fpga --u-boot --force

    二、运行

    将工程目录下/images/linux下的BOOT.BIN、image.ub、boot.scr拷贝到sd卡中。

    然后在开发板上启动系统,chrdevbase设备驱动模块文件chrdevbase.ko在/lib/modules/5.4.0-xilinx-v2020.2/extra目录下

     加载驱动模块

    depmod

    modprobe   chrdevbase.ko

     模块成功加载后,如图,这句话是在驱动文件中我们写的。

    可以使用lsmod查看加载的模块

     但是,此时在/dev目录下并没有生成相应的设备文件。驱动加载成功需要在/dev 目录下创建一个与之对应的设备节点文件,应用程序就是通过操作这个设备节点文件来完成对具体设备的操作。

    由于驱动文件中并没有写自动生成设备文件代码,这里需要我们手动生成设备文件。

    mknod /dev/chrdevbase c 200 0

     卸载驱动

    rmmod  chrdevbase.ko

     至此,一个简单的字符设备驱动验证完成

     利用petalinux工具进行模块驱动开发流程还是和传统的linux驱动开发一样的,最终编译好的模块存放在根文件系统中。

  • 相关阅读:
    React Native 技术选型分析
    @RestController和@Controller的区别
    图表开发工具LightningChart .NET v12.0正式发布——拥有新图表、新系列类型
    【教3妹学算法-每日1题】非递增顺序的最小子序列
    计算机网络(四)传输层
    线性dp,优化记录,273. 分级
    (四)admin-boot项目之整合日志框架logback
    c盘分小了如何扩大c盘,重新分区扩大c盘
    Docker-compose安装mysql
    分布式NoSQL数据库HBase实践与原理剖析(二)
  • 原文地址:https://blog.csdn.net/qq_53144843/article/details/126919017