在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就先配置,再读写