資源簡介
OK6410 linux混雜設備驅動LED程序,使用3.0.1內核編譯,還有驅動源碼、Makefile和測試程序

代碼片段和文件信息
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?“led.h“
#define?DEVICE_NAME?“LED“
static?int?led_open(struct?inode?*inodestruct?file?*filp)
{
unsigned?int?tmp;
tmp?=?readl(S3C64XX_GPMCON);
tmp?=?(tmp?&?~(0xFFFFU))?|?(0x1111U);
writel(tmpS3C64XX_GPMCON);
tmp?=?readl(S3C64XX_GPMDAT);
tmp?|=?(0xFU);
writel(tmpS3C64XX_GPMDAT);
printk(“configure?led?init\n“);
return?0;
}
static?ssize_t?led_read(struct?file?*filpchar?__user?*bufsize_t?countloff_t?*f_pos)
{
unsigned?int?tmp;
tmp?=?readl(S3C64XX_GPMDAT);
if(copy_to_user(buf&tmp1))
{
printk(“led?read?copy?to?user?fail\n“);
return?-EFAULT;;
}
return?0;
}
static?ssize_t?led_write(struct?file?*filpconst?char?__user?*bufsize_t?countloff_t?*f_pos)
{
char?wbuf[10]; //防止傳遞下來數據過多
unsigned?int?tmp;
copy_from_user(wbufbufcount);
wbuf[0]?=?wbuf[0]&0xFU;
tmp?=?readl(S3C64XX_GPMDAT);
tmp?=?(tmp?&?~(0xFU))?|?(~wbuf[0]);
writel(tmpS3C64XX_GPMDAT);
return?count;
}
static?int?led_release(struct?inode?*inodestruct?file?*filp)
{
printk(“#########led?module?release########\n“);
return?0;
}
static?long?led_ioctl?(struct?file?*filp?unsigned?int?cmd?unsigned?long?arg)
{
int?err?=?0;
unsigned?int?tmp?=?0;
int?count?=?0;
?/*?檢測命令的有效性?*/
???? if?(_IOC_TYPE(cmd)?!=?LED_IOC_MAGIC)?
???????? return?-EINVAL;
???? if?(_IOC_NR(cmd)?>?LED_IOC_MAXNR)?
???????? return?-EINVAL;
?/*?根據命令類型,檢測參數空間是否可以訪問?*/
???? if?(_IOC_DIR(cmd)?&?_IOC_READ)
???????? err?=?!access_ok(VERIFY_WRITE?(void?*)arg?_IOC_SIZE(cmd));
???? else?if?(_IOC_DIR(cmd)?&?_IOC_WRITE)
???????? err?=?!access_ok(VERIFY_READ?(void?*)arg?_IOC_SIZE(cmd));
???? if?(err)?
???????? return?-EFAULT;
switch(cmd)
{
case?LED_LEFT:
for(count?=?1;count<32;)
{
if(count<16)
{
tmp?=?readl(S3C64XX_GPMDAT);
tmp?=?(tmp?&?~(0xFU))?|?(~count);
writel(tmpS3C64XX_GPMDAT);
}
else
{
tmp?=?readl(S3C64XX_GPMDAT);
tmp?=?(tmp?&?~(0xFU));
writel(tmpS3C64XX_GPMDAT);
}
msleep(200);
count?=?count?*?2;
}
break;
case?LED_RIGHT:
for(count?=?8;count!=0;)
{
tmp?=?readl(S3C64XX_GPMDAT);
tmp?=?(tmp?&?~(0xFU))?|?(~count);
writel(tmpS3C64XX_GPMDAT);
msleep(200);
count?=?count?/?2;
}
break;
case?LED_COUNT:
for(count?=?0;count<16;)
{
tmp?=?readl(S3C64XX_GPMDAT);
tmp?=?(tmp?&?~(0xFU))?|?(~count);
writel(tmpS3C64XX_GPMDAT);
msleep(200);
count++;
}
break;
default:
return?-EINVAL;
}
return?0;
}
struct?file_operations?led_fops?=?{
.owner?=?THIS_MODULE
.open?=?led_open
.wri
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????3725??2012-08-20?23:09??led\led.c
?????文件????????295??2012-08-20?22:45??led\led.h
?????文件??????76637??2012-08-20?23:09??led\led.ko
?????文件???????5985??2012-08-20?23:09??led\test
?????文件????????762??2012-08-20?23:09??led\test.c
?????目錄??????????0??2012-08-21?12:08??led
-----------?---------??----------?-----??----
????????????????87404????????????????????6
- 上一篇:STC單片機讀取AT24C02程序
- 下一篇:run_program.sh
評論
共有 條評論