led驱动程序Word文件下载.docx
《led驱动程序Word文件下载.docx》由会员分享,可在线阅读,更多相关《led驱动程序Word文件下载.docx(7页珍藏版)》请在冰豆网上搜索。
b.Led灯为低电平有效
(5)驱动程序如下:
#include<
linux/fs.h>
linux/init.h>
linux/miscdevice.h>
linux/delay.h>
linux/device.h>
linux/cdev.h>
asm/irq.h>
mach/gpio.h>
plat/regs-gpio.h>
plat/gpio-cfg.h>
mach/hardware.h>
linux/io.h>
#defineDEVICE_NAME"
ok6410_led"
staticints3c6410_leds_ioctl(structinode*inode,structfile*file,unsignedintcmd,unsignedlongarg)
{
unsignedlongtmp;
switch(cmd)
{
case0:
case1:
if(arg>
4)
return-EINVAL;
tmp=__raw_readl(S3C64XX_GPMDAT);
//读出GPMDAT里的数据
if(cmd)//这里cmd=1,当是第0个灯,arg=0,tmp&
=1110,
tmp&
=(~(1<
<
arg));
//上面相当于这个命令./app_led01代表第0个灯亮
else
tmp|=(1<
arg);
//这里cmd=0的,当是第0个灯,arg=0,tmp|=0001
__raw_writel(tmp,S3C64XX_GPMDAT);
//上面相当于这个命令./app_led00代表第0个灭
return0;
default:
return-EINVAL;
}
}
staticstructfile_operationss3c6410_leds_fops={
.owner=THIS_MODULE,
.ioctl=s3c6410_leds_ioctl,
};
staticstructmiscdevicemisc={
.minor=MISC_DYNAMIC_MINOR,
.name=DEVICE_NAME,
.fops=&
s3c6410_leds_fops,
staticint__inits3c6410_leds_init()
intret;
printk("
\n\n---------s3c6410_leds_init------------\n\n"
);
//gpm0-3outputmode
tmp=__raw_readl(S3C64XX_GPMCON);
tmp&
=(~0xFFFF);
//全清0
tmp|=0x1111;
//清1
__raw_writel(tmp,S3C64XX_GPMCON);
//gpm0-3output0
tmp=__raw_readl(S3C64XX_GPMDAT);
tmp|=0x10;
//低四位写0
__raw_writel(tmp,S3C64XX_GPMDAT);
misc_register(&
misc);
//注册混杂设备
printk(DEVICE_NAME"
initialized\n"
return0;
staticvoid__exits3c6410_leds_exit()
\n\n---------s3c6410_leds_exit------------\n\n"
misc_deregister(&
module_init(s3c6410_leds_init);
module_exit(s3c6410_leds_exit);
MODULE_LICENSE("
GPL"
MODULE_AUTHOR("
dachang"
(5)测试程序
stdio.h>
stdlib.h>
unistd.h>
sys/ioctl.h>
intmain(intargc,char**argv)
inton;
intled_num;
intfd;
if(argc!
=3||sscanf(argv[1],"
%d"
&
led_num)!
=1||sscanf(argv[2],"
&
on)!
=1||on<
0||on>
1||led_num<
0||led_num>
3)
printf("
Usage:
ledsled_num0|1\n"
exit
(1);
fd=open("
/dev/leds"
0);
if(fd<
0)
perror("
opendeviceleds"
ioctl(fd,on,led_num);
close(fd);
(6)Makefile(其中linux2.6.28首先要编译好)
KERN_DIR=/root/linux2.6.28
all:
make-C$(KERN_DIR)M=`pwd`modules
clean:
make-C$(KERN_DIR)M=`pwd`modulesclean
rm-rfmodules.order
obj-m+=led_dev.o
(7)由于是混杂设备,不需要创建设备节点
可以直接运行程序