打印

9200gpio口按键驱动问题

[复制链接]
1579|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhangyanab|  楼主 | 2008-7-4 12:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
硬件:at91rm9200 
软件:linux
目标:9200的6个gpio口接6个按键,编写了查询方式的驱动,驱动编译通过,加载也成功,但是用测试程序测试的时候没反应。我把源码附上,请各位高手给个建议。
typedef char          S8;
typedef unsigned char U8;
typedef int           S16;
typedef unsigned int  U16;
typedef long          S32;
typedef unsigned long U32;

U8   set_cnt;

#define TIME_KEY 200

#define KK0    ((unsigned int)0x1 << 12)   //pb12 DOWN
#define KK1    ((unsigned int)0x1 << 13)   //pb13 Confirm
#define KK2    ((unsigned int)0x1 << 14) //pb14 Right
#define KK3    ((unsigned int)0x1 << 15)   //pb15,left
#define KK4    ((unsigned int)0x1 << 16)    //pb16,cancle
#define KK5    ((unsigned int)0x1 << 17)    //pb17 up

U8   KEY_FLAG = 0x00;

#define   key_PageDown_**     (0x1<<0)
#define    confirm_press_**    (0x1<<1)
#define    key_NumAdd_**     (0x1<< 2)
#define    key_NumSubb_**    (0x1<<3)
#define    cancel_press_**        (0x1<<4)
#define   key_PageUp_**        (0x1<<5)

void kdb_gpio_init(void);            //IO端口初始化
static int        major = 0;                        
static char    dev_name[] = "kdb_dev";

U8 ReadKey( void);

void Delay(U16 t)
{
    while(t--);
}

//void    Opreat_IO();

/*************************************************************************
name : void key_close(struct inode * inode, struct file * file)
**************************************************************************/
static int  kbd_close (struct inode * inode, struct file * file)
{
    printk("key is closed ");
    MOD_DEC_USE_COUNT;
    return 0;
}

/**************************************************************************
name : static int key_open(struct inode * inode, struct file * file)
****************************************************************************/
static int kbd_open(struct inode * inode, struct file * file)
{
    printk("key is open ");
    MOD_INC_USE_COUNT;
    return 0;
}

/***************************************************************************8

*************************************************************************/

static U8 kbd_read(struct file *file,char *buffer,size_t count,loff_t *ppos)
{
    U8 temp;
    temp = ReadKey();
    copy_to_user(buffer,&temp,sizeof(U8));
    return (sizeof(U8));    
}


/**********************************************************************************
name: atic int kdb_Ioctl(struct inode *inode,
                    struct file * file,
                    unsigned int cmd,
                       unsigned long arg)
function: kdb io ioput control
***********************************************************************************/
static int  kbd_Ioctl(struct inode *inode,struct file * file,unsigned long cmd,unsigned long  arg)
{
    
       return 0;
}

/********************************************************************
name : struct file_operations kdb_dev_fops
function: 文件结构
********************************************************************/
static struct file_operations kdb_dev_fops = 
{
    owner: THIS_MODULE,
    ioctl:    kbd_Ioctl,               
    open:    kbd_open,            
    release:   kbd_close,          
    read:    kbd_read,
};

/**********************************************************
name:int __int_module(void)
function:初始化模块
**********************************************************/
static devfs_handle_t devfs_handle;
static int __init kdb_init_module(void)
{
    int ret;
    ret = devfs_register_chrdev(major,dev_name,&kdb_dev_fops);
    if(ret < 0)
        {
            printk("embedder linux:init_module failed with %d ",ret);
            return ret;
        }    
        else
            printk("KERN_INFO:Embedded linux chardevice register successful! ");
        if(major == 0)
            major = ret;
         devfs_handle = devfs_register(NULL,dev_name,DEVFS_FL_DEFAULT,major,0,S_IFCHR|S_IWUSR,&kdb_dev_fops,NULL);
    AT91_SYS->PIOB_PER |= KK0 | KK1 | KK2 |KK3 |KK4 | KK5; 
             AT91_SYS->PIOB_ODR |= KK0 | KK1 | KK2 |KK3 |KK4 | KK5; 
    AT91_SYS->PMC_PCER |= (0x1 << AT91C_ID_PIOB); //enable the mck clock;                            
         return 0;        
        
}

