打印
[嵌入式linux]

请问这句是啥意思呢?

[复制链接]
1712|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
大众牌BF|  楼主 | 2010-5-11 11:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
IO, se, AD, pi, gp
这句:
addr = (volatile unsigned int *)(GPIO_ADDR_BASE + GPIO_PORT_ADD * minor);

还有这句:
addr[GPIO_SET_OFFSET] = 1 << arg;

   


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;
}

相关帖子

沙发
ghostvip| | 2010-5-12 15:15 | 只看该作者
addr = (volatile unsigned int *)(GPIO_ADDR_BASE + GPIO_PORT_ADD * minor);
这句应该是获取要操作的IO口所在的寄存器组基地址(注:一组IO由一组寄存器来操作的)

addr[GPIO_SET_OFFSET] = 1 << arg;
这句修改IO对应的数据寄存器,即将对应的IO口拉高

使用特权

评论回复
板凳
walnutcy| | 2010-6-5 15:14 | 只看该作者
基本的C语言地址计算及附值操作,

驱动中较常见。 注意volatile不能丢。

使用特权

评论回复
地板
sinanjj| | 2010-6-7 12:39 | 只看该作者
基本的C语言地址计算及附值操作,

volatile是硬件自己可改动。

其余不解释

使用特权

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

本版积分规则

0

主题

64

帖子

1

粉丝