如何编写驱动程序?

如何编写驱动程序?,第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的内容。

一、 驱动程序编译进内核的步骤

在镇碧虚 linux 内核中增加程序需要完成以下三项工作:

1. 将编写的源代码复制到 Linux 内核源代码的慧销相应目录;

2. 在目录的 Kconfig 文件中增加御燃新源代码对应项目的编译配置选项;

3. 在目录的 Makefile 文件中增加对新源代码的编译条目。

bq27501驱动编译到内核中具体步骤如下:

1. 先将驱动代码bq27501文件夹复制到 ti-davinci/drivers/ 目录下。

确定bq27501驱动模块应在内核源代码树中处于何处。

设备驱动程序存放在内核源码树根目录 drivers/ 的子目录下,在其内部,设备驱动文件进一步按照类别,类型等有序地组织起来。

a. 字符设备存在于 drivers/char/ 目录下

b. 块设备存放在 drivers/block/ 目录下

c. USB 设备则存放在 drivers/usb/ 目录下。

IDE 方式的编译很简单,以PB5.0为例,打开定制内核的工程,在左边的workspaceFileView中找到你已经修改了的目录,然后单击右键d出菜单,在菜单中选择Build and Sysgen Current Project,这样PB就会编译指定的目录中的项目源码文件,然后执行sysgen命令知磨根据source文件中的内容生成目标文件并复制到当前内核燃猛蠢工程目录皮陪下。命令行方式的编译需要打开Build OS Open Release Directory,以cd命令进入你已经修改的驱动程序目录中,然后键入build –cfs,然后键入 sysgen –p 项目名称,一般项目名称为source文件中的TARGETNAME。


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存