S3C2440_GPB7的小驱动
已经很久没写过驱动了,今天突然说要控制一个LED灯,闲来无事便自己写了一个,权当复习,闲话少说直接代码......
驱动代码(gpg7.c):
- #include <linux/module.h>
- #include <linux/kernel.h>
- #include <linux/fs.h>
- #include <linux/init.h>
- #include <linux/delay.h>
- #include <asm/irq.h>
- #include <linux/device.h>
- #include <asm/uaccess.h>
- #include <linux/ioport.h>
- #include <asm/io.h>
- #define GPB_ON 1
- #define GPB_OFF 0
- static unsigned int oam_major=0;
- static struct class *oam_class =NULL;
- static volatile unsigned long *gpfcon;
- static volatile unsigned long *gpfdat;
- /*1. 实现对硬件的操作方法*/
- static int oam_open(struct inode *inode, struct file *file)
- {
- /*初始化硬件*/
- /*将GPB7设置为输出管脚*/
- *gpfcon &= ~(0x3<<14);
- *gpfcon |= (0x1<<14);
- return 0;
- }
- ssize_t oam_read(struct file *file, char __user *buf, size_t size, loff_t *ppos)
- {
- //TODO
- return 0;
- }
- static ssize_t oam_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)
- {
- char val;
- int ret;
- /*获取用户空间传入的值*/
- ret =copy_from_user(&val,buf,1);
- if(!val)
- {
- *gpfdat |= (0x1 << 7);
- }
- else
- {
- *gpfdat &= ~(0x1 << 7);
- }
- return 0;
- }
- static int oam_ioctl(struct inode *inode, struct file *file, unsigned int cmd,unsigned long arg)
- {
- switch(cmd)
- {
- case GPB_OFF:
- *gpfdat |= (0x1 << 7);
- break;
- case GPB_ON:
- *gpfdat &= ~(0x1 << 7);
- break;
- default:break;
- }
- return 0;
- }
- /*2. 构建file_operations结构体*/
- static struct file_operations oam_fops={
- .owner = THIS_MODULE,
- .open = oam_open,
- .write = oam_write,
- .read = oam_read,
- .ioctl = oam_ioctl,
- };
- /*3. 实现入口函数*/
- static int __init oam_init(void)
- {
- /*1.注册*/
- oam_major =register_chrdev(0,"gpb7",&oam_fops);
- /*2. 构建设备节点*/
- oam_class =class_create(THIS_MODULE,"gpb7_class");
- device_create(oam_class,NULL,MKDEV(oam_major,0),NULL,"gpb7");
- /*3.将物理地址映射为虚拟地址*/
- gpfcon =ioremap(0x56000010,4096);
- gpfdat =gpfcon +1;
- return 0;
- }
- /*4.实现出口函数*/
- static void __exit oam_exit(void )
- {
- unregister_chrdev(oam_major,"gpb7");
- class_destroy(oam_class);
- device_destroy(oam_class,MKDEV(oam_major,0));
- iounmap(gpfcon);
- }
- module_init(oam_init);
- module_exit(oam_exit);
- MODULE_LICENSE("GPL");
测试代码(gpg7_test.c):
- #include <stdio.h>
- #include <string.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <sys/ioctl.h>
- #define GPB_ON 1
- #define GPB_OFF 0
- void print_usage(char *str)
- {
- printf("please input follow this!\n");
- printf("%s <dev> <on/off> \n",str);
- }
- int main(int argc, char **argv)
- {
- int fd = 0;
- //char buf[1];
- int cmd = 0;
- if(argc!=3&&argc!=2)
- {
- print_usage(argv[0]);
- return -1;
- }
- fd =open(argv[1], O_RDWR);
- if(fd <0)
- {
- printf("cannot open the dev!\n");
- return -1;
- }
- if(strcmp(argv[2],"on")==0)
- {
- cmd=GPB_ON;
- }
- else if(strcmp(argv[2],"off")==0)
- {
- cmd=GPB_OFF;
- }
- //write(fd, buf, 1);
- ioctl(fd,cmd,NULL);
- return 0;
- }
Makefile:
- all:
- make -C /home/farsight/anyk/s3c2440/kernal/linux-2.6.30.4 M=`pwd` modules
- clean:
- make -C /home/farsight/anyk/s3c2440/kernal/linux-2.6.30.4 M=`pwd` clean
- obj-m += gpb7.o
相对而言,字符设备还是挺简单的。
转载于:https://blog.51cto.com/embedjee/950625
S3C2440_GPB7的小驱动相关推荐
- 我的第一个可用的Windows驱动完成了
看到了一些希望,就值得我继续执着下去. 虽然是很简单的一个小驱动,但是它包含了我学编程两年来的憧憬与努力... 在2011年5月份,我就想学驱动,但是多次的失败,让我很不耐烦,所以暂时搁置了.... ...
- 服务器pci数据捕获和信号处理 感叹号,PCI数据捕获和信号处理控制器win7驱动
这是PCI数据捕获和信号处理控制器win7驱动下载,有些电脑在安装了系统后会在设备管理器中出现PCI 数据捕获和信号处理控制器黄色感叹号提示,此时需要安装"Intel Turbo Boost ...
- Windows驱动开发书籍简介
分享到 一键分享 QQ空间 新浪微博 百度搜藏 人人网 腾讯微博 百度相册 开心网 腾讯朋友 百度贴吧 豆瓣网 搜狐微博 百度新首页 QQ好友 和讯微博 更多... 百度分享 首页 我的主页 相册 广 ...
- beast软件linux用法,杂项类设置 - 黑苹果驱动高手篇 MultiBeast用法进阶_Linux教程_Linux公社-Linux系统门户网站...
杂项类设置 Miscellaneous即杂项设置.主要是针对没有DSDT文件的黑苹果,提供必要的增强硬件支持和一些比较杂的小驱动,比如USB 3.0驱动.如果使用EasyBeast 或用DSDT文件安 ...
- c语言windows驱动编程入门,Windows驱动开发技术详解 PDF扫描版[175MB]
Windows驱动开发技术详解由浅入深.循序渐进地介绍了windows驱动程序的开发方法与调试技巧.本书共分23章,内容涵盖了windows操作系统的基本原理.nt驱动程序与wdm驱动程序的构造.驱动 ...
- 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 ...
- Windows摄像头驱动研究(一)
Windows 驱动基础系列,转载请标明出处:http://blog.csdn.net/ikerpeng/article/details/38865317 摄像头驱动的主要目的是通过通过硬件捕捉视频信 ...
- sudami和achillis对初学者的建议
sudami对初学者的一点建议 1. 若对Windows底层开发没有兴趣,不建议继续深究, 若有些兴趣可以继续. 2. 先广泛打基础,比如C/ASM/C++/MFC,再学习Windows核心编程,对R ...
- Design Compiler指南——设计综合过程
在前面一章介绍完施加约束之后,接下来要做的工作就是将设计进行综合编译(compile),本文我们将主要讨论综合编译的过程.主要分为这样几个部分: 优化的三个阶段及其特点 编译的策略 编译层次化的设计 ...
最新文章
- 深度学习笔记第一门课第一周:深度学习引言
- python自关联_Django之Mode的外键自关联和引用未定义的Model方法
- mysql修改忘记了root密码忘记了,mysql忘记root密码后,重新设置、修改root密码
- 022-红黑树(三)
- 高度平衡的二叉搜索树基础概念与经典题目(Leetcode题解-Python语言)
- c语言中锁的作用,C语言中的多线程死锁
- Google和微软哪个更可怕?
- 二 Djano模型层之模型字段选项
- android 制作windows启动盘,安卓手机制作u盘启动盘微软win7系统地址
- hive表中加载数据
- 嵌入式Linux开发笔记(韦东山2)
- Ruby编程语言面试题库和答案(语法、代码)
- CSDN博客微信登录竟然强制扫码关注登录(又来了)
- 只要你懂得人性,就不怕没钱赚!
- SolidPlant材料清单
- Vulnhub-Tr0ll
- TU-ctf-2016 pwn woO 分析记录
- WIN10 Redis安装与使用
- 计算机自考本科英语二可以用什么代替,自考英语二用什么可以代替免考
- 用树莓派搭建家庭NAS下载机