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