linux设备驱动(1)字符设备框架及操作
程序员文章站
2022-06-03 22:52:46
...
字符设备框架
条件: 单板通过nfs挂载文件系统
框架包含几个方面
(1)入口(module_init)
(2)出口 (module_exit)
(3)操作(open/close read/write ...)
主要实现file_operations里面定义的部分函数,这里先实现open/write
代码如下:
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <asm/uaccess.h>
#include <asm/irq.h>
#include <asm/io.h>
#include <asm/arch/regs-gpio.h>
#include <asm/hardware.h>
static int first_drv_open(struct inode * inode, struct file * file)
{
printk(KERN_INFO"first_drv_open .\n");
return 0;
}
static ssize_t first_drv_write(struct file * file, const char __user * userbuf,
size_t count, loff_t * off)
{
printk(KERN_INFO"first_drv_write .\n");
return 0;
}
const struct file_operations first_drv_fops = {
.owner = THIS_MODULE,
.write = first_drv_write,
.open = first_drv_open,
};
static int __init first_drv_init(void)
{
register_chrdev(111, "first_drv", &first_drv_fops);
return 0;
}
static void __exit first_drv_exit(void)
{
unregister_chrdev(111, "first_drv");
}
module_init(first_drv_init);
module_exit(first_drv_exit);
MODULE_LICENSE("GPL");
Makefile
KERN_DIR = ~/mini2440/kernel
all:
make -C $(KERN_DIR) M=`pwd` modules
clean:
make -C $(KERN_DIR) M=`pwd` modules clean
rm -rf modules.order Module.symvers
obj-m += first_drv.o
以上文件在服务器上编译后可以的得到first_drv.ko, 把这个文件拷贝到根文件目录~/mini2440/rootfs/mini_mdev_fs这个文件正是nfs挂载的文件目录。然后单板同步可以看到first_drv.ko, 可以执行insmod first_drv.ko加载, 然后cat /proc/devices 看到对应主设备号111, 没有设备名。
看看测试程序
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(int argc, char **argv)
{
int fd ;
int val = 1;
fd = open("/dev/xxx", O_RDWR);
if(fd < 0)
{
printf("open err ! \n");
}
write(fd, &val , 1);
return 0;
}
里面打开的文件是/dev/xxx
服务器中使用arm-linux-gcc -o firstdrvtest firstdrvtest.c编译后firstdrvtest 拷贝到~/mini2440/rootfs/mini_mdev_fs
在单板执行firstdrvtest ,会看到open err !,因为/dev/xxx不知道什么设备
通过mknod 来绑定first_drv.ko的主设备号 和名称'/dev/xxx'
mknod /dev/xxx c 111 0
再次执行firstdrvtest,会正确执行,打印:
# ./firstdrv_test
first_drv_open .
first_drv_write .
上一篇: H5有哪些清空画布方法