int read(int fd, char *buf,int n);+
从设备fd读取n个字节到空间buf中
ssize_t xxx_read(struct file *filp, char __user *pbuf, size_t count, loff_t *ppos); 完成功能:读取设备产生的数据 参数: ? ?filp:指向open产生的struct file类型的对象,表示本次read对应的那次open ? ?pbuf:指向用户空间一块内存,用来保存读到的数据 ? ?count:用户期望读取的字节数 ? ?ppos:对于需要位置指示器控制的设备操作有用,用来指示读取的起始位置,读完后也需要变更位置指示器的指示位置 ssize_t ---实际读取的字节数 size_t count--- 期望读取的字节数 返回值: ? ?本次成功读取的字节数,失败返回-1
put_user(x,ptr)
x:char、int类型的简单变量名
unsigned long copy_to_user (void __user * to, const void * from, unsigned long n)
void __user * to? ? ? ?用户空间
?const void * from? ? 内核空间
内核空间拷贝到用户空间中去
成功为返回0,失败非0
ssize_t xxx_write (struct file *filp, const char __user *pbuf, size_t count, loff_t *ppos); ? 完成功能:向设备写入数据 参数: ? ?filp:指向open产生的struct file类型的对象,表示本次write对应的那次open ? ?pbuf:指向用户空间一块内存,用来保存被写的数据 ? ?count:用户期望写入的字节数 ? ?ppos:对于需要位置指示器控制的设备操作有用,用来指示写入的起始位置,写完后也需要变更位置指示器的指示位置 返回值: ? ?本次成功写入的字节数,失败返回-1 ?
get_user(x,ptr)
x:char、int类型的简单变量名
unsigned long copy_from_user (void * to, const void __user * from, unsigned long n)
成功为返回0,失败非0
验证操作步骤:
编写驱动代码mychar.c
vi mychar.c
make生成ko文件
make
insmod内核模块??
sudo insmod ./mychar.ko
查阅字符设备用到的设备号(主设备号):
cat /proc/devices | grep 申请设备号时用的名字
cat /proc/devices | grep mychar
创建设备文件(设备节点) :
mknod /dev/??? c 上一步查询到的主设备号 代码中指定初始次设备号
sudo mknod /dev/mydev c 11 0
编写app验证驱动(testmychar_app.c)
将mydev赋予读写权限
sudo chmod a+w /dev/mydev
?
编译运行app,dmesg命令查看内核打印信息
?