LED驱动程序.docx
- 文档编号:11945506
- 上传时间:2023-04-16
- 格式:DOCX
- 页数:40
- 大小:35.98KB
LED驱动程序.docx
《LED驱动程序.docx》由会员分享,可在线阅读,更多相关《LED驱动程序.docx(40页珍藏版)》请在冰豆网上搜索。
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
//#include
//#include
#include
#include
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- LED 驱动程序