驱动Driver-字符设备驱动
字符设备注册
静态分配设备号
- define宏定义MAJOR 200
- register_chrdev(MAJOR , "chrtest", &test_fops)
- unregister_chrdev(MAJOR , "chrtest")
动态分配设备号
- alloc_chrdev_region()
- unregister_chrdev_region()
file_operations
printk
kernel代码
Code
#include #include #include #include #include #include #define CHARBASE_MAJOR 200 #define CHARBASE_NAME "chardevice" static char readBuf[100]; static char writeBuf[100]; static char kernelData[] = {"kernel data buf"}; static int chardevice_open(struct inode *inode, struct file *filp) { printk("chardevice_open\n"); return 0; } static ssize_t chardevice_read(struct file *file, char __user *buf, size_t cnt, loff_t *offt) { int ret = 0; memcpy(readBuf, kernelData, sizeof(kernelData)); ret = copy_to_user(buf, readBuf, cnt); if (ret == 0) { printk("kernel senddata ok!\r\n"); } else { printk("kernel senddata error!\r\n"); } return 0; } static ssize_t chardevice_write(struct file *file, const char __user *buf, size_t cnt, loff_t *offt) { int ret = 0; ret = copy_from_user(writeBuf, buf, cnt); if (ret == 0) { printk("kernel recevdata:%s\r\n", writeBuf); } else { printk("kernel recevdata failed!\r\n"); } return 0; } static int chardevice_release(struct inode *inode, struct file *filp) { printk("chardevice_release\n"); return 0; } static struct file_operations test_fops = { .owner = THIS_MODULE, .open = chardevice_open, .read = chardevice_read, .write = chardevice_write, .release = chardevice_release, }; static int __init chrdev_init(void) { int ret = 0; printk("chrdev_init\n"); // 自动申请设备号注册字符设备 // int alloc_chrdev_region() ret = register_chrdev(CHARBASE_MAJOR, CHARBASE_NAME, &test_fops); if (ret < 0) { printk("error chrdev_init\n"); } return 0; } static void __exit chrdev_exit(void) { printk("chrdev_exit\n"); unregister_chrdev(CHARBASE_MAJOR, CHARBASE_NAME); } module_init(chrdev_init); module_exit(chrdev_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("starc");
user代码
Code
#include #include #include #include #include #include #include #include char userData[] = {"user data!"}; int main(int argc, char *argv[]) { int fd; int ret; char *fileName; char readbuf[100], writebuf[100]; if (argc != 3) { printf("Error Usage!\r\n"); return -1; } fileName = argv[1]; fd = open(fileName, O_RDWR); if (fd < 0) { perror("error open"); return -1; } if (atoi(argv[2]) == 1) { ret = read(fd, readbuf, sizeof(readbuf)); if (ret < 0) { perror("error read"); return -1; } else { printf("read:%s\r\n", readbuf); } } if (atoi(argv[2]) == 2) { memcpy(writebuf, userData, sizeof(userData)); ret = write(fd, writebuf, sizeof(writebuf)); if (ret < 0) { perror("error write"); return -1; } else { printf("write:%s\r\n", writebuf); } } ret = close(fd); if (ret < 0) { perror("error close"); return -1; } return 0; }
实验命令
- mknod /dev/chardev c 200 0
- cat /proc/device
- ls /dev
分类:
驱动Driver
标签:
工作-Linux系统
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)