Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5623
  • 博文数量: 2
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 32
  • 用 户 组: 普通用户
  • 注册时间: 2014-06-01 01:23
文章分类
文章存档

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

阅读(414) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:linux驱动之led闪烁

给主人留下些什么吧!~~