- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Driverdemo源代码分析及步骤.doc
Driverdemo源代码分析
驱动代码demo.c如下,其中的demo_read,demo_write函数完成驱动的读写接口功能,do_write函数实现将用户写入的数据逆序排列,通过读取函数读取转换后的数据。这里只是演示接口的实现过程和内核驱动对用户的数据的处理。Demo_ioctl函数演示ioctl调用接口的实现过程。
#ifdef MODULE
#include linux/module.h#ifdef CONFIG_DEVFS_FS
#include linux/devfs_fs_kernel.h
#endif
#include linux/init.h /*初始化相关头文件*/
#include linux/kernel.h /*与 printk()等函数有关的头文件 */
#include linux/slab.h /*与 kmalloc()等函数有关的头文件*/
#include linux/fs.h /* 与文件系统有关的头文件everything... */
#include linux/errno.h /* 错误代码处理头文件error codes */
#include linux/types.h /*数据类型头文件 size_t */
#include linux/proc_fs.h /*与进程调度相关的头文件*/
#include linux/fcntl.h /* O_ACCMODE */
#include linux/poll.h /* COPY_TO_USER */
#include asm/system.h /* cli(), *_flags */
#define DEVICE_NAME UP-TECH DEMO /*该驱动的设备名*/
#define DEMORAW_MINOR 1
#define DEMO_Devfs_path demo/0
static int demoMajor = 0;
static int MAX_BUF_LEN=1024; /*定义一缓冲区最大长度*/
static char drv_buf[1024]; /*定义一缓冲区*/
static int WRI_LENGTH=0;
/***********************************************************************
* 名称:static void do_write()
* 功能:逆序排列缓冲区数据**********************************************************************/
static void do_write()
{
int i;
int len = WRI_LENGTH;
char tmp;
for(i = 0; i (len1); i++,len--){
tmp = drv_buf[len-1];
drv_buf[len-1] = drv_buf[i]; /*对drv_buf[]数组进行逆序排列*/
drv_buf[i] = tmp;
}
}
/***********************************************************************
* 名称:demo_write()
* 功能:对应用户空间的write系统调用,从用户空间拷贝给定长度缓冲区数据到内核空间
* 入口参数:*filp 操作设备文件的ID,*buffer对应用户空间的缓冲区的起始地址,count用户空间数
据缓冲区长度
* 出口参数:返回用户空间数据缓冲区长度
**********************************************************************/
static ssize_t demo_write(struct file *filp,const char *buffer, size_t count)
{
if(count MAX_BUF_LEN)
count = MAX_BUF_LEN;
copy_from_user(drv_buf , buffer, count); /*从用户空间拷贝缓冲区数据到内核空间的关键函数,把用
户空间的buffer数据传递给drv_buf数组*/
WRI_LENGTH = count;
printk(user write data to driver\n);
do_write();
文档评论(0)