不是直接操作IO寄存器,是在linux系统下完成对IO口的置位,问题是如何写linux的GPIO驱动,(关于arm9200的),我看了很多书,也分析了一些例子,这里有一个程序大家能不能帮忙给看一下。
#include
//#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
MODULE_LICENSE("GPL");
#define IOPORT_MAJOR 220 //定义主设备号
typedef char ioport_device_t;
static ioport_device_t gpio_devices[257];
#define IOWRITE 1;
#define IOCLEAR 2;
static int gpio_open(struct inode *inode,struct file *filp)
{
int minor;
minor = MINOR(inode->i_rdev);
at91_set_gpio_output(AT91_PIN_PB10,0 );
gpio_devices[minor]++;
return 0;
}
static int gpio_release(struct inode *inode,struct file *filp)
{
int minor;
minor = MINOR(inode->i_rdev);
if(gpio_devices[minor])
gpio_devices[minor]--;
return 0;
}
static int gpio_ctl_ioctl(struct inode *inode, struct file *filp, unsigned int command, unsigned long arg)
{
int err = 0;
int minor = MINOR(inode->i_rdev);
switch(command)
{
case IOWRITE:
err = at91_set_gpio_value(AT91_PIN_PB10,1);//输出高电平
break;
case IOCLEAR:
err = at91_set_gpio_value(AT91_PIN_PB10,0);//输出0电平
break;
}
return err;
}
static struct file_operations gpio_ctl_fops={
.ioctl = gpio_ctl_ioctl,
.open = gpio_open,
.release = gpio_release,
};
static int __init gpio_init(void)
{
register_chrdev(IOPORT_MAJOR ,"gpiotest",&gpio_ctl_fops);
return 0;
}
static void __exit gpio_exit(void)
{
unregister_chrdev(IOPORT_MAJOR,"gpiotest");
return 0;
}
module_init(gpio_init);
module_exit(gpio_exit);
我的测试程序:
#include
#include
#include
#include
#include
#include
#include
#include
#define DEVICE_GPIOTEST "/dev/gpiotest"
#define IOWRITE 1;
#define IOCLEAR 2;
int main()
{
int fd;
int val=-1;
if( (fd=open(DEVICE_GPIOTEST,O_RDWR | O_NONBLOCK)) < 0 )
{
perror("can not open device");
exit(1);
}
while(1)
{
printf("0:set,1:clear,2:quit;");
scanf("%d",&val);
if(val==0)
ioctl(fd,IOWRITE,0); //下面我所提到的编译出现错误位置!!!
else if(val==1)
ioctl(fd,IOCLEAR,0);
else if(val==2)
{
close(fd);
exit(1);
}
}
}
我把驱动加到内核,然后重新编译内核,没有问题。可是我在编译测试程序时,出现了错误error:parse error before ";"token,,,,这个“;”也就是ioctl所在的行,请大家帮忙分析一下,是不是我对linux下的宏使用不正确引起的,我应该怎么改才行!!!