个人整理的字符设备框架(未完,待更新),请各位大佬指教
linux驱动有哪些及概念
1.字符设备驱动
对设备进行以字节流的方式传递数据,可以随机访问,也可以不进行随机访问,
2.块设备驱动
对数据的处理是按块进行处理的, 每一块设备都有固定的大小,比如4069个字节,每次读取
至少是4069个字节的数据
3.网络设备驱动
顾名思义就是针对网络设备的驱动,主要就是进行网络设备数据的收发
//向用户提供打开的设备节点的函数接口
int my_open (struct inode *, struct file *)
{
}
//向用户提供打开的读取设备节点的数据函数接口
ssize_t my_read (struct file *, char __user *, size_t, loff_t *)
{
/*功能:
将数据读取到用户空间
参数:
1.用户空间
2.数据
3.长度
*/
long copy_to_user(void __user *to, const void *from, unsigned long n)
}
//向用户提供打开的写数据的设备节点函数接口
ssize_t my_write (struct file *, const char __user *, size_t, loff_t *)
{
/*
将数据写入到用户空间
参数:
1.用户空间
2.数据
3.长度
*/
long copy_to_user(void __user *to, const void *from, unsigned long n)
}
//向用户提供打开的关闭设备节点的函数接口
int my_close (struct inode *, struct file *)
{
}
/*
提供给用户接口的函数入口
*/
const struct file_operations my_fops =
{
.open = my_open,
.read = my_read,
.write = my_write,
.release = my_close,
};
static int __init char_dev_init(void) //驱动装载函数入口
{
/*
作用:注册主设备号
参数:
1.主设备号(32位) == 主设备号12位 + 次设备号20位
可以自定义号码,填0表示系统自动分配
2.描述设备信息的name,自定义
/proc/decices
3.struct file_operations; 向提供用户驱动硬件接口函数
open,read,write,ioctl等
return. 成功返回得到的主设号,失败返回负数
*/
int register_chrdev(unsigned int major, const char * name, const struct file_operations * fops)
/*
功能:创建一个类
参数:
1.THIS_MODULE
2.一个name,自定义
return. 返回一个struct class的指针
*/
struct class *class_create(owner, name);
/*功能:注册一个设备节点
参数:
1.class_create的返回值
2.父类,一把填NULL
3.MKDEV(ma, mi)
ma. 申请的主设备号
mi.次设备号
4.私有数据,一般填NULL
5.设备节点名 /dev/...
return. struct class 结构体指针
*/
struct device *device_create(struct class * class, struct device * parent,
dev_t devt, void * drvdata, const char * fmt, ...);
/*
功能:将物理地址映射位虚拟地址
参数:
1.实际的物理地址
2.映射地址的大小
*/
void *ioremap(physaddr, size)
return 0;
}
static void __exit char_dev_exit(void) // 驱动卸载函数入口
{
/*
功能:销毁创建的设备节点
参数:
1.class_create的返回值
2.和class_create的参数3一致
*/
void device_destroy(struct class * class, dev_t devt)
/*
功能:销毁创建的类
参数:
1.class_create 的返回值
*/
void class_destroy(struct class * cls)
/*
功能:注册的设备号
参数:
1.register_chrdev的返回值
2.和register_chrdev的参数2一直
*/
void unregister_chrdev(unsigned int major, const char * name)
}
module_init("char_dev_init");
module_exit("char_dev_exit");
MODULE_LICENSE("GPL");