2014年(2)
分类: 嵌入式
2014-06-11 23:02:12
/***************************驱动程序**************************/
#include
#include
#include
#include
static int dev_major = 270;//主设备号
static int ret = 0;
static struct class *mycls;//设备所在的类
int hello_open(struct inode *inode, struct file *filp)
{
printk("----^_^ %s----------\n", __FUNCTION__);
return 0;
}
ssize_t hello_read(struct file *filp, char __user *buf, size_t size, loff_t *opps)
{
printk("----^_^ %s----------\n", __FUNCTION__);
return 0;
}
ssize_t hello_write(struct file *filp, const char __user *buf, size_t size, loff_t *opps)
{
printk("----^_^ %s----------\n", __FUNCTION__);
return 0;
}
int hello_close(struct inode *inode, struct file *filp)
{
printk("----^_^ %s----------\n", __FUNCTION__);
return 0;
}
static struct file_operations hello_fops = {//驱动为用户空间提供的方法
.owner = THIS_MODULE,
.open = hello_open,//对应到用户空间的open()函数
.read = hello_read,//对应到用户空间的read()函数
.write = hello_write,//对应到用户空间的write()函数
.release = hello_close,//对应到用户空间的close()函数
};
static int __init hello_init(void)//设备驱动模块加载函数
{
printk("init my func %s\n",__func__);
//1.申请字符设备号
ret = register_chrdev(dev_major,"myfristdemo", &hello_fops);
if(ret < 0)
{
printk("register_chrdev error\r\n");
return -EINVAL;
}
// 2.自动创建关联文件
// sys/class/myhello/hello---设备文件及设备所属类的关系
mycls = class_create(THIS_MODULE,"myhello");
if(!mycls)
{
printk("register_chrdev error\n");
return -EINVAL;
}
device_create(mycls,NULL,MKDEV(dev_major,0),NULL,"hello1");
return 0;
}
static void __exit hello_exit(void)//设备驱动模块卸载函数
{
printk("exit my func %s\n",__func__);
//释放注册时申请的资源
unregister_chrdev(dev_major,"myfristdemo");//释放设备占用的设备号
device_destroy(mycls,MKDEV(dev_major,0));//注销设备
class_destroy(mycls);//注销设备所属的类
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
/***************************应用测试程序**************************/
#include
#include
#include
#include
int main(int argc, char *argv[])
{
int fd = open("/dev/hello1", O_RDWR);
int on = 1;
char buf[128];
read(fd, buf, 128);
write(fd, &on, 4);
close(fd);
return 0;
}
/***************************Makefile**************************/
ROOTFS_DIR = /opt/rootfs
#make读取Makefile的第一次,成立, 第二次不成立
MODULE_NAME=key_drv
APP_NAME=$(MODULE_NAME)_test
ifeq ($(KERNELRELEASE), )
KERNEL_DIR = /tftpboot/linux-3.0.8//内核路径
CUR_DIR = $(shell pwd)//当前路径
all:
//进入内核 1)获取交叉工具链 2)编译hello.c文件 3)对KERNELRELEASE赋值
make -C $(KERNEL_DIR) M=$(CUR_DIR) modules
arm-none-linux-gnueabi-gcc $(APP_NAME).c -o $(APP_NAME)
clean :
make -C $(KERNEL_DIR) M=$(CUR_DIR) clean
install:
cp -raf *.ko $(APP_NAME) $(ROOTFS_DIR)/drv_module
else
obj-m = $(MODULE_NAME).o
endif