700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > Linux驱动开发---杂项设备

Linux驱动开发---杂项设备

时间:2023-11-01 10:06:39

相关推荐

Linux驱动开发---杂项设备

一、基本概念

Linux设备驱动类型

字符设备:字符设备是能够像字节流一样被访问的设备。 一般说来对硬件设备 IO 的操作可以归结为字符设备。 常见的字符设备有 led、 蜂鸣器、 串口、 键盘等;块设备:块设备室通过内存缓冲区访问, 可以随机存取的设备, 一般性的理解就是存储介质类的设备。常见的字符设备有 U 盘、 TF 卡、 eMMC、 电脑硬盘、 光盘等等;网络设备:可以和其它主机交换数据的设备。常见的以太网设备、WIFI、蓝牙等。

杂项设备:

杂项设备是字符设备的一种,可以自动生成设备节点;可以通过 cat /proc/misc命令来查看杂项设备;杂项设备的主设备号相同都是10,次设备号不同。一共只有256个主设备号(唯一),次设备号可对其进行扩展。主设备号可通过 cat /proc/devices 查看。

二、 杂项设备描述

在linux内核代码中,可以在内核目录 include/linux/miscdevice.h中查看杂项设备的设备描述定义,在内核目录include/linux/fs.h可以查看文件操作符的定义。

/** NOTE:* all file operations except setlease can be called without* the big kernel lock held in all filesystems.*/struct file_operations {struct module *owner;loff_t (*llseek) (struct file *, loff_t, int);ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);ssize_t (*aio_read) (struct kiocb *, const struct iovec *, unsigned long, loff_t);ssize_t (*aio_write) (struct kiocb *, const struct iovec *, unsigned long, loff_t);int (*readdir) (struct file *, void *, filldir_t);unsigned int (*poll) (struct file *, struct poll_table_struct *);/* remove by cym 0408 support for MT660.ko */#if 0//#ifdef CONFIG_SMM6260_MODEM#if 1// liang, Pixtree also need to use ioctl interface...int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long);#endif#endif/* end remove */long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);long (*compat_ioctl) (struct file *, unsigned int, unsigned long);int (*mmap) (struct file *, struct vm_area_struct *);int (*open) (struct inode *, struct file *);int (*flush) (struct file *, fl_owner_t id);int (*release) (struct inode *, struct file *);int (*fsync) (struct file *, int datasync);int (*aio_fsync) (struct kiocb *, int datasync);int (*fasync) (int, struct file *, int);int (*lock) (struct file *, int, struct file_lock *);ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int);unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);int (*check_flags)(int);int (*flock) (struct file *, int, struct file_lock *);ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int);ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int);int (*setlease)(struct file *, long, struct file_lock **);long (*fallocate)(struct file *file, int mode, loff_t offset,loff_t len);/* add by cym 0408 support for MT6260 and Pixtree */#if defined(CONFIG_SMM6260_MODEM) || defined(CONFIG_USE_GPIO_AS_I2C)int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long);#endif/* end add */};struct miscdevice {int minor; // 次设备号const char *name;const struct file_operations *fops;struct list_head list;struct device *parent;struct device *this_device;const char *nodename;mode_t mode;};extern int misc_register(struct miscdevice * misc); // 注册函数extern int misc_deregister(struct miscdevice *misc); // 卸载函数

三、 杂项设备注册流程

(1)杂项设备注册流程

填充struct miscdevice 设备描述符;填充struct file_operations 文件操作描述符;注册杂项设备并生成设备节点。

(2)测试代码

编写misc_driver.c杂项设备的驱动文件,这里我们就实现简单的注册和卸载函数。

/* misc_driver.c */#include <linux/init.h>#include <linux/module.h>#include <linux/miscdevice.h>#include <linux/fs.h>struct file_operations misc_fops = {.owner = THIS_MODULE};struct miscdevice misc_dev = {.minor = MISC_DYNAMIC_MINOR, // 动态分配子设备号.name = "hello misc",.fops = &misc_fops};static int misc_init(void){int ret;ret = misc_register(&misc_dev);if (ret < 0) {printk("misc register is error\n");return -1;} else {printk("misc register success\n");}return 0;}static void misc_exit(void){int ret;ret = misc_deregister(&misc_dev);if (ret < 0) {printk("misc deregister is error\n");} else {printk("misc deregister success\n");}}module_init(misc_init);module_exit(misc_exit);MODULE_LICENSE("Dual BSD/GPL");MODULE_AUTHOR("zhixiaoxing");

编写驱动程序的Makefile文件,其中Kernel的目录需要根据自己的环境设定。使用make指令生成misc_driver.ko文件。

#!/bin/bashobj-m += misc_driver.o#Kernel源码目录KDIR := /home/kernel/iTop4412_Kernel_3.0PWD ?= $(shell pwd)#make -C 指定调用执行的路径all:make -C $(KDIR) M=$(PWD) modulesclean:rm -rf *.o

(3)安装驱动模块

将编程生成的.ko文件拷贝到linux开发板上,通过下面命令可实现驱动的安装、卸载、查看:

安装驱动:insmod [驱动路径名],如:insmod ./misc_driver.ko

卸载驱动:rmmod [驱动名],如 rmmod miso_driver,这里不加.ko。

查看驱动:lsmod

查看设备节点:可以在/dev目录下找到刚才注册的设备,例如我们注册的 ls /dev/hello misc

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。