字符设备驱动_第1页
字符设备驱动_第2页
字符设备驱动_第3页
字符设备驱动_第4页
字符设备驱动_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、驱动分类1 常规分类1.1 字符设备:以字节为最小访问单位的设备,通常支持open,close,read,write系统调用。如串口、LED、按键1.2 块设备:以块为最小访问单位的设备(块一般为512字节或512字节的倍数),linux中允许块设备传送任意字节数。如硬盘、flash、SD卡。1.3 网络接口:负责发送和接收数据报文,可以是硬件设备,如网卡,也可以是纯软件设备,如回环接口(lo)2 总线分类法1.1 USB设备1.2 PCI设备1.3 平台总线设备学习方法1 构建驱动模型2 添加硬件操作3 驱动测试硬件访问1 地址映射1.1 静态映射void *ioremap(physaddr

2、,size)physaddr:待映射的物理地址size:映射的区域长度返回值:映射后的虚拟地址1.2 动态映射用户事先指定映射关系,在内核启动时自动将物理地址映射为虚拟地址。struct map_descunsigned long virtual;/映射后的虚拟地址unsigned long pfn;/物理地址所在的页帧号unsigned long length;/映射长度unsigned int type;/映射的设备类型2 寄存器读写unsigned ioread8(void *addr)unsigned ioread16(void *addr)unsigned readb(address

3、)unsigned readw(address)unsigned readl(address)void iowrite8(u8 value,void *addr)void iowrite16(u16 value,void *addr)void iowrite32(u32 value,void *addr)void writeb(unsigned value, address)void writew(unsigned value, address)void writel(unsigned value, address)驱动的运用1 编译安装驱动1.1 创建Makefileobj-m := mem

4、dev.oKDIR := /home/linux-tq2440all:make C $( KDIR) M=$(PWD) modules CROSS_COMPILE=arm-linux- ARCH=arm1.2 拷贝驱动(内核模块)到/rootfs1.3 安装驱动程序insmod memdev.ko1.4 查看 lsmod2 字符设备文件2.1 查看主设备号cat /proc/devices主设备号 设备名2.2 创建设备文件mknod /dev/文件名 c 设备号 次设备号(0255)3 应用程序3.1 打开字符设备文件fd = open(“/dev/memdev0”,O_RDWR);3.2

5、操作字符设备文件write(fd,&buf,sizeof(int);read(fd,&buf,sizeof(int);3.3 关闭字符设备文件close(fd);3.4 编译(静态编译)arm-linux-gcc static 文件名.c O文件名字符设备驱动模型1 设备描述结构cdev1.1 结构定义struct cdevstruct kobject kobl;struct module *owner;const struct file operations *ops ;/设备操作集struct lis thead list;dev_t dev;/设备号。unsigned i

6、nt count;设备数1.2 设备号类型dev_t1.2.1 dev_t介绍:实质为32位的unsigned int,高十二位为主设备号,低二十位为次设备号。1.2.2 操作设备号:dev_t dev=MKDEV(主设备号,次设备号)主设备号=MAJOR(dev_t dev)次设备号=MINOR(dev_t dev)1.2.3 申请设备号:静态申请:int register_chrdev_region(dev_t first, unsigned int count, char *name);first: 待分配的起始设备编号,通常为0;count: 连续设备编号的总数name: 设备名(ca

7、t /proc/devices)动态申请:int alloc_chrdev_region(dev_t *dev,unsigned int -firstminor,unsigned int -count,char *name)dev:得到的设备号保存位置-firstminor: 待分配的起始设备编号,通常为0;-count: 连续设备编号的总数name: 设备名(cat /proc/devices)1.2.4 注销设备号:unregister_chardev_region1.3 操作集struct file operations1.3.1 struct file operations介绍:函数指

8、针的集合,定义能在设备上进行的操作。对于不支持的操作设置为NULL1.3.2 例:struct file operations dev_fops = .llseek = NULL;.read = dev_read,.write = dev_write,.ioctl = dev_inctl,.open = dev_open,.release = dev_release,;2 驱动初始化2.1 分配设备描述结构 静态分配:struct cdev mdev;动态分配:struct cdev *pdev = cdev_alloc();2.2 初始化设备描述结构cdev_init(struct cdev

9、 *cdev,const struct file_operations *fops)*cdev:待初始化的cdev结构/*fops:设备对应的操作函数集2.3 注册设备描述结构 cdev_add(struct cdev *p,dev_t dev,unsigned count)p:待添加到内核的字符设备结构dev:设备号count:该类设备的设备个数2.4 硬件初始化3 设备操作(设备方法)3.1 int (*open) (struct inode *,struct file *) 打开设备,响应open系统3.1.1 struct file:3.1.1.1 linux系统中,每个打开的文件,都

10、会关联一个struct file,由内核在文件打开时创建,文件关闭后释放3.1.1.2 重要成员loff_t f_pos /文件读写指针struct file_operation *f_op /文件对应的操作3.1.2 struct inode3.1.2.1 每个存在于文件系统的文件都会关联一个inode结构,记录文件物理信息。3.1.2.2 重要成员:dev_t i_rdev /设备号3.2 int (*release) (struct inode *,struct file *) 关闭设备,响应close系统3.3 loff_t (*llseek) (struct file *,loff_

11、t,int) 重定位读写指针,响应lseek系统调用3.4 ssize_t (*read) (struct file *,char _user *,size_t,loff_t *) 从设备读取数据,响应read系统调用3.4.1 参数分析:filp:与字符设备文件关联的file结构指针,由内核创建buff:从设备读到的数据需要保存的位置,由read系统调用提供count:请求传输的数据量,由read系统调用提供offp:文件读写位置,由内核从file结构中取出传递进来3.4.2 从设备中读取数据(硬件访问类操作)3.4.3 将读到的数据返回给应用程序3.5 ssize_t (*write) (struct file *,const char _user *,size_t,loff_t *) 向设备写入数据,响应write系统调用3.5.1 参数分析:filp:与字符

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论