[ZLG-ARM] 有关gpio驱动问题

[复制链接]
2563|7
 楼主| 大众牌BF 发表于 2010-5-9 19:39 | 显示全部楼层 |阅读模式
reg=(volatile u32 *)(GPIO_ADDR_BASE+GPIO_PORT_ADD*num);
请问这句话什么意思呢?
五谷道场 发表于 2010-5-9 20:12 | 显示全部楼层
在哪里面得?
jonjie 发表于 2010-5-9 20:25 | 显示全部楼层
读 页地址+偏移量 ?外部存储设备?
llljh 发表于 2010-5-9 20:36 | 显示全部楼层
在哪看的?
 楼主| 大众牌BF 发表于 2010-5-10 16:46 | 显示全部楼层
addr = (volatile unsigned int *)(GPIO_ADDR_BASE + GPIO_PORT_ADD * minor);
    switch(cmd){
    case GPIO_SET_PIN:
        if(arg < 32)
            addr[GPIO_SET_OFFSET] = 1 << arg;
        break;
    case GPIO_CLR_PIN:
        if(arg < 32)   
            addr[GPIO_CLR_OFFSET] = 1 << arg;
        break;
    case GPIO_SET_PINS:
        addr[GPIO_SET_OFFSET] = arg;   
        break;
    case GPIO_CLR_PINS:
        addr[GPIO_CLR_OFFSET] = arg;
        break;
    case GPIO_DIR_IN:
        if(arg < 32)
            addr[GPIO_DIR_OFFSET] &= ~(1 << arg);
        break;
 楼主| 大众牌BF 发表于 2010-5-10 16:47 | 显示全部楼层
一个GPIO的程序,小弟很菜,发帖都不规范,见谅了~
 楼主| 大众牌BF 发表于 2010-5-10 16:47 | 显示全部楼层
int gpio_ioctl(struct inode * inode,struct file * filp,unsigned int cmd,unsigned long arg)
{
    volatile unsigned int * addr;
    int minor = MINOR(inode->i_rdev);
    int err = -1;
//    printk(KERN_ALERT "ioctl called\n");
    if(minor > MAX_PORTS)
        return -ENODEV;
    //check magicnum
    if(_IOC_TYPE(cmd) != MAGIC_NUM)   
        return -ENOTTY;
    if(_IOC_NR(cmd) > MAX_CMDS)
        return -ENOTTY;
/*
    check read or write cmd,if 1 ,check the user buf
*/
    if(_IOC_DIR(cmd) & _IOC_READ){
        err = !access_ok(VERIFY_READ,(void __user*)arg,_IOC_SIZE(cmd));
        if(err) return -EFAULT;   
    }
    else if(_IOC_DIR(cmd) & _IOC_WRITE){
        err = !access_ok(VERIFY_WRITE,(void __user*)arg,_IOC_SIZE(cmd));
        if(err) return -EFAULT;
    }
    addr = (volatile unsigned int *)(GPIO_ADDR_BASE + GPIO_PORT_ADD * minor);
    switch(cmd){
    case GPIO_SET_PIN:
        if(arg < 32)
            addr[GPIO_SET_OFFSET] = 1 << arg;
        break;
    case GPIO_CLR_PIN:
        if(arg < 32)   
            addr[GPIO_CLR_OFFSET] = 1 << arg;
        break;
    case GPIO_SET_PINS:
        addr[GPIO_SET_OFFSET] = arg;   
        break;
    case GPIO_CLR_PINS:
        addr[GPIO_CLR_OFFSET] = arg;
        break;
    case GPIO_DIR_IN:
        if(arg < 32)
            addr[GPIO_DIR_OFFSET] &= ~(1 << arg);
        break;
    case GPIO_DIR_OUT:
        if(arg < 32)
            addr[GPIO_DIR_OFFSET] |= 1 << arg;
        break;
    case GPIO_READ_PIN:
        break;
    case GPIO_READ_PINS:
        break;
    case GPIO_WRITE_PIN:
        break;
    case GPIO_WRITE_PINS:
        break;   
    }
    return 0;
}
贾君鹏子 发表于 2010-5-10 22:50 | 显示全部楼层
不好意思,看不懂
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

64

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部