LED驱动程序.docx

上传人:b****4 文档编号:11945506 上传时间:2023-04-16 格式:DOCX 页数:40 大小:35.98KB
下载 相关 举报
LED驱动程序.docx_第1页
第1页 / 共40页
LED驱动程序.docx_第2页
第2页 / 共40页
LED驱动程序.docx_第3页
第3页 / 共40页
LED驱动程序.docx_第4页
第4页 / 共40页
LED驱动程序.docx_第5页
第5页 / 共40页
点击查看更多>>
下载资源
资源描述

LED驱动程序.docx

《LED驱动程序.docx》由会员分享,可在线阅读,更多相关《LED驱动程序.docx(40页珍藏版)》请在冰豆网上搜索。

LED驱动程序.docx

LED驱动程序

设备驱动程序的开发流程

进行嵌入式Linux系统的开发,很大的工作量是为各种设备编写驱动程序。

在ARM平台上开发嵌入式Linux的设备驱动程序与在其他平台上开发是一样的。

总的来说,实现一个嵌入式Linux设备驱动的大致流程如下:

(1)查看原理图,理解设备的工作原理

(2)定义主设备号

(3)在驱动程序中实现驱动的初始化。

如果驱动程序采用模块的方式,则要实现模块初始化。

(4)设计所要实现的文件操作,定义file_operations结构。

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

(6)编译该驱动程序到内核中,或者用insmod命令加载

(7)测试该设备

3.2linux下字符设备的驱动开发实例----LED驱动

(可参考FS2410P实验指导手册v2.1.2.pdf,302-313)

(1)实验内容:

4个LED灯轮流闪烁

本节要求实现在一个字符设备驱动里面实现对GPIO端口的操作。

●在模块加载的时候跑马灯运行起来

●模块卸载的时候,跑马灯停止。

FS2410P上的4个LED指示灯由4个I/O口控制,它们分别是:

GPF4~GPF7,输出低电平时候,相应的LED指示灯亮。

(2)LED的原理图

FS2410P带有4个用户可编程I/O方式LED,下表为LED对应的I/O口。

表1    用户指示灯占用CPU资源列表

   序号     名字        CPU端口资源

    1     LED1        GPF4

    2     LED2        GPF5

    3     LED3        GPF6

    4     LED4        GPF7

图1LED原理图

(3)LED驱动源代码及说明

◆在/s3c2410下新建一个目录:

gpiodrv

●#mkdir/s3c2410/gpiodrv

●#cd/s3c2410/gpiodrv

◆在/s3c2410/gpiodrv目录下用vi编辑器编写符合上面功能的驱动源程序

gpiodrv.c

●#cd/s3c2410/gpiodrv

●#vigpiodrv.c

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#defineIOPORT_MAJOR220

intmagic_leds_open(structinode*inode,structfile*filp);

intmagic_leds_ioctl(structinode*inode,structfile*filp,unsignedintcmd,unsigned

longarg);

intmagic_leds_release(structinode*inode,structfile*filp);

staticstructfile_operationsmagic_leds_fops=

{

ioctl:

magic_leds_ioctl,

open:

magic_leds_open,

release:

magic_leds_release,

};

#defineLED1_ON()(GPFDAT&=~0x10)

#defineLED2_ON()(GPFDAT&=~0x20)

#defineLED3_ON()(GPFDAT&=~0x40)

#defineLED4_ON()(GPFDAT&=~0x80)

#defineLED1_OFF()(GPFDAT|=0x10)

#defineLED2_OFF()(GPFDAT|=0x20)

#defineLED3_OFF()(GPFDAT|=0x40)

#defineLED4_OFF()(GPFDAT|=0x80)

staticintledStatus;

voidLedSet(intled)

{

ledStatus=led;

if(ledStatus&1)

LED1_ON();

else

LED1_OFF();

if(ledStatus&2)

LED2_ON();

else

LED2_OFF();

if(ledStatus&4)

LED3_ON();

else

LED3_OFF();

if(ledStatus&8)

LED4_ON();

else

LED4_OFF();}

