打印
[ZLG-ARM]

有关gpio驱动问题

[复制链接]
1667|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
大众牌BF|  楼主 | 2010-5-9 19:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
五谷道场| | 2010-5-9 20:12 | 只看该作者
在哪里面得?

使用特权

评论回复
板凳
jonjie| | 2010-5-9 20:25 | 只看该作者
读 页地址+偏移量 ?外部存储设备?

使用特权

评论回复
地板
llljh| | 2010-5-9 20:36 | 只看该作者
在哪看的?

使用特权

评论回复
5
大众牌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;

使用特权

评论回复
6
大众牌BF|  楼主 | 2010-5-10 16:47 | 只看该作者
一个GPIO的程序,小弟很菜,发帖都不规范,见谅了~

使用特权

评论回复
7
大众牌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;
}

使用特权

评论回复
8
贾君鹏子| | 2010-5-10 22:50 | 只看该作者
不好意思,看不懂

使用特权

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

本版积分规则

0

主题

64

帖子

1

粉丝