文本描述
Linux驱动
前言:
字符设备:字节读取
块设备:存储设备
网络设备:USB WIFI/SDIO WIFI
驱动:获取外设或传感器数据、控制外设
编写一个驱动、写一个简单测试应用程序APP(驱动和应用是完全分开的)
数据段、代码段、BSS段、堆、栈
用户态进入内核态:系统调用、异常和陷入
应用程序调用库API再调用系统调用
应用层:写open、write、read、close
驱动对应也写open、write、read、close
框架
Linux 内核文件 include/linux/fs.h 中有个叫做 file_operations 的结构体,里面有open、read等函数
驱动模块的加载和卸载
module_init(xxx_init); //注册模块加载函数
module_exit(xxx_exit); //注册模块卸载函数
加载模块:insmod和 modprobe drv.ko
字符设备注册和注销
static inline int register_chrdev(unsigned int major, const char *name,const struct file_operations *fops)
static inline void unregister_chrdev(unsigned int major, const char *name)
major:主设备号,Linux 下每个设备都有一个设备号,设备号分为主设备号和次设号两部分,关于设备号后面会详细讲解。
name:设备名字,指向一串字符串。
fops:结构体 file_operations 类型指针,指向设备的操作函数集合变量。
“cat /proc/devices”可以查看当前已经被使用掉的设备号
实现设备的具体操作函数
/* 打开设备 */
static int chrtest_open(struct inode *inode, struct file *filp)
{/* 用户实现具体功能 */return 0;
}
/* 从设备读取 */
static ssize_t chrtest_read(struct file *filp, char __user *buf,
size_t cnt, loff_t *offt)
{/* 用户实现具体功能 */return 0;
}
/* 向设备写数据 */
static ssize_t chrtest_write(struct file *filp,const char __user *buf,
size_t cnt, loff_t *offt)
{/* 用户实现具体功能 */return 0;
}
/* 关闭/释放设备 */
static int chrtest_release(struct inode *inode, struct file *filp)
{/* 用户实现具体功能 */return 0;
}
static struct file_operations test_fops = {.owner = THIS_MODULE,.open = chrtest_open,.read = chrtest_read,.write = chrtest_write,.release = chrtest_release,
};
/* 驱动入口函数 */
static int __init xxx_init(void)
{/* 入口函数具体内容 */int retvalue = 0;/* 注册字符设备驱动 */retvalue = register_chrdev(200, "chrtest",