如何编写驱动程序?

如何编写驱动程序?,第1张

代码:

#include&ltlinux/module.h&gt

#include&ltlinux/kernel.h&gt

#include&ltasm/io.h&gt

#include&ltlinux/miscdevice.h&gt

#include&ltlinux/fs.h&gt

#include&ltasm/uaccess.h&gt

//流水灯代码

#define GPM4CON 0x110002e0

#define GPM4DAT 0x110002e4

static unsigned long*ledcon=NULL

static unsigned long*leddat=NULL

//自定义write文件 *** 作(不自定义的话,内核有默认的一套文件 *** 作函数)

static ssize_t test_write(struct file*filp,const char __user*buff,size_t count,loff_t*offset)

{

int value=0

int ret=0

ret=copy_from_user(&value,buff,4)

//底层驱动只定义基本 *** 作动作,不定义功能

if(value==1)

{

*leddat|=0x0f

*leddat&=0xfe

}

if(value==2)

{

*leddat|=0x0f

*leddat&=0xfd

}

if(value==3)

{

*leddat|=0x0f

*leddat&=0xfb

}

if(value==4)

{

*leddat|=0x0f

*leddat&=0xf7

}

return 0

}

//文件 *** 作结构体初始化

static struct file_operations g_tfops={

.owner=THIS_MODULE,

.write=test_write,

}

//杂设备信息结构体初始化

static struct miscdevice g_tmisc={

.minor=MISC_DYNAMIC_MINOR,

.name="test_led",

.fops=&g_tfops,

}

//驱动入口函数杂设备初始化

static int __init test_misc_init(void)

{

//IO地址空间映射到内核的虚拟地址空间

ledcon=ioremap(GPM4CON,4)

leddat=ioremap(GPM4DAT,4)

//初始化led

*ledcon&=0xffff0000

*ledcon|=0x00001111

*leddat|=0x0f

//杂设备注册函数

misc_register(&g_tmisc)

return 0

}

//驱动出口函数

static void __exit test_misc_exit(void)

{

//释放地址映射

iounmap(ledcon)

iounmap(leddat)

}

//指定模块的出入口函数

module_init(test_misc_init)

module_exit(test_misc_exit)

MODULE_LICENSE("GPL")

扩展资料:

include用法:

#include命令预处理命令的一种,预处理命令可以将别的源代码内容插入到所指定的位置;可以标识出只有在特定条件下才会被编译的某一段程序代码;可以定义类似标识符功能的宏,在编译时,预处理器会用别的文本取代该宏。

插入头文件的内容

#include命令告诉预处理器将指定头文件的内容插入到预处理器命令的相应位置。有两种方式可以指定插入头文件:

1、#include&lt文件名&gt

2、#include"文件名"

如果需要包含标准库头文件或者实现版本所提供的头文件,应该使用第一种格式。如下例所示:

#include&ltmath.h&gt//一些数学函数的原型,以及相关的类型和宏

如果需要包含针对程序所开发的源文件,则应该使用第二种格式。

采用#include命令所插入的文件,通常文件扩展名是.h,文件包括函数原型、宏定义和类型定义。只要使用#include命令,这些定义就可被任何源文件使用。如下例所示:

#include"myproject.h"//用在当前项目中的函数原型、类型定义和宏

你可以在#include命令中使用宏。如果使用宏,该宏的取代结果必须确保生成正确的#include命令。例1展示了这样的#include命令。

【例1】在#include命令中的宏

#ifdef _DEBUG_

#define MY_HEADER"myProject_dbg.h"

#else

#define MY_HEADER"myProject.h"

#endif

#include MY_HEADER

当上述程序代码进入预处理时,如果_DEBUG_宏已被定义,那么预处理器会插入myProject_dbg.h的内容;如果还没定义,则插入myProject.h的内容。

驱动程序开发步骤

编写一个驱动程序的大致流程如下:

1)查看原理图,数据手册,了解设备的 *** 作方法;

2)在内核中找到相近的驱动程序,作为模板来开发,有时要从零开始;

3)实现驱动程序的初始化,比如详内核注册这个驱动程序,

4)设计所要实现的 *** 作:比如open、close、read、writ等函数;

5)实现中断服务,并不是每个设备驱动都必须的;

6)编译驱动到内核,或作为模块动态加载

7)测试驱动


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11123645.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-13
下一篇 2023-05-13

发表评论

登录后才能评论

评论列表(0条)

保存