在Linux设备驱动之《点亮一盏LED》 中,编写了ioctl_c.h这样的头文件,在本文中将继续使用这一头文件,代码如下:
然后则是驱动模块程序,代码如下所示:
dev=MKDEV(test_major,test_minor);
result = register_chrdev_region(dev,1,"test");
printk("major= %d,minor=%d /n",test_major,test_minor);
if(result < 0)
{
printk(KERN_INFO "test : can't get major number/n");
return result;
}
cdev_init(&cdevc,&test_fops);
cdevc.owner= THIS_MODULE;
cdevc.ops=&test_fops;
result=cdev_add(&cdevc,dev,1);
if(result)
printk("Error %d adding test",result);
return 0;
}
void simple_c_cleanup_module(void)
{
dev_t dev=0;
dev = MKDEV(test_major,test_minor);
cdev_del(&cdevc);
unregister_chrdev_region(dev,1);
}
module_init(simple_c_init_module);
module_exit(simple_c_cleanup_module);
这里只说明与前面模块程序的区别,首先是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就先配置,再读写