資源簡(jiǎn)介
s3c6410簡(jiǎn)單GPIO、LED、PWR驅(qū)動(dòng)示例及使用說明。

代碼片段和文件信息
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#define?DEVICE_NAME?????“buttons“
struct?button_irq_desc?{
????int?irq;
????int?number;
????char?*name;
};
static?struct?button_irq_desc?button_irqs?[]?=?{
????{IRQ_EINT(?0)?0?“KEY0“}
????{IRQ_EINT(18)?1?“KEY1“}
};
static?volatile?char?key_values?[]?=?{‘0‘?‘0‘};
static?DECLARE_WAIT_QUEUE_HEAD(button_waitq);
static?volatile?int?ev_press?=?0;
static?irqreturn_t?buttons_interrupt(int?irq?void?*dev_id)
{
struct?button_irq_desc?*button_irqs?=?(struct?button_irq_desc?*)dev_id;
int?down;
int?number;
unsigned?tmp;
udelay(0);
number?=?button_irqs->number;
switch(number)?{
case?0:?
tmp?=?readl(S3C64XX_GPNDAT);
down?=?!(tmp?&?(1< break;
case?1:
tmp?=?readl(S3C64XX_GPLDAT);
down?=?!(tmp?&?(1?<(number?+?9)));
break;
default:
down?=?0;
}
if?(down?!=?(key_values[number]?&?1))?{
key_values[number]?=?‘0‘?+?down;
???????? ev_press?=?1;
???????? wake_up_interruptible(&button_waitq);
???? }
????return?IRQ_RETVAL(IRQ_HANDLED);
}
static?int?s3c64xx_buttons_open(struct?inode?*inode?struct?file?*file)
{
????int?i;
????int?err?=?0;
????
????for?(i?=?0;?i? if?(button_irqs[i].irq?0)?{
continue;
}
????????err?=?request_irq(button_irqs[i].irq?buttons_interrupt?IRQ_TYPE_EDGE_BOTH?
??????????????????????????button_irqs[i].name?(void?*)&button_irqs[i]);
????????if?(err)
????????????break;
????}
????if?(err)?{
????????i--;
????????for?(;?i?>=?0;?i--)?{
????if?(button_irqs[i].irq?0)?{
continue;
????}
????disable_irq(button_irqs[i].irq);
????????????free_irq(button_irqs[i].irq?(void?*)&button_irqs[i]);
????????}
????????return?-EBUSY;
????}
????ev_press?=?1;
????
????return?0;
}
static?int?s3c64xx_buttons_close(struct?inode?*inode?struct?file?*file)
{
????int?i;
????
????for?(i?=?0;?i? if?(button_irqs[i].irq?0)?{
????continue;
}
free_irq(button_irqs[i].irq?(void?*)&button_irqs[i]);
????}
????return?0;
}
static?int?s3c64xx_buttons_read(struct?file?*filp?char?__user?*buff?size_t?count?loff_t?*offp)
{
????unsigned?long?err;
????if?(!ev_press)?{
if?(filp->f_flags?&?O_NONBLOCK)
????return?-EAGAIN;
else
????wait_event_interruptible(button_waitq?ev_press);
????}
????
????ev_press?=?0;
????err?=?copy_to_user((void?*)buff?(const?void?*)(&key_values)?min(sizeof(key_values)?count));
????return?err???-EFAULT?:?min(sizeof(key_values)?count);
}
?屬性????????????大小?????日期????時(shí)間???名稱
-----------?---------??----------?-----??----
?????文件???????3925??2011-01-17?10:54??drivers\s3c6410_buttons.c
?????文件???????3866??2011-01-17?10:55??drivers\s3c6410_leds.c
?????文件???????3193??2011-01-17?10:53??drivers\s3c6410_pwm.c
????I..D...?????????0??2011-01-17?10:56??drivers
?????文件???????1242??2011-09-23?17:51??readme.txt
-----------?---------??----------?-----??----
????????????????12226????????????????????5
評(píng)論
共有 條評(píng)論