voidLedDisy(void)

{

LedSet(0x08);

udelay(0x500000);

LedSet(0x04);

udelay(0x500000);

LedSet(0x02);

udelay(0x500000);

LedSet(0x01);

udelay(0x500000);

LedSet(0x02);

udelay(0x500000);

LedSet(0x04);

udelay(0x500000);

LedSet(0x08);

udelay(0x500000);

}

staticint__initmagic_leds_init(void)

{

intresult=0;

printk("magic_leds_init\n");

result=register_chrdev(IOPORT_MAJOR,"gpio",&magic_leds_fops);

if(result<0)

{

printk("Failedtoregistermajor.\n");

returnresult;

}

printk("successtoregister\n");

return0;

}

intmagic_leds_open(structinode*inode,structfile*filp)

{

GPFCON=0x5500;

GPFUP=0xff;

printk("opengpiodevices\n");

return0;}

void__exitmagic_leds_exit(void)

{

unregister_chrdev(IOPORT_MAJOR,"gpio");

}

int__exitmagic_leds_release(structinode*inode,structfile*filp)

{

printk("releasethisdevice\n");

return0;

}

intmagic_leds_ioctl(structinode*inode,structfile*filp,unsignedintcmd,unsigned

longarg)

{

interr=0;

if(cmd==1)

{

while(arg--)

{

LedDisy();

printk(".....");

}

printk("\n");

return0;

}

returnerr;

}

module_init(magic_leds_init);

module_exit(magic_leds_exit);

(3)编译安装LED驱动

◆同样,在/s3c2410/gpiodrv目录下用vi编辑器编写该驱动程序的Makefile文件:

(Makefile的编写可参考Makefile中文教程.pdf)

●#viMakefile输入以下内容:

CROSS=arm-linux-gcc

CFLAGS=-D__KERNEL__

CFLAGS+=-DMODULE

CFLAGS+=-I/s3c2410/2.4.18-rmk7/include

CFLAGS+=-I/s3c2410/2.4.18-rmk7/include/linux

CFLAGS+=-I/usr/local/arm/2.95.3/include

CFLAGS+=-Wall-Wstrict-prototypes-Wno-trigraphs-Os-mapcs

CFLAGS+=-fno-strict-aliasing-fno-common-fno-common-pipe-mapcs-32

CFLAGS+=-march=armv4-mtune=arm9tdmi-mshort-load-bytes-msoft-float

CFLAGS+=-DKBUILD_BASENAME=gpiodrv

all:

gpiodrv.o

gpiodrv.o:

gpiodrv.c

$(CROSS)$(CFLAGS)-ogpiodrv.o-cgpiodrv.c

clean:

-rm-f$(EXEC)*.o*~core

将gpiodrv.c和Makefile这个放置在同一个新建目录下gpiodrv下,进入这个目录,输入make后,编绎成功后将在这个目录下生成一个gpiodrv.o文件。

●#cd/s3c2410/gpiodrv

●#make

3.3linux下字符设备的驱动开发实例—测试LED

(1)在/s3c2410/gpiodrv目录下用vi编辑器编写led驱动程序相应的测试

程序gpio_test.c

●#vigpio_test.c

#include

#include

#include

#include

#include

#include

#include

intmain(intargc,char**argv)

