驱动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


posted @   steve的miao  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示