驱动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 @ 2024-02-27 19:18  starc的miao  阅读(15)  评论(0)    收藏  举报