{

inti;

intfd;fd=open("/dev/gpio",0);

if(fd<0)

{

perror("Failedtoopendevice");

exit

(1);

}

while

(1)

printf("pleaseselectnumbertorunprogram\n");

printf("1:

ledon\n2:

quit");

scanf("%d",&val);

if(val==1)

ioct1(fd,1,10);

elseif(val==2)

{

close(fd);

}

return0;

}

编译gpio_test.c,得到可执行文件gpio_test。

即用下面的命令:

#arm-linux-gcc–ogpio_testgpio_test.c

3.4linux下字符设备的驱动开发实例—实验步骤

(也可参考FS2410P实验指导手册v2.1.2.pdf,311-313上的方法)

(1)PC机进入LINUX系统,配置好minicom,连接好串口线,让FS2410P教学实验平台进入LINUX环境,利用minicom来显示。

(2)将编绎生成的gpiodrv.o和gpio_test用NFSmount到/tmp目录下。

(方法参考实验三---通过NFS进入映射)

#mount192.168.3.111:

/s3c2410/tmp

#cd/tmp

#cd/gpiodrv

(3)加载设备驱动gpiodrv.o模块:

insmodgpiodrv.o

如果加载成功,可以通过cat/proc/devices命令查看该设备的相关信息。

卸载该设备驱动模块的命令是:

rmmodgpiodrv

(4)建立gpio设备节点:

mknod/dev/gpioc2200/dev/gpio为该设备驱动程序的设备名,C表明该设备为字符设备,220为该设备的主设备好,0为从设备号。

(5)执行gpio_test程序:

./gpio_test

(6)在minicon终端选择1,回车,可以看到4个LED灯轮流闪烁。

选择2,则退出程序的运行。

(7)将应用程序添加根文件系统,并烧写到开发板。

◆将FS2410XP_camare_demo.cramfs拷贝到/s3c2410目录下。

◆在该目录下建立两个文件:

#cd/s3c2410/

#mkdirchang

#mkdirguo

◆将FS2410XP_camare_demo.cramfs挂接到chang目录。

#mount-oloopFS2410XP_camare_demo.cramfschang

◆将chang目录下的内容压缩。

#cdchang

#tar-cvf/s3c2410/1.tar./

这时,将在chang的目录产生一个1.tar的包。

#cd..

#

mv1.targuo

#cdguo

#tar-xvf1.tar#rm1.tar

rm:

是否删除一般文件“1.tar”?

y

◆将自已的gpiodrv.o和gpio_test拷贝到相应的目录下。

将gpiodrv.o拷贝到guo/usr/目录下

将gpio_test拷贝到guo/bin下

◆现在开始制作cramfs根文件系统

./mkcramfs/s3c2410/guoFS2410XP_camare_demo.cramfs

◆下载FS2410XP_camare_demo.cramfs根文件系统到开发板:

★使用tftpcmd网络传输,设置宿主机IP地址,将其地址与开发平台的IP地址设置在同一网段内。

这里,将PC的IP设为192.168.0.121。

并把

tftpcmd复制到/bin文件夹下。

★#cd/s3c2410/guo

★新建一个down文件

#vidown

tftpcmd202.193.9.2169putFS2410XP_camare_demo.cramfs

★改变down的属性

#chmod777down

★改变tftpcmd的属性

#chmod777/bin/tftpcmd

★将开发板与PC机用交叉网线连接好,复位开发板,按住A键,进入BIOS

命令行状态提示符:

(minicom)

\>netload

★#./down

或是双击down批处理文件,选择在终端运行,可以看到内核映像下载到了开发板。

★传输完后,再输入命令“nfprog”,然后回车,然后输入“2”选择第

二个区块,输入“Y”确认将文件烧写到nandflash中。

◆重复操作(3),(4),(5),(6),可看到实验结果。

驱动模块makefile文件编写求助

自己编的一个linux驱动,我原来的工程目录是这样的:

工程总目录下有一个include文件夹,所有的.c源文件,makefile文件,还有一个总的x.h头文件,x.h中include了include文件夹中所有的头文件和一些内核的头文件。

include文件夹里有几个子文件夹,按类放头文件。

每个.c源文件都#include"x.h"。

下面是原来的makefile文件。

在工程总目录下make可以生成.ko文件。

KERNELDIR:

=/arm/linux-2.6.22.19

PWD:

=$(shellpwd)

CFLAGS=-fno-common

CROSS_COMPILE=/arm/3.4.1/bin/arm-linux-

CC=$(CROSS_COMPILE)gcc

OBJECTS:

=a.ob.oc.od.oe.o

obj-m:

=mydriver.o

mydriver-objs:

=$(OBJECTS)

default:

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

clean:

rm-rf*.o*.ko*.mod.o*.mod.c

现在工程的文件越来越多,很乱。

我想建立这样的工程目录:

工程总目录下有:

include文件夹,src文件夹,makefile文件。

include文件夹和src文件夹下都有几个子文件夹,都按类放好头文件或源文件。

x.h头文件也放在include文件夹下。

应该怎么来写makefile。

怎么样在驱动模块的makefile中指定头文件、源文件的目录?

是否还需要指定内核头文件的目录?

大家帮我看看!

谢谢!

编译驱动模块

2009-07-2910:

45

有两种方法可以编译自己写的驱动程序。

第一种方法:

直接加入内核

1.将驱动程序放入内核相应的驱动文件夹,例如名字为my_led.c

2.修改此驱动目录下的Kconfig文件,加入对该驱动文件的配置选项:

configMY_LED

bool"S3C2410LEDDriver"   

depensonARCH_S3C2410

help

LEDdriverforthesamsungs3c2410

说明:

my_LED是配置选项标题

bool表示该选项要么是y要么是n,不可编译成模块。

如需要编译成模块则改为tristate(三态)

3.修改此驱动目录下的Makefile文件,加入对驱动源码的编译:

obj-$(CONFIG_MY_LED)+=my_led.o

第二种方法:

单独编译驱动模块

(1)

1.下载内核源代码,选择和你的驱动相同的平台的配置文件进行编译,

假设路径为/root/linux-2.6.29。

或者利用/usr/src下面的源码,这样就只能编译主机平台上的驱动。

2.将驱动文件放在一目录下,例如/root/dirver/my_led.c

3.在/root/driver下编写Makefile文件,内容为:

obj-m:

=my_led.o

如果这个模块包含多个.c文件,则如下编写Makefile:

obj-m:

=module_name.o

module-objs:

=file1.ofile2.o...

4.在本目录下执行:

make-C/root/linux-2.6.29M=$(pwd)modules

第三种方法:

单独编译驱动模块

(2)

直接编写Makefile文件:

obj-m:

=led.o

CURRENT_PATH:

=$(shellpwd)

ARM_LINUX_KERNEL:

=/root/linux-2.6.29

all:

$(MAKE)-C$(ARM_LINUX_KERNEL)M=$(CURRENT_PATH)modules

clean:

rm-rf.*.cmd*.o*.mod.c*.ko.tmp_versionsModule.symvers.Makefile.swpmodules.order

运行make即可

Linux下LED驱动的开发笔记

Linux2010-07-0615:

52:

15阅读17评论0  字号:

大中小 订阅

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

//#include

#include//arm-linux-gcc编译器包含的头文件

//#include

//#include

#includearm-linux-gcc编译器包含的头文件

#includearm-linux-gcc编译器包含的头文件

MODULE_LICENSE("DualBSD/GPL");

//#defineLED_DRIVER"utu2440LEDDriverv1.00"

#defineGPIO_LED_MAJOR0//主设备号,如果为0的话,由系统自动分配

//#defineEINVAL22

/*staticunsignedlongled_table[]={

S3C2410_GPF4,

S3C2410_GPF5,

S3C2410_GPF6,

S3C2410_GPF7,

};*/

//staticintled_ioctl(structinode*inode,structfile*file,

//      unsignedintcmd,unsignedlongarg);

staticintled_ioctl(structinode*inode,structfile*file,unsignedintcmd,unsignedlongarg)

{

switch(cmd)

{

case0:

{s3c2410_gpio_setpin(S3C2410_GPF4,1);

  s3c2410_gpio_setpin(S3C2410_GPF5,1);

  s3c2410_gpio_setpin(S3C2410_GPF6,1);

  s3c2410_gpio_setpin(S3C2410_GPF7,1);

  break;}

case1:

{s3c2410_gpio_setpin(S3C2410_GPF4,0);

  s3c2410_gpio_setpin(S3C2410_GPF5,0);

  s3c2410_gpio_setpin(S3C2410_GPF6,0);

  s3c2410_gpio_setpin(S3C2410_GPF7,0);

  break;}

default:

  {printk("nocmdled!

");

   return-1;

  }

}

retur

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 工作总结汇报

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1