携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第3天,点击查看活动详情
若看到相同文章,为本人其他平台。
1.需要先创建设备节点
mknod /dev/xxx c 111 0
创建一个名字为xxx的字符设备, c表示字符设备, 主设备号是111, 此设备号是0。
2. 驱动程序
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/module.h>
static int first_drv_open(struct inode *inodep, struct file *filep)
{
printk("open\n");
return 0;
}
static ssize_t first_drv_write(struct file *filep, const char __user *buf,size_t len, loff_t *ppos)
{
printk("write\n");
return 0;
}
static const struct file_operations first_drv_file_operation = {
.owner = THIS_MODULE,
.open = first_drv_open,
.write = first_drv_write,
};
static int __init first_drv_init(void)
{
register_chrdev(111,"first_drv", &first_drv_file_operation);
printk("first_drv_init\n");
return 0;
}
static void __exit first_drv_exit(void)
{
//注册字符设备 主设备号是111.从设备号因为我们驱动程序没指定所以,默认是0.
unregister_chrdev(111,"first_drv_exit");
printk("first_drv_exit\n");
}
module_init(first_drv_init);
module_exit(first_drv_exit);
MODULE_LICENSE("GPL");
3. 应用程序,调用驱动程序
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main(void)
{
char buf[10];
/* 以可读可写方式打开/dev/目录下的xxx设备,open的返回值是一个文件描述符 */
int fd = open("/dev/xxx", O_RDWR);
if(fd < 0) /* 文件描述符小于0表示打开文件失败 */
{
printf("open /dev/xxx fail\n");
return -1;
}
/* 该文件中写入5个字节,写入的内容是buf中的前五个字节 */
write(fd, buf, 5);
return 0;
}
4.测试效果
测试效果需要使用sudo dmesg来查看. 如下图所示:
上面所述为Linux系统下的字符设备驱动程序框架,也就是最简单的字符设备驱动程序。
注: 驱动程序:是一种可以使计算机和设备进行相互通信的特殊程序。相当于硬件的接口,操作系统只有通过这个接口,才能控制硬件设备的工作,假如某设备的驱动程序未能正确安装,便不能正常工作。