查看: 3432|回复: 3

pcDuino Linux驱动开发二 -- 最简单的驱动程序框架

[复制链接]
  • TA的每日心情
    奋斗
    2022-9-16 05:52
  • 签到天数: 1368 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2014-8-10 19:22:10 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 tjCFeng 于 2014-8-12 09:44 编辑

    没什么好说的,把驱动程序精简到最小,得到这个框架,以后往这个框架里填东西就行了。
    后面把Makefile格式和测试程序的框架也发出来。

    里面的一些变量命名之类的没有按照代码规范书写,自己看着舒服就行了。

    1. 1.驱动程序框架:xxx.c
    2. #include <linux/init.h>
    3. #include <linux/module.h>
    4. #include <linux/fs.h>
    5. #include <linux/cdev.h>
    6. #include <linux/device.h>
    7. #include <asm/io.h>
    8. #include <asm/uaccess.h>

    9. //用户程序接口部分
    10. int XXX_open(struct inode* n, struct file* f)
    11. {
    12.         printk("Open Finished!\n");        return 0;
    13. }

    14. int XXX_close(struct inode* n, struct file* f)
    15. {
    16.         printk("Close Finished!\n");
    17.         return 0;
    18. }

    19. ssize_t XXX_write(struct file* f, const char __user* buf, size_t len, loff_t* l)
    20. {
    21.         printk("Write Finished!\n");
    22.         return len;
    23. }

    24. ssize_t XXX_read(struct file* f, char __user* buf, size_t len, loff_t* l)
    25. {
    26.         printk("Read Finished!\n");
    27.         return 0;
    28. }


    29. //操作系统接口部分
    30.         #define DEV_NAME        "XXX"
    31.         #define DEV_COUNT        1

    32.         static struct class* pClass;
    33.         int major;
    34.         
    35.         static struct file_operations fops =
    36.         {
    37.                 .owner = THIS_MODULE,
    38.                 .open = XXX_open,
    39.                 .write = XXX_write,
    40.                 .read = XXX_read,
    41.                 .release = XXX_close,
    42.         };


    43. static int __init XXX_init(void)
    44. {
    45.         major = register_chrdev(0, DEV_NAME, &fops);
    46.         pClass = class_create(THIS_MODULE, DEV_NAME);
    47.         if (pClass == NULL)
    48.         {
    49.                 unregister_chrdev(major, DEV_NAME);
    50.                 return -1;
    51.         }
    52.         device_create(pClass, NULL, MKDEV(major, 0),  NULL, DEV_NAME);
    53.         printk("Init Finished!\n");

    54.         return 0;
    55. }

    56. static void __exit XXX_exit(void)
    57. {
    58.         unregister_chrdev(major, DEV_NAME);
    59.         if (pClass)
    60.         {
    61.                 device_destroy(pClass, MKDEV(major, 0));
    62.                 class_destroy(pClass);
    63.         }
    64.         printk("Exit Finished!\n");
    65. }

    66. MODULE_LICENSE("GPL");
    67. MODULE_AUTHOR("LiuYang");
    68. module_init(XXX_init);
    69. module_exit(XXX_exit);
    70. //代码结束
    复制代码
    2.Makefile框架:

    1. ifneq ($(KERNELRELEASE),)

    2. obj-m :=XXX.o

    3. else

    4. KDIR := /usr/src/linux-headers-3.4.29+

    5. all:
    6.         make -C $(KDIR) M=$(PWD) modules
    7. clean:
    8.         make -C $(KDIR) M=$(PWD) clean

    9. endif
    复制代码
    可以正常的编译,添加和卸载驱动,并且用户程序可以调用
    insmod XXX.ko
    rmmod XXX
    dmesg | tail -10

    3.用户程序框架:

    1. int main(int argc, char **argv)
    2. {
    3.         int f;
    4.         unsigned char Buf[2];

    5.         f = open("/dev/XXX", O_RDWR);
    6.         write(f, &Buf, 2);
    7.         read(f, &Buf, 2);
    8.         close(f);

    9.         return 0;
    10. }
    复制代码
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2016-8-15 09:30
  • 签到天数: 162 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2014-8-11 21:38:19 | 显示全部楼层
    多谢楼主分享!!!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2016-8-15 09:28
  • 签到天数: 222 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2014-8-12 22:00:41 | 显示全部楼层
    期待更多大作!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2022-9-16 05:52
  • 签到天数: 1368 天

    连续签到: 1 天

    [LV.10]以坛为家III

     楼主| 发表于 2014-8-13 07:49:44 | 显示全部楼层
    感谢楼上两位,学习中
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-4-25 08:22 , Processed in 0.137507 second(s), 21 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.