Tiny6410 LED字符設(shè)備驅(qū)動
1.查看用戶手冊
led1、led2、led3、led4連接的分別是 GPK4、GPK5、GPK6、GPK7
2、查詢6410芯片手冊
下面還需要3個步驟:
1、設(shè)置GPIO為OUTPUT。
將GPK4、GPK5、GPK6、GPK7設(shè)置為輸出output=0001
即GPKCON0的19:28都配置為0001
2、設(shè)置GPIO的數(shù)據(jù)。
將GPKDATA的4:7位賦值為0
3、設(shè)置GPKUP為上拉。
將GPKUP的4:7位設(shè)置為10
3、代碼
led_driver.c
#include/*它定義了模塊的API、類型和宏(MODULE_LICENSE、MODULE_AUTHOR等等),所有的內(nèi)核模塊都必須包含這個頭文件。*/
#include/*使用內(nèi)核信息優(yōu)先級時要包含這個文件,一般在使用printk函數(shù)時使用到優(yōu)先級信息*/
#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