S3C2440_GPB7的小驱动

2024-04-29 08:53:23

已经很久没写过驱动了,今天突然说要控制一个LED灯,闲来无事便自己写了一个,权当复习,闲话少说直接代码......

驱动代码(gpg7.c):

  1. #include <linux/module.h>
  2. #include <linux/kernel.h>
  3. #include <linux/fs.h>
  4. #include <linux/init.h>
  5. #include <linux/delay.h>
  6. #include <asm/irq.h>
  7. #include <linux/device.h>
  8. #include <asm/uaccess.h>
  9. #include <linux/ioport.h>
  10. #include <asm/io.h>
  11. #define GPB_ON  1
  12. #define GPB_OFF 0
  13. static unsigned int oam_major=0;
  14. static struct class *oam_class =NULL;
  15. static volatile unsigned long   *gpfcon;
  16. static volatile unsigned long   *gpfdat;
  17. /*1. 实现对硬件的操作方法*/
  18. static int oam_open(struct inode *inode, struct file *file)
  19. {
  20. /*初始化硬件*/
  21. /*将GPB7设置为输出管脚*/
  22. *gpfcon &= ~(0x3<<14);
  23. *gpfcon |= (0x1<<14);
  24. return 0;
  25. }
  26. ssize_t oam_read(struct file *file, char __user *buf, size_t size, loff_t *ppos)
  27. {
  28. //TODO
  29. return 0;
  30. }
  31. static ssize_t oam_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)
  32. {
  33. char val;
  34. int ret;
  35. /*获取用户空间传入的值*/
  36. ret =copy_from_user(&val,buf,1);
  37. if(!val)
  38. {
  39. *gpfdat |= (0x1 << 7);
  40. }
  41. else
  42. {
  43. *gpfdat &= ~(0x1 << 7);
  44. }
  45. return 0;
  46. }
  47. static int oam_ioctl(struct inode *inode, struct file *file, unsigned int cmd,unsigned long arg)
  48. {
  49. switch(cmd)
  50. {
  51. case GPB_OFF:
  52. *gpfdat |= (0x1 << 7);
  53. break;
  54. case GPB_ON:
  55. *gpfdat &= ~(0x1 << 7);
  56. break;
  57. default:break;
  58. }
  59. return 0;
  60. }
  61. /*2. 构建file_operations结构体*/
  62. static struct file_operations oam_fops={
  63. .owner  = THIS_MODULE,
  64. .open   = oam_open,
  65. .write  = oam_write,
  66. .read   = oam_read,
  67. .ioctl  = oam_ioctl,
  68. };
  69. /*3. 实现入口函数*/
  70. static int __init oam_init(void)
  71. {
  72. /*1.注册*/
  73. oam_major =register_chrdev(0,"gpb7",&oam_fops);
  74. /*2. 构建设备节点*/
  75. oam_class =class_create(THIS_MODULE,"gpb7_class");
  76. device_create(oam_class,NULL,MKDEV(oam_major,0),NULL,"gpb7");
  77. /*3.将物理地址映射为虚拟地址*/
  78. gpfcon =ioremap(0x56000010,4096);
  79. gpfdat =gpfcon +1;
  80. return 0;
  81. }
  82. /*4.实现出口函数*/
  83. static void __exit oam_exit(void )
  84. {
  85. unregister_chrdev(oam_major,"gpb7");
  86. class_destroy(oam_class);
  87. device_destroy(oam_class,MKDEV(oam_major,0));
  88. iounmap(gpfcon);
  89. }
  90. module_init(oam_init);
  91. module_exit(oam_exit);
  92. MODULE_LICENSE("GPL");

测试代码(gpg7_test.c):

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <sys/types.h>
  4. #include <sys/stat.h>
  5. #include <fcntl.h>
  6. #include <sys/ioctl.h>
  7. #define GPB_ON  1
  8. #define GPB_OFF 0
  9. void print_usage(char *str)
  10. {
  11. printf("please input follow this!\n");
  12. printf("%s <dev> <on/off> \n",str);
  13. }
  14. int main(int argc, char **argv)
  15. {
  16. int fd = 0;
  17. //char buf[1];
  18. int cmd = 0;
  19. if(argc!=3&&argc!=2)
  20. {
  21. print_usage(argv[0]);
  22. return -1;
  23. }
  24. fd =open(argv[1], O_RDWR);
  25. if(fd <0)
  26. {
  27. printf("cannot open the dev!\n");
  28. return -1;
  29. }
  30. if(strcmp(argv[2],"on")==0)
  31. {
  32. cmd=GPB_ON;
  33. }
  34. else if(strcmp(argv[2],"off")==0)
  35. {
  36. cmd=GPB_OFF;
  37. }
  38. //write(fd, buf, 1);
  39. ioctl(fd,cmd,NULL);
  40. return 0;
  41. }

Makefile:

  1. all:
  2. make -C /home/farsight/anyk/s3c2440/kernal/linux-2.6.30.4 M=`pwd` modules
  3. clean:
  4. make -C /home/farsight/anyk/s3c2440/kernal/linux-2.6.30.4 M=`pwd` clean
  5. obj-m += gpb7.o

