(嵌入式软件设计)驱动程序

1、 完成Demo虚拟驱动程序

demo.c
#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/fs.h>/* everything... */
#include <linux/poll.h>/* COPY_TO_USER */
#define DEVICE_NAME "demo"
#define demo_MAJOR 249
#define demo_MINOR 0
#define MAX_BUF_LEN 40
static char drv_buf[MAX_BUF_LEN];
static unsigned char demo_inc=0;
static int demo_open(struct inode *inode, struct file *file)
{
	demo_inc++;
	sprintf(drv_buf,"device open sucess!\n");
	printk("device open sucess!\n");
	return 0;
}
static int demo_release(struct inode *inode, struct file *filp)
{
	demo_inc--;
	printk("device release\n");
	return 0;
}
static ssize_t demo_write(struct file *filp,const char *buffer,size_t count)
{
	copy_from_user(drv_buf,buffer,count);
	printk("user write data to driver\n");
	return count;
}
static ssize_t demo_read(struct file *filp,char *buffer,size_t count,loff_t *ppos)
{
	if(count>MAX_BUF_LEN)
	{
		count=MAX_BUF_LEN;
		copy_to_user(buffer,drv_buf,count);
		printk("user read data from driver\n");
		return count;
	}
}
/*************************************************************************************/
static struct file_operations demo_fops = {
	owner: THIS_MODULE,
	write: demo_write,
	read: demo_read,
	open: demo_open,
	release: demo_release,
};
/*************************************************************************************/
#ifdef CONFIG_DEVFS_FS
static devfs_handle_t devfs_demo_dir,devfs_demoraw;
#endif

static int __init demo_init(void)
{
#ifdef CONFIG_DEVFS_FS
	devfs_demo_dir = devfs_mk_dir(NULL,"demo",NULL);
	devfs_demoraw = devfs_register(devfs_demo_dir,"0",DEVFS_FL_DEFAULT,
		 	demo_MAJOR,demo_MINOR,S_IFCHR|S_IRUSR|S_IWUSR,
			&demo_fops,NULL);
#else
	int result;
	//修改
	//SET_MODULE_OWNER(&demo_fops);
	result = register_chrdev(demo_MAJOR,"demo",&demo_fops);
	if(result<0)return result;
#endif
	printk(DEVICE_NAME " initialized\n");
	return 0;
}
/*************************************************************************************/
static void __exit demo_exit(void)
{
	unregister_chrdev(demo_MAJOR,"demo");
	//kfree(demo_devices);
	printk(DEVICE_NAME "unloaded\n");
}
/*************************************************************************************/
module_init(demo_init);
module_exit(demo_exit);

代码做了少许改动,删去了代码SET_MODULE_OWNER(&demo_fops);因为不删除去出现如下错误,可以知道该函数属于隐式声明函数。最后删去了这段代码。


Makefile

ifneq ($(KERNELRELEASE),)

       obj-m:=demo.o

else

       PWD :=$(shellpwd)

       KERNELDIR:=/usr/src/kernels/2.6.32-279.el6.i686

all:

       $(MAKE)-C $(KERNELDIR) M=$(PWD) modules

clean:

       rm -rf*.o *~core .depend .*.cmd *.ko *.mod.c .tmp_versions Module* modules*

endif

Makefile的代码文件当然也需要修改一下,因为内核源码的位置是不一样的,所以KERNELDIR存放的地址改为你源码存放的地方。两者准备好了以后就可以make了,实验过程如下:


运行make命令后,就会生成驱动程序demo.ko,然后

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值