- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
uClinux驱动开发初步
uClinux驱动开发初步
和linux的驱动开发是一致的,只是调试的方式不一样,学习uClinux的驱动开发也就是学习linux驱动开发的过程。linux驱动的调试需要至少一台电脑,外加像GDB,KDBG这样的源码级的内核调试工具,如果装一个虚拟机的话,那么只需要一台电脑即可了,但这样对电脑的性能有更高的要求。对于像uClinux的驱动调试,则最好是有开发板,也可以用模拟器。在ARM芯片上的移植是uClinux的一个重要应用。而最常用的仿真ARM的模拟器有国人开发的开源软件skyeye,不仅可以仿真ARM内核,并对以ARM作为内核的芯片作了进一步的支持。可以用skyeye-h开查看skyeye能仿真的ARM芯片。当然,也可以对skyeye作一些扩展以满足自己的要求。以下是如何在uClinux添加驱动的过程。
一、编写一个简单的字符驱动程序
//---mydevice.c---
#include linux/module.h
#include linux/init.h
#include linux/fs.h
#include asm/uaccess.h MODULE_LICENSE(GPL);
#define MAJOR_NUM 254//主设备号
#define DRIVER_NAMEmydevice
static ssize_t mydevice_read(struct file*,char*,size_t,loff_t*);
static ssize_t mydevice_write(struct file*,const char*,size_t,loff_t*);
//初始化字符设备驱动的file_operations结构体
struct file_operations mydevice_fops=
{
.read=mydevice_read,
.write=mydevice_write,
};
static int global_var=0;//mydevice设备的全局变量
int mydevice_init(void)
{
int ret;
//注册设备驱动
printk(0 mydevice_init\n);
ret=register_chrdev(MAJOR_NUM,DRIVER_NAME,mydevice_fops);
printk(0 register_chr_dev return%d\n,ret);
if(ret 0)
{
printk(0 mydevice register failed\n);
}
else
{
printk(0 mydevice register success\n);
}
return ret;
}
void mydevice_exit(void)
{
printk(0 mydevice_exit!\n);
unregister_chrdev(MAJOR_NUM,DRIVER_NAME);
}
static ssize_t mydevice_read(struct file*filp,char*buf,size_t len,loff_t*off)
{
//copy global_var from kernel space to user space if(copy_to_user(buf,global_var,sizeof(int)))
{
return-EFAULT;
}
return sizeof(int);
}
static ssize_t mydevice_write(struct file*filp,const char*buf,size_t len,loff_t*off)
{
//copy data from user sapce to kernel space if(copy_from_user(global_var,buf,sizeof(int)))
{
return-EFAULT;
}
return sizeof(int);
}
//---
二、将驱动静态编译进uClinux内核
要将一个写好的驱动加入uClinux,需要对配置文件和Makefile作一些修改,由于我们的这个驱动程序是作为一个字符型驱动程序,我们把mydevice.c拷到(uClinux目录)/(linux内核目录)/drivers/char目录下。并对这个目录下的Config.in和Makefile以及mem.c作一些修改。
1、修改Config.in:
在commentCharacter devices这行底下加上以下一行:
boolsupport for mydeviceCONFIG_MYDEVICE y
2、修改Makefile
在
#
#uClinux drivers
#
下加上以下
原创力文档


文档评论(0)