#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/cdev.h>
#include<asm/uaccess.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("you");
struct mycdev{
struct cdev cdev;
dev_t devno;
unsigned char data[1024];
};
struct file_operations ops;
int my_open(struct inode *inode, struct file *filp);
int my_release(struct inode *inode, struct file *filp);
ssize_t my_read(struct file *filp, char __user *buf, size_t size, loff_t * off);
ssize_t my_write(struct file *filp, const char __user *buf, size_t size, loff_t *off);
struct mycdev dog;
struct mycdev tom;
int test_init(){
ops.open = my_open;
ops.release = my_release;
ops.read = my_read;
ops.write = my_write;
cdev_init(&dog.cdev,&ops);
dog.devno = MKDEV(9,1);
cdev_add(&dog.cdev,dog.devno,1);
cdev_init(&tom.cdev,&ops);
tom.devno=MKDEV(9,2);
cdev_add(&tom.cdev,tom.devno,1);
printk("hello world\n");
return 0;
}
void test_exit()
{
printk("goodbye cruel world\n");
}
module_init(test_init);
module_exit(test_exit);
int my_open(struct inode *inode, struct file *filp)
{
struct cdev *c = inode->i_cdev;
struct mycdev *this = (struct mycdev *)c;
//struct mycdev *this = container_of(inode->i_cdev,struct mycdev,cdev);
filp->private_data = this;
printk("this is my_open\n");
return 0;
}
int my_release(struct inode *inode, struct file *filp){
printk("goodbye release\n");
return 0;
}
ssize_t my_read(struct file *filp, char __user *buf, size_t size, loff_t * off){
struct mycdev *this = filp->private_data;
copy_to_user(buf,this->data,size);
return size;
}
ssize_t my_write(struct file *filp, const char __user *buf, size_t size, loff_t *off){
struct mycdev *this = filp->private_data;
copy_from_user(this->data,buf,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
open.c
#include<stdio.h>
#include<fcntl.h>
#include<unistd.h>
#include<stdlib.h>
int main(int argc,char *argv[])
{
int fd;
if(argc < 2)
{
printf("<./open wangcai\n");
exit(1);
}
fd = open(argv[1],O_RDWR);
if(fd<0)
{
perror("open");
exit(1);
}
close(fd);
return 0;
}
write.c
#include<stdio.h>
#include<fcntl.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
// ./write wangcai wangwangwang
int main(int argc,char *argv[])
{
int fd;
int ret;
unsigned char buff[1024];
if(argc < 3)
{
printf("<%s> <dev> <contest>\n",argv[0]);
exit(1);
}
fd = open(argv[1],O_RDWR);
if(fd<0)
{
perror("open");
exit(1);
}
ret = write(fd,argv[2],strlen(argv[2]));
if(ret<0)
{
perror("write\n");
exit(1);
}
close(fd);
return 0;
}
read.c:
#include<stdio.h>
#include<fcntl.h>
#include<unistd.h>
#include<stdlib.h>
int main(int argc,char *argv[])
{
int fd;
int ret;
unsigned char buff[1024]={0};
if(argc < 3)
{
printf("<%s> <%s> <%s>\n",argv[0],argv[1],argv[2]);
exit(1);
}
fd = open(argv[1],O_RDWR);
if(fd<0)
{
perror("open");
exit(1);
}
ret = read(fd,buff,1024);
if(ret<0)
{
perror("read");
exit(1);
}
close(fd);
return 0;
}