3.4  最简单的设备驱动——LED灯驱动




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);
}