kernel之字符设备驱动模块

一个最简单的字符驱动模板:


/* 设备结构体 */
struct xxx_dev_t {
	struct cdev cdev;
	...
} xxx_dev;

/* 读设备 */
static ssize_t xxx_read(struct file *filp, char __user *buf, size_t size, loff_t *ppos)
{  
	...
	copy_to_user(buf, ..., ...);    /* 拷贝数据到用户空间 */
	...
}

/* 写设备 */
static ssize_t xxx_write(struct file *filp, const char __user *buf, size_t size, loff_t *ppos)
{
	...
	copy_from_user(..., buf, ...);  /* 从用户空间拷贝数据到内核空间 */
	...
}

/* 文件操作集 */
static const struct file_operations xxx_fops = {  
	.owner 		= THIS_MODULE,  
	.read 		= xxx_read,  
	.write 		= xxx_write,    
	
	/* 还有很多接口 */
	... 
};

/* 模块加载函数 */
static int  __init xxx_init(void) 
{
	cdev_init(&xxx_dev.cdev, &xxx_fops);	/* 初始化cdev */
	xxx_dev.cdev.owner = THIS_MODULE;
	
	alloc_chrdev_region(...);						/* 动态分配字符设备号 */

	cdev_add(...);									/* 注册设备 */
	...
}

/* 模块卸载函数 */
static void __exit xxx_exit(void)
{
	unregister_chrdev_region(...);			/* 释放设备号 */
	cdev_del(&xxx_dev.cdev);				/* 注销设备 */
	...
}

module_init(xxx_init);  
module_exit(xxx_exit);