//一个简单字符设备驱动
内核中:test.c ;Makefile;
应用层:read.c ;write.c
#include <linux/init.h>#include <linux/module.h>
#include <linux/thread_info.h>
#include <linux/sched.h>
#include <linux/io.h>
#include <linux/cdev.h>
#include <linux/fs.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("bunter");
int my_open(struct inode *no, struct file *fp);
int my_release(struct inode *no, struct file *fp);
ssize_t my_read(struct file *fp, char *buff, size_t size, loff_t *off);
ssize_t my_write(struct file *fp, char *buff, size_t size, loff_t *off);
//struct cdev wangcai;
//struct cdev tom;
//dev_t devno1;
//dev_t devno2;
//unsigned char data[1024];
struct updev{
struct cdev d;
dev_t devno;
unsigned char data[1024];
};
struct file_operations ops;
struct updev wangcai, tom;
int test_init()
{
ops.open = my_open;
ops.read = my_read;
ops.write = my_write;
ops.release = my_release;
//cdev_init(&wangcai, &ops);
//cdev_init(&tom, &ops);
cdev_init(&wangcai.d, &ops);
cdev_init(&tom.d, &ops);
//devno1 = MKDEV(9, 1);
//devno2 = MKDEV(9, 2);
wangcai.devno = MKDEV(9, 1);
tom.devno = MKDEV(9, 2);
//cdev_add(&wangcai, devno1, 1);
//cdev_add(&tom, devno2, 1);
cdev_add(&wangcai.d, wangcai.devno, 1);
cdev_add(&tom.d, tom.devno, 1);
return 0;
}
void test_exit()
{
printk("this is test exit\n");
}
module_init(test_init);
module_exit(test_exit);
int my_open(struct inode *no, struct file *fp)
{
struct cdev *c = no->i_cdev;
struct updev *this = (struct updev *)c;
fp->private_data = this;
return 0;
}
int my_release(struct inode *no, struct file *fp)
{
return 0;
}
ssize_t my_read(struct file *fp, char *buff, size_t size, loff_t *off)
{
struct updev *this = fp->private_data;
memcpy(buff, this->data, size);
return size;
}
ssize_t my_write(struct file *fp, char *buff, size_t size, loff_t *off)
{
struct updev *this = fp->private_data;
memcpy(this->data, buff, size);
return size;
}
Makefile:
default:
make -C /home/linux-2.6.28_smdk6410 M=`pwd`
clean:
make -C /home/linux-2.6.28_smdk6410 M=`pwd` clean
rm -rf modules.order
obj-m += test.o
应用层:
write.c
//应用层实现
#include <stdio.h>
#include <fcntl.h>
int main(int argc, char *argv[])
{
if(argc < 3){
printf("%s <file> <content> \n", argv[0]);
return 0;
}
int fd = open(argv[1], O_RDWR);
if(fd < 0){
perror("open");
return 1;
}
int ret = write(fd, argv[2], strlen(argv[2]));
if(ret < 0){
perror("write");
return 1;
}
close(fd);
}
read.c:
//应用层实现我们刚刚些的小驱动
#include <stdio.h>
#include <fcntl.h>
int main(int argc, char *argv[])
{
if(argc < 2){
printf("%s <file>\n", argv[0]);
return 0;
}
int fd = open(argv[1], O_RDWR);
if(fd < 0){
perror("open");
return 1;
}
unsigned char buff[1024] = {0};
int ret = read(fd, buff, 1024);
if(ret < 0){
perror("read");
return 1;
}
printf("buff is %s\n", buff);
close(fd);
}