请问这句是啥意思呢?
这句: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;
} addr = (volatile unsigned int *)(GPIO_ADDR_BASE + GPIO_PORT_ADD * minor);
这句应该是获取要操作的IO口所在的寄存器组基地址(注:一组IO由一组寄存器来操作的)
addr = 1 << arg;
这句修改IO对应的数据寄存器,即将对应的IO口拉高 基本的C语言地址计算及附值操作,
驱动中较常见。 注意volatile不能丢。 基本的C语言地址计算及附值操作,
volatile是硬件自己可改动。
其余不解释
页:
[1]