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

作者: tjcfeng
上传时间为: 2014-11-30 11:11 PM
2014-11-30
阅读:

没什么好说的,把驱动程序精简到最小,得到这个框架,以后往这个框架里填东西就行了。

后面把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. static struct file_operations fops =
  35. {
  36. .owner = THIS_MODULE,
  37. .open = XXX_open,
  38. .write = XXX_write,
  39. .read = XXX_read,
  40. .release = XXX_close,
  41. };
  42. static int __init XXX_init(void)
  43. {
  44. major = register_chrdev(0, DEV_NAME, &fops);
  45. pClass = class_create(THIS_MODULE, DEV_NAME);
  46. if (pClass == NULL)
  47. {
  48. unregister_chrdev(major, DEV_NAME);
  49. return -1;
  50. }
  51. device_create(pClass, NULL, MKDEV(major, 0), NULL, DEV_NAME);
  52. printk("Init Finished!\n");
  53. return 0;
  54. }
  55. static void __exit XXX_exit(void)
  56. {
  57. unregister_chrdev(major, DEV_NAME);
  58. if (pClass)
  59. {
  60. device_destroy(pClass, MKDEV(major, 0));
  61. class_destroy(pClass);
  62. }
  63. printk("Exit Finished!\n");
  64. }
  65. MODULE_LICENSE("GPL");
  66. MODULE_AUTHOR("LiuYang");
  67. module_init(XXX_init);
  68. module_exit(XXX_exit);
  69. //代码结束

复制代码

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. }
全部评论 ()
条评论
写评论

创建讨论帖子

登录 后参与评论
系统提示