现在的位置: 首页 > 综合 > 正文

Linux设备驱动之《玩转GPIO》

2013年08月25日 ⁄ 综合 ⁄ 共 5790字 ⁄ 字号 评论关闭

    在Linux设备驱动之《点亮一盏LED》 中,编写了ioctl_c.h这样的头文件,在本文中将继续使用这一头文件,代码如下:

 

 

    然后则是驱动模块程序,代码如下所示:

 

    这里只说明与前面模块程序的区别,首先是ioctl_test函数

static int ioctl_test(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg)
{
    if(copy_from_user(&ioctl,arg,sizeof(GPIO_Data_S)))
    {
        return - EFAULT;
    }
    printk("/n ioctl_test");
    switch(cmd)
    {
        case GPIO_IO_SET:gpio_cfg();break;
//      case GPIO_IO_GET:;break;
        case GPIO_IO_WRITE:gpio_write();break;
        case GPIO_IO_READ:gpio_read();break;
        default:break;
    }
    return cmd;
}

这里多出了       

case GPIO_IO_SET:gpio_cfg();break;

case GPIO_IO_WRITE:gpio_write();break;
case GPIO_IO_READ:gpio_read();break;

三个函数,从名称上可以得知分别是对IO的配置和读写操作,具体是怎么实现的呢,那么马上转移到这三个函数去瞅瞅

 

static void gpio_cfg()
{
    size_t Data;
    printk("gpio_cfg start!/n");
    Data = __raw_readl(ioctl.port*0x10+S3C2410_GPACON);
    Data &= ~(3<<2*ioctl.bit);
    Data |= (ioctl.value<<2*ioctl.bit);
    __raw_writel(Data,ioctl.port*0x10+S3C2410_GPACON);
}
函数说明:这个函数是用来配置GPGCON的函数。

static void gpio_read()
{
    printk("gpio_read start!!/n");
    size_t Data_con,Data_dat;
    Data_con = __raw_readl(ioctl.port*0x10+S3C2410_GPACON);
    Data_dat = __raw_readl(ioctl.port*0x10+S3C2410_GPADAT);
    printk("%ld/n%ld/n",Data_con,Data_dat);
}
函数说明:读取GPIO函数。

static void gpio_write()
{
    printk("gpio-write start!!/n");
    size_t Data;
    Data = __raw_readl(ioctl.port*0x10+S3C2410_GPADAT);
    Data &= ~(1<<ioctl.bit);
    Data |=    (ioctl.v<<ioctl.bit);
    __raw_writel(Data,ioctl.port*0x10+S3C2410_GPADAT);
}

函数说明:写GPIO函数。 

 

下面是应用程序,这里编写应用程序就变得方便多了,需要什么IO就先配置,再读写

 

 

 

抱歉!评论已关闭.