相对而言,字符设备还是挺简单的。

转载于:https://blog.51cto.com/embedjee/950625

S3C2440_GPB7的小驱动相关推荐

  1. 我的第一个可用的Windows驱动完成了

    看到了一些希望,就值得我继续执着下去. 虽然是很简单的一个小驱动,但是它包含了我学编程两年来的憧憬与努力... 在2011年5月份,我就想学驱动,但是多次的失败,让我很不耐烦,所以暂时搁置了.... ...

  2. 服务器pci数据捕获和信号处理 感叹号,PCI数据捕获和信号处理控制器win7驱动

    这是PCI数据捕获和信号处理控制器win7驱动下载,有些电脑在安装了系统后会在设备管理器中出现PCI 数据捕获和信号处理控制器黄色感叹号提示,此时需要安装"Intel Turbo Boost ...

  3. Windows驱动开发书籍简介

    分享到 一键分享 QQ空间 新浪微博 百度搜藏 人人网 腾讯微博 百度相册 开心网 腾讯朋友 百度贴吧 豆瓣网 搜狐微博 百度新首页 QQ好友 和讯微博 更多... 百度分享 首页 我的主页 相册 广 ...

  4. beast软件linux用法,杂项类设置 - 黑苹果驱动高手篇 MultiBeast用法进阶_Linux教程_Linux公社-Linux系统门户网站...

    杂项类设置 Miscellaneous即杂项设置.主要是针对没有DSDT文件的黑苹果,提供必要的增强硬件支持和一些比较杂的小驱动,比如USB 3.0驱动.如果使用EasyBeast 或用DSDT文件安 ...

  5. c语言windows驱动编程入门,Windows驱动开发技术详解 PDF扫描版[175MB]

    Windows驱动开发技术详解由浅入深.循序渐进地介绍了windows驱动程序的开发方法与调试技巧.本书共分23章,内容涵盖了windows操作系统的基本原理.nt驱动程序与wdm驱动程序的构造.驱动 ...

  6. Centos7 安装GPU驱动(rpm包方式安装) 亲测,出坑 NVIDIA-SMI has failed because it couldn’t communicate...

    删除驱动 查看安装的nvidia模块命令 rpm -qa|grep -i nvid|sort 删除找到的模块 yum remove kmod-nvidia-* 一.查看支持CUDA的GPU列表 :ls ...

  7. Windows摄像头驱动研究(一)

    Windows 驱动基础系列,转载请标明出处:http://blog.csdn.net/ikerpeng/article/details/38865317 摄像头驱动的主要目的是通过通过硬件捕捉视频信 ...

  8. sudami和achillis对初学者的建议

    sudami对初学者的一点建议 1. 若对Windows底层开发没有兴趣,不建议继续深究, 若有些兴趣可以继续. 2. 先广泛打基础,比如C/ASM/C++/MFC,再学习Windows核心编程,对R ...

  9. Design Compiler指南——设计综合过程

    在前面一章介绍完施加约束之后,接下来要做的工作就是将设计进行综合编译(compile),本文我们将主要讨论综合编译的过程.主要分为这样几个部分: 优化的三个阶段及其特点 编译的策略 编译层次化的设计 ...

最新文章

  1. 深度学习笔记第一门课第一周:深度学习引言
  2. python自关联_Django之Mode的外键自关联和引用未定义的Model方法
  3. mysql修改忘记了root密码忘记了,mysql忘记root密码后,重新设置、修改root密码
  4. 022-红黑树(三)
  5. 高度平衡的二叉搜索树基础概念与经典题目(Leetcode题解-Python语言)
  6. c语言中锁的作用,C语言中的多线程死锁
  7. Google和微软哪个更可怕?
  8. 二 Djano模型层之模型字段选项
  9. android 制作windows启动盘,安卓手机制作u盘启动盘微软win7系统地址
  10. hive表中加载数据
  11. 嵌入式Linux开发笔记(韦东山2)
  12. Ruby编程语言面试题库和答案(语法、代码)
  13. CSDN博客微信登录竟然强制扫码关注登录(又来了)
  14. 只要你懂得人性,就不怕没钱赚!
  15. SolidPlant材料清单
  16. Vulnhub-Tr0ll
  17. TU-ctf-2016 pwn woO 分析记录
  18. WIN10 Redis安装与使用
  19. 计算机自考本科英语二可以用什么代替,自考英语二用什么可以代替免考
  20. 用树莓派搭建家庭NAS下载机

热门文章

  1. java语言程序设计教程第三版答案,看完跪了
  2. 送4G金士顿U盘了,先到先得
  3. C++核心准则SF.7:不要在头文件中的全局作用域中使用using namespace指令
  4. KendoReact R2 2022轻松定制的主题生成器工具
  5. Win10 go install 命令 打包 Go项目
  6. matlab读取hdf和hdf5格式文件
  7. 教你如何完全卸载Java
  8. video 标签设置样式
  9. 不写代码也能年薪百万?Prompt+低代码开发实战
  10. 晒晒去年取得的LabVIEW CLAD 证书