3.4 最简单的设备驱动——LED灯驱动
ARM处理系统中经常使用GPIO口驱动LED灯作为系统运行状态的指示。采用S3C2410X的GPF4脚接一个LED灯,电路原理图如图3.6所示。这个驱动无疑是ARM系统中最简单的驱动。下面介绍如何开发这个LED灯的驱动。
#define LED_SI_OUT
_raw_writel((_raw_readl(S3C2410_GPFCON)&(~(3<<8)))|(1<<8),S3C2410_GPFCON)
//设置管脚为输出
#define LED_SI_H
_raw_writel(_raw_readl(S3C2410_GPFDAT)|(1<<4),S3C2410_GPFDAT)
//输出高电平
#define LED_SI_L
_raw_writel(_raw_readl(S3C2410_GPFDAT)&(~(1<<4)),S3C2410_GPFDAT)
//输出低电平
#define COMMAND_LEDON 1
#define COMMAND_LEDOFF2
利用ioctl命令来控制LED灯:
int DEMO_ioctl(structinode *inode, struct file *filp,unsigned int cmd, unsigned
long arg)
{
if(cmd==COMMAND_LEDOFF)
{
printk("ioctlLEDOFF successfully\n");
LED_SI_H;
return 0;
}
if(cmd==COMMAND_LEDON)
{
printk("ioctlLEDON successfully\n");
LED_SI_L;
return 0;
}
printk("ioctl error\n");
return-EFAULT;
}
编译完成后,使用insmod加载驱动,然后使用mknod /dev/led c 224 0命令建立节点。应用层的测试程序代码如下:
main()
{
int fd;
int i;
char data[256];
int retval;
fd=open("/dev/led",O_RDWR);
if(fd==-1)
{
perror("error open\n");
exit(-1);
}
printf("open /dev/led successfully\n");
retval=ioctl(fd,COMMAND_LEDON,0);
if(retval==-1)
{
perror("ioctl LEDON error\n");
exit(-1);
}
sleep(10);
retval=ioctl(fd,COMMAND_LEDOFF,0);
if(retval==-1)
{
perror("ioctl LEDOFF error\n");
exit(-1);
}
close(fd);
}