大众牌BF 发表于 2010-5-11 11:18

请问这句是啥意思呢?

这句:
addr = (volatile unsigned int *)(GPIO_ADDR_BASE + GPIO_PORT_ADD * minor);

还有这句:
addr = 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 = 1 << arg;
      break;
    case GPIO_CLR_PIN:
      if(arg < 32)   
            addr = 1 << arg;
      break;
    case GPIO_SET_PINS:
      addr = arg;   
      break;
    case GPIO_CLR_PINS:
      addr = arg;
      break;
    case GPIO_DIR_IN:
      if(arg < 32)
            addr &= ~(1 << arg);
      break;
    case GPIO_DIR_OUT:
      if(arg < 32)
            addr |= 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 = 1 << arg;
这句修改IO对应的数据寄存器,即将对应的IO口拉高

walnutcy 发表于 2010-6-5 15:14

基本的C语言地址计算及附值操作,

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

sinanjj 发表于 2010-6-7 12:39

基本的C语言地址计算及附值操作,

volatile是硬件自己可改动。

其余不解释
页: [1]
查看完整版本: 请问这句是啥意思呢?