Tiny6410 LED字符设备驱动
扫描二维码
随时随地手机看文章
1.查看用户手册
led1、led2、led3、led4连接的分别是 GPK4、GPK5、GPK6、GPK7
2、查询6410芯片手册
下面还需要3个步骤:
1、设置GPIO为OUTPUT。
将GPK4、GPK5、GPK6、GPK7设置为输出output=0001
即GPKCON0的19:28都配置为0001
2、设置GPIO的数据。
将GPKDATA的4:7位赋值为0
3、设置GPKUP为上拉。
将GPKUP的4:7位设置为10
3、代码
led_driver.c
#include/*它定义了模块的API、类型和宏(MODULE_LICENSE、MODULE_AUTHOR等等),所有的内核模块都必须包含这个头文件。*/
#include/*使用内核信息优先级时要包含这个文件,一般在使用printk函数时使用到优先级信息*/
#include
#include/*copy_to_user,copy_from_user*/
#include/*readlwritel*/
#include
#include
#include
#defineLED_MAJOR243
#defineLED_ON1
#defineLED_OFF0
#defineLED_1_ON2
#defineLED_1_OFF3
#defineLED_2_ON4
#defineLED_2_OFF5
#defineLED_3_ON6
#defineLED_3_OFF7
#defineLED_4_ON8
#defineLED_4_OFF9
staticintled_open(structinode*inode,structfile*filp)
{
unsignedtmp;
tmp=readl(S3C64XX_GPKCON);
tmp=(tmp&0x0000ffff)|0x1111ffff;
writel(tmp,S3C64XX_GPKCON);
printk("#########open######n");
return0;
}
staticintled_read(structfile*filp,char__user*buf,size_tcount,loff_t*f_pos)
{
returncount;
}
staticintled_write(structfile*filp,constchar__user*buf,size_tcount,loff_t*f_pos)
{
charwbuf[10];
unsignedtmp;
if(copy_from_user(wbuf,buf,count))
return-EFAULT;
switch(wbuf[0])
{
caseLED_ON:
tmp=readl(S3C64XX_GPKDAT);
tmp&=(0x0f);
writel(tmp,S3C64XX_GPKDAT);
printk("turnon!n");
break;
caseLED_OFF:
tmp=readl(S3C64XX_GPKDAT);
tmp|=(0xf0);
writel(tmp,S3C64XX_GPKDAT);
printk("turnoff!n");
break;
caseLED_1_ON:
tmp=readl(S3C64XX_GPKDAT);
tmp&=(0xef);
writel(tmp,S3C64XX_GPKDAT);
printk("turnoff!n");
break;
caseLED_1_OFF:
tmp=readl(S3C64XX_GPKDAT);
tmp|=(0xf0);
writel(tmp,S3C64XX_GPKDAT);
printk("turnon!n");
break;
caseLED_2_ON:
tmp=readl(S3C64XX_GPKDAT);
tmp&=(0xdf);
writel(tmp,S3C64XX_GPKDAT);
printk("turnoff!n");
break;
caseLED_2_OFF:
tmp=readl(S3C64XX_GPKDAT);
tmp|=(0xf0);
writel(tmp,S3C64XX_GPKDAT);
printk("turnon!n");
break;
caseLED_3_ON:
tmp=readl(S3C64XX_GPKDAT);
tmp&=(0xbf);
writel(tmp,S3C64XX_GPKDAT);
printk("turnoff!n");
break;
caseLED_3_OFF:
tmp=readl(S3C64XX_GPKDAT);
tmp|=(0xf0);
writel(tmp,S3C64XX_GPKDAT);
pri