/*******************************************************
name: __exit s_cleanup_module(void)
function:注销gpio_lcd模块
********************************************************/
static void __exit kdb_cleanup_module(void)
{
    int retv;
    retv = devfs_unregister_chrdev(major,dev_name);
    if(retv < 0)
        {
            printk("gpio_kdb unregister failed ");        
            return;
        }
    AT91_SYS->PIOB_PDR |= KK0 | KK1 | KK2 |KK3 |KK4 | KK5; 
       AT91_SYS->PIOB_IFDR |= KK0 | KK1 | KK2 |KK3 |KK4 | KK5; 
    AT91_SYS->PMC_PCDR = 0x1 << AT91C_ID_PIOB; //enable the mck clock;
    printk("kdb goodbye ");
}

module_init(kdb_init_module);
module_exit(kdb_cleanup_module);
MODULE_AUTHOR("MZ");
MODULE_LICENSE("GPL");

U8  ReadKey( )
{
U8 KK;
    KEY_FLAG = 0x00;
    KK = (AT91_SYS->PIOB_PDSR & 0x3f000);
       if((KK & KK0) == 0 )
       {
        Delay(TIME_KEY);
        if((KK & KK0) == 0 )
            KEY_FLAG |= key_PageDown_**;        
    }
    if((KK & KK1) == 0 )
       {
        Delay(TIME_KEY);
        if((KK & KK1) == 0 )
            KEY_FLAG |= confirm_press_**;        
    }
    if((KK & KK2) == 0 )
       {
        Delay(TIME_KEY);
        if((KK & KK2) == 0 )
            KEY_FLAG |= key_NumAdd_** ;        
    }
    if((KK & KK3) == 0 )
       {
        Delay(TIME_KEY);
        if((KK & KK3) == 0 )
            KEY_FLAG |= key_NumSubb_**;        
    }
    if((KK & KK4) == 0 )
       {
        Delay(TIME_KEY);
        if((KK & KK4) == 0 )
            KEY_FLAG |= cancel_press_**;        
    }
    if((KK & KK5) == 0 )
       {
        Delay(TIME_KEY);
        if((KK & KK5) == 0 )
            KEY_FLAG |= key_PageUp_**;        
    }

        return KEY_FLAG;
}

测试程序:


U8   KEY_FLAG = 0x00;
#define   key_PageDown_**     KEY_FLAG & (0x1<<0)
#define    confirm_press_**    KEY_FLAG & (0x1<<1)
#define    key_NumAdd_**     KEY_FLAG & (0x1<< 2)
#define    key_NumSubb_**    KEY_FLAG & (0x1<<3)
#define    cancel_press_**        KEY_FLAG & (0x1<<4)
#define   key_PageUp_**        KEY_FLAG & (0x1<<5)

void Delayms(int t)
{
short ms=0x1147;
short i,j;
        for(j=0;j<t;++j)
                for(i=0;i<ms;++i);
}
                                                                                
void Delay(int t)
{
        while(--t);
}

int main(void)
{
    int fd;
    int count;
    if((fd = open("/dev/kdb_dev",0)) < 0)
    {
     printf("can not open /dev/kdb_dev ");

     exit(0);
    }
     printf("kbd fd is %d ",fd);
    count = read(fd,&KEY_FLAG,sizeof(U8));
    printf("key_flag is %x ",KEY_FLAG);
        if(count != sizeof(U8))
        {
            printf("read ts error! ");
             return 0;
        }
    while(1)
     {   
       Delay(1000);
      if(confirm_press_**)
       printf("confirm key  ");
       else if(cancel_press_**    )
       printf("cancle key  ");
       else if( key_PageDown_**)
      printf("page down  ");
      else if(key_PageUp_**)
      printf("page up ");
       else if(key_NumAdd_**)
      printf("confirm key  ");
       else if(key_NumSubb_**)
       printf("confirm key  ");
        else ;
}

测试程序循环执行,但是终端只显示confirm key ,各位高手看下是什么原因。 

相关帖子

沙发
zhangyanab|  楼主 | 2008-7-4 13:35 | 只看该作者

re:

沉的真快啊。各位给看看。。。

使用特权

评论回复
板凳
wangkj| | 2008-7-4 14:11 | 只看该作者

比较复杂,没看明白

使用特权

评论回复
地板
wangkj| | 2008-7-4 15:55 | 只看该作者

看来,确实不简单

得好好看看才能搞明白

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

6

帖子

0

粉丝