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

来源:互联网 发布:办公室做数据是做什么 编辑:程序博客网 时间:2024/06/06 03:37

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

}

原创粉丝点击