亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区
Chinaunix
標(biāo)題:
今天小心奕奕的把代碼拷出來,是個(gè)按鍵驅(qū)動(dòng),大家?guī)兔匆幌?
[打印本頁]
作者:
0vk0
時(shí)間:
2011-03-04 19:46
標(biāo)題:
今天小心奕奕的把代碼拷出來,是個(gè)按鍵驅(qū)動(dòng),大家?guī)兔匆幌?br />
本帖最后由 0vk0 于 2011-03-04 19:50 編輯
是個(gè)按鍵驅(qū)動(dòng),大家?guī)兔匆幌拢F(xiàn)在按鍵抬起可以檢測到,但再按別的
我測試時(shí)老是出現(xiàn):
當(dāng)換一個(gè)按鍵時(shí),會(huì)出現(xiàn)前一個(gè)按鍵,比如我按1時(shí),按下會(huì)打印1,抬起會(huì)打印1,當(dāng)我換按2時(shí),第一遍按下會(huì)打印1,抬起會(huì)打印2,再第二遍的時(shí)候就不會(huì)了
當(dāng)我換按5時(shí),第一遍按下會(huì)打印2,抬起會(huì)打印5,再第二遍的時(shí)候也不會(huì)了,請幫幫忙看下程序,謝謝了,第二個(gè)是應(yīng)該層的測試程序
#include <asm/gpio.h>
#include <asm/jzsoc.h>
……
#define DEVICE_NAME "keypad"
#define MAX_KEY_COUNT 32
#define HC164_CP 89 //kb2
#define HC164_DS 88 //kb1
#define INT_KEY1 93 //kb3
#define INT_KEY2 91 //kb4
#define KEY1_IRQ (IRQ_GPIO_0 + INT_KEY1)
#define KEY2_IRQ (IRQ_GPIO_0 + INT_KEY2)
typedef struct
{
unsigned long jiffy[MAX_KEY_COUNT];
unsigned char buf[MAX_KEY_COUNT];
unsigned int head,tail;
}KEY_BUFFER;
static KEY_BUFFER g_keyBuffer;
static spinlock_t buffer_lock;
static int Keypad_major = 255;
int a=200,b=201;
/*
*/
static unsigned long GetTickCount(void)
{
struct timeval currTick;
unsigned long ulRet;
do_gettimeofday(&currTick);
ulRet = currTick.tv_sec;
ulRet *= 1000;
ulRet += (currTick.tv_usec + 500) / 1000;
return ulRet;
}
/*
*/
static void init_keybuffer(void)
{
int i;
spin_lock_irq(&buffer_lock);
g_keyBuffer.head = 0;
g_keyBuffer.tail = 0;
for(i = 0; i < MAX_KEY_COUNT; i++)
{
g_keyBuffer.buf[i] = 0;
g_keyBuffer.jiffy[i] = 0;
}
spin_unlock_irq(&buffer_lock);
}
/*
*/
static void remove_timeoutkey(void)
{
unsigned long ulTick;
spin_lock_irq(&buffer_lock);
while(g_keyBuffer.head != g_keyBuffer.tail)
{
ulTick = GetTickCount() - g_keyBuffer.jiffy[g_keyBuffer.head];
if (ulTick < 5000)
break;
g_keyBuffer.buf[g_keyBuffer.head] = 0;
g_keyBuffer.jiffy[g_keyBuffer.head] = 0;
g_keyBuffer.head ++;
g_keyBuffer.head &= (MAX_KEY_COUNT -1);
}
spin_unlock_irq(&buffer_lock);
}
/*
*/
void _74HC164Send(unsigned char d)
{
int j;
for(j=0;j<8;j++)
{
if (d&1)
__gpio_set_pin(HC164_DS);
else
__gpio_clear_pin(HC164_DS);
mdelay(1);
__gpio_set_pin(HC164_CP);
mdelay(1);
__gpio_clear_pin(HC164_CP);
d >>= 1;
}
}
/*
*/
static void init_gpio(void)
{
__gpio_as_input(INT_KEY1);
__gpio_as_input(INT_KEY2);
__gpio_as_output(HC164_CP);
__gpio_as_output(HC164_DS);
__gpio_clear_pin(HC164_CP);
__gpio_clear_pin(HC164_DS);
_74HC164Send(0);
}
/*
*/
static __inline void enable_irqs(void)
{
unsigned long flags;
spin_lock_irqsave(buffer_lock, flags);
__gpio_unmask_irq(INT_KEY1);
__gpio_unmask_irq(INT_KEY2);
spin_unlock_irqrestore(buffer_lock, flags);
}
/*
*/
static __inline void disable_irqs(void)
{
unsigned long flags;
spin_lock_irqsave(buffer_lock, flags);
__gpio_mask_irq(INT_KEY1);
__gpio_mask_irq(INT_KEY2);
spin_unlock_irqrestore(buffer_lock, flags);
}
/*
*/
static unsigned char num = 0;
static __inline unsigned char button_scan(int irq)
{
unsigned char ret=0xff;
unsigned char i;
if(!(__gpio_get_pin(INT_KEY1)))
{
for(i=1;i<9;i++)
{
printk("i=%d\n",i);
__gpio_set_pin(HC164_DS);
mdelay(1);
__gpio_set_pin(HC164_CP);
mdelay(1);
__gpio_clear_pin(HC164_CP);
if(__gpio_get_pin(INT_KEY1))
{
num=i; //此處改動(dòng)過
return i;
}
}
}
else
{
if(!(__gpio_get_pin(INT_KEY2)))
{
for(i=1;i<9;i++)
{
printk("key2 i=%d\n",i);
__gpio_set_pin(HC164_DS);
mdelay(1);
__gpio_set_pin(HC164_CP);
mdelay(1);
__gpio_clear_pin(HC164_CP);
if(__gpio_get_pin(INT_KEY2))
{
num=i+8; //此處改動(dòng)
return i;
}
}
}
}
return ret ;
}
/*
*
*/
static irqreturn_t button_down_irq(int irq, void *dev_id)
{
unsigned char ucKey;
disable_irqs();
udelay(1000);
ucKey = button_scan(irq);
if ((ucKey >= 1) && (ucKey <= 16))
{
if (((g_keyBuffer.head + 1) & (MAX_KEY_COUNT - 1)) != g_keyBuffer.tail)
{
spin_lock_irq(&buffer_lock);
g_keyBuffer.buf[g_keyBuffer.tail] = ucKey;
g_keyBuffer.jiffy[g_keyBuffer.tail] = GetTickCount();
g_keyBuffer.tail ++;
g_keyBuffer.tail &= (MAX_KEY_COUNT - 1);
spin_unlock_irq(&buffer_lock);
}
}
_74HC164Send(0);
__gpio_ack_irq(INT_KEY1); // clear status
__gpio_ack_irq(INT_KEY2); // clear status
enable_irqs();
return IRQ_HANDLED;
}
static irqreturn_t button_rise_irq(int irq, void *dev_id)
{
unsigned char ucKey;
disable_irqs();
udelay(1000);
ucKey = num;
// *****************************
buttonup_scan();
if ((ucKey >= 1) && (ucKey <= 16))
{
if (((g_keyBuffer.head + 1) & (MAX_KEY_COUNT - 1)) != g_keyBuffer.tail)
{
spin_lock_irq(&buffer_lock);
g_keyBuffer.buf[g_keyBuffer.tail] = ucKey;
g_keyBuffer.jiffy[g_keyBuffer.tail] = GetTickCount();
g_keyBuffer.tail ++;
g_keyBuffer.tail &= (MAX_KEY_COUNT - 1);
spin_unlock_irq(&buffer_lock);
}
}
_74HC164Send(0);
__gpio_ack_irq(INT_KEY1); // clear status
__gpio_ack_irq(INT_KEY2); // clear status
enable_irqs();
return IRQ_HANDLED;
}
/*
*
*/
static int request_irqs(void)
{
__gpio_as_irq_fall_edge(INT_KEY1); //下降沿發(fā)生中斷
__gpio_as_irq_fall_edge(INT_KEY2);
__gpio_as_irq_rise_edge(INT_KEY1); //上升沿發(fā)生中斷
__gpio_as_irq_rise_edge(INT_KEY2);
if(request_irq(KEY1_IRQ, button_rise_irq, IRQF_DISABLED | IRQF_SHARED, DEVICE_NAME, &a)){
printk("Could not allocate key1 IRQ:%d\n",KEY1_IRQ);
return -EINVAL;
}
if(request_irq(KEY2_IRQ, button_rise_irq, IRQF_DISABLED | IRQF_SHARED, DEVICE_NAME, &a)){
free_irq(KEY1_IRQ, &a);
printk("Could not allocate key2 IRQ:%d\n",KEY2_IRQ);
return -EINVAL;
}
if(request_irq(KEY1_IRQ, button_down_irq, IRQF_DISABLED | IRQF_SHARED, DEVICE_NAME, &b)){
printk("Could not allocate key1 IRQ:%d\n",KEY1_IRQ);
return -EINVAL;
}
if(request_irq(KEY2_IRQ, button_down_irq, IRQF_DISABLED | IRQF_SHARED, DEVICE_NAME, &b)){
free_irq(KEY1_IRQ, &b);
printk("Could not allocate key2 IRQ:%d\n",KEY2_IRQ);
return -EINVAL;
}
__gpio_ack_irq(INT_KEY1); // clear status
__gpio_ack_irq(INT_KEY2); // clear status
return 0;
}
/*
*
*/
static __inline void free_irqs(void)
{
free_irq(KEY1_IRQ, &a);
free_irq(KEY1_IRQ, &b);
free_irq(KEY2_IRQ, &a);
free_irq(KEY2_IRQ, &b);
}
/*
*
*/
static int keypad_open(struct inode *inode,struct file *filp)
{
int ret = nonseekable_open(inode, filp);
if (ret >= 0)
{
printk("keypad opened ret>0.\n");
init_keybuffer();
enable_irqs();
}
printk("keypad opened.\n");
return ret;
}
/*
*
*/
static int keypad_release(struct inode *inode,struct file *filp)
{
disable_irqs();
printk("keypad release.\n");
return 0;
}
/*
*
*/
static ssize_t keypad_read(struct file *filp, char *buffer, size_t count, loff_t *ppos)
{
ssize_t ret = 0;
remove_timeoutkey();
spin_lock_irq(&buffer_lock);
while((g_keyBuffer.head != g_keyBuffer.tail) && (((size_t)ret) < count) )
{
buffer[ret] = (char)(g_keyBuffer.buf[g_keyBuffer.head]);
g_keyBuffer.buf[g_keyBuffer.head] = 0;
g_keyBuffer.jiffy[g_keyBuffer.head] = 0;
g_keyBuffer.head ++;
g_keyBuffer.head &= (MAX_KEY_COUNT - 1);
ret ++;
}
spin_unlock_irq(&buffer_lock);
return ret;
}
/*
*
*/
static int keypad_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
{
init_keybuffer();
return 1;
}
/*
*/
static void led_setup_cdev(struct cdev *dev,int minor,struct file_operations *fops)
{
int err;
int devno=MKDEV(Keypad_major,minor);
cdev_init(dev,fops);
dev->owner=THIS_MODULE;
dev->ops=fops;
err=cdev_add(dev,devno,1);
if(err)
printk(KERN_INFO"Error %d adding button %d\n",err,minor);
}
/*
*/
static struct file_operations keypad_fops =
{
.owner = THIS_MODULE,
.ioctl = keypad_ioctl,
.open = keypad_open,
.read = keypad_read,
.release = keypad_release,
};
static struct cdev SimpleDevs;
/*
*
*/
static int KeyPad_Init(void)
{
int ret;
int result;
dev_t dev;
dev=MKDEV(Keypad_major,0);
if(Keypad_major)
result=register_chrdev_region(dev,1,DEVICE_NAME);
else
{
result=alloc_chrdev_region(&dev,0,1,DEVICE_NAME);
Keypad_major=MAJOR(dev);
}
if(result<0)
{
printk(KERN_WARNING"Keypad:unable to get major %d\n",Keypad_major);
return result;
}
if(Keypad_major==0)
Keypad_major=result;
led_setup_cdev(&SimpleDevs,0,&keypad_fops);
init_gpio();
ret = request_irqs();
if (ret < 0)
{
cdev_del(&SimpleDevs);
unregister_chrdev_region(MKDEV(Keypad_major,0),1);
return ret;
}
printk(KERN_INFO"keypad register ok!!!!!!!!!!\n");
return 0;
}
/*
*
*/
static void __exit KeyPad_Exit(void)
{
disable_irqs();
free_irqs();
cdev_del(&SimpleDevs);
unregister_chrdev_region(MKDEV(Keypad_major,0),1);
printk("button device uninstalled\n");
}
module_init(KeyPad_Init);
module_exit(KeyPad_Exit);
MODULE_AUTHOR("zhyh");
MODULE_DESCRIPTION("keypad driver");
MODULE_LICENSE("GPL");
復(fù)制代碼
作者:
dreamice
時(shí)間:
2011-03-05 11:35
你這個(gè)很難說出什么問題,程序本身估計(jì)沒什么問題,與處理邏輯可能關(guān)系很大
作者:
0vk0
時(shí)間:
2011-03-07 19:49
你這個(gè)很難說出什么問題,程序本身估計(jì)沒什么問題,與處理邏輯可能關(guān)系很大
dreamice 發(fā)表于 2011-03-05 11:35
if(request_irq(KEY1_IRQ, button_rise_irq, IRQF_DISABLED | IRQF_SHARED, DEVICE_NAME, &a)){
printk("Could not allocate key1 IRQ:%d\n",KEY1_IRQ);
return -EINVAL;
}
復(fù)制代碼
這里是否正確 ,我這里IRQF_DISABLED | IRQF_SHARED換成IRQF_TRIGGER_FALLING | IRQF_DISABLED |和IRQF_TRIGGER_FALLING |IRQF_DISABLED ,就會(huì)出現(xiàn)insmod: cannot insert 'key.ko': invalid parameter ,我知道是dev_id這里錯(cuò)誤,但是我應(yīng)該怎么改,請大蝦賜教
作者:
jn200002
時(shí)間:
2011-03-09 16:35
首先
struct button_irq_desc {
int irq;
int gpio;
};
static struct button_irq_desc button_irqs [] = {
{IRQ_EINTx, GPx0(x)}, /* K1 */
{xxxxxxxxxxxxxxxxx} , /*K2*/
...
};
然后把你的申請寫成個(gè)循環(huán)
其次,參數(shù)寫成 IRQF_SHARED | IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING,
處理所謂按下抬起,在一個(gè)中斷處理里做就可以了。
最后,你去看看gpio_keys.c
內(nèi)核是最好的老師,抄吧。不是非得寫的跟內(nèi)核不一樣才能彰顯代碼的個(gè)性……
歡迎光臨 Chinaunix (http://72891.cn/)
Powered by Discuz! X3.2