linux驱动之LEDv0--裸驱动

2300阅读 0评论2012-12-20 
分类:LINUX

一、环境:
    1.平台信息:MINI2440
    2.编译器:ARM Developer Suite v1.2
    3.参考资料:

二、驱动原理:

MINI2440上四盏led的电路原理图如下:

MINI2440led设备的连接图:

驱动原理:

led的电路原理图看,如果nLED_nn=1234)端接高电平时,led将处于熄灭状态;如果nLED_nn=1234)端接低电平时,led将被点亮。而从LED设备与MINI2440的连接图可以看出,nLED_n端的电平高低受MINI2440GPIO口控制,其对应关系如下:

LED

GPIO

Led1

GPB5

Led2

GPB6

Led3

GPB7

Led4

GPB8

因此只要能够控制CPUGPIO口输出高低电平就可以控制led灯的熄灭,这也就是led裸驱动的原理。

S3C2440中,GPB代表了一组有11GPIO(即从GPB0~GPB10)GPIO口组, 每个GPIO口除了输入输出功能外,还有其他的复用功能,因此在使用GPIO口前需要先选择是使用GPIO的输入输出功能还是复用功能;此外,S3C2440GPIO口内部配有可供用户配置的上拉电阻功能。具体而言,对GPB的控制具体为对以下三个寄存器的控制:

GPBCON配置使用GPIO口的输入输出功能还是复用功能;使用输入输出功能时,是使用输出功能还是输入功能。

GPBDAT数据寄存器。输出功能时通过向该寄存器写数据控制对应pin脚的高低电平,输入功能时通过读取该寄存器获取给pin脚的高低电平状态该寄存器的010bit位对应GPB0~GPB10

GPBUP上拉电阻配置寄存器。

程序流程图:

代码分析:

点击(此处)折叠或打开

  1. 1.led_init
  2. /*
  3. * led初始化函数,配置led相关的GPIO
  4. */
  5. void led_init(void)
  6. {
  7.     /*1设置GPB5-GPB8口为输出功能*/
  8.     /*1.1清零*/
  9.     rGPBCON &= ~((3<<10)|(3<<12)|(3<<14)|(3<<16));
  10.     /*1.2置位*/
  11.     rGPBCON |= ((1<<10)|(1<<12)|(1<<14)|(1<<16));

  12.     /*2设置GPB5-GPB8口输出1,led全灭*/
  13.     rGPBDAT |= ((1<<5)|(1<<6)|(1<<7)|(1<<8));
  14. }

  15. 2. led_on
  16. /*
  17. * led点亮函数,点亮指定的led灯
  18. * index 参数指定要点亮的led,如MINI2440_LED1...
  19. */
  20. void led_on(int index)
  21. {
  22.     if(0!=(index&MINI2440_LED_ALL))
  23.     {
  24.         /*向GPBDAT寄存器写数据,以控制对应GPIO口的电平输出*/
  25.         rGPBDAT &= ~index;
  26.     }
  27. }

  28. 3. led_off
  29. /*
  30. * led熄灭函数,熄灭指定的led灯
  31. * index 参数指定要熄灭的led,如MINI2440_LED1...
  32. */
  33. void led_off(int index)
  34. {
  35.     if(0!=(index&MINI2440_LED_ALL))
  36.     {
  37.         /*向GPBDAT寄存器写数据,以控制对应GPIO口的电平输出*/
  38.         rGPBDAT |= index;
  39.     }
  40. }
至此,基于MINI2440的led裸驱动介绍完毕。

附件为完整的源码包及ADS工程文件: led.rar   

上一篇:如果你不喜欢中国大学教学,那就看看世界一流大学...
下一篇:Linux内核文档翻译:gpio.txt