(五)4 写个简单的LED驱动

一、实现硬件操作函数


一般的,我写驱动的时候,我会先确定一些基本的硬件操作函数能够使用。LED驱动我要实现三个操作:配置、开灯和关灯,所以我先要实现这几个硬件操作函数。

其实这些在我介绍IO内存时已经实现了(5th_mm_2/3rd/test.c),我只是稍作了一点修改,改了一下内存的数据类型,其实没什么大出入。

/*5th_mm_4/1st/test.c*/

1 #include

2 #include

3

4 #include

5 #include

6

7 unsigned long virt, phys;

8 unsigned long gpecon, gpedat, gpeup; //其实我就改了这里的数据类型,其实都是用来存放地址

9 unsigned long reg; //没有多大的影响。

10 struct resource *led_resource;

11

12 void s3c_led_config(void) //还将函数的名字改成好听点

13 {

14 reg = ioread32(gpecon);

15 reg &= ~(3 << 24);

16 reg |= (1 << 24);

17 iowrite32(reg, gpecon);

18

19 reg = ioread32(gpeup);

20 reg &= ~(3 << 12);

21 iowrite32(reg, gpeup);

22 }

23

24 void s3c_led_on(void)

25 {

26 reg = ioread32(gpedat);

27 reg &= ~(1 << 12);

28 iowrite32(reg, gpedat);

29 }

30

31 void s3c_led_off(void)

32 {

33 reg = ioread32(gpedat);

34 reg |= (1 << 12);

35 iowrite32(reg, gpedat);

36 }

37

38 void init_led_device(void)

39 {

40 phys = 0x56000000;

41 virt = (unsigned long)ioremap(phys, 0x0c);

42

43 gpecon = virt + 0x40;

44 gpedat = virt + 0x44;

45 gpeup = virt + 0x48;

46 }

47

48 static int __init test_init(void) //模块初始化函数

49 {

50 init_led_device();

51

52 led_resource = request_mem_region(phys, 0x0c, "LED_MEM");

53 if(NULL == led_resource){

54 printk("request mem error!\n");

55 return - ENOMEM;

56 }

57

58 s3c_led_config();

59 s3c_led_on();

60 printk("hello led!\n");

61 return 0;

62 }

63

64 static void __exit test_exit(void) //模块卸载函数

65 {

66 if(NULL != led_resource){

67 s3c_led_off();

68 iounmap((void *)virt);

69 release_mem_region(phys, 0x0c);

70 }

71 printk("bye\n");

72 }

73

74 module_init(test_init);

75 module_exit(test_exit);

76

77 MODULE_LICENSE("GPL");

78 MODULE_AUTHOR("xoao bai");

79 MODULE_VERSION("v0.1");

至于验证我就不做了,效果还是一样,加载模块灯亮,卸载模块灯灭。



二、面向对象思想——定义一个LED的结构体


上面的函数中,一大堆的全局变量实在让人看起来不舒服。我在第三章字符设备的文中介绍过,把这些变量定义在一个结构体中,方便以后引用,如函数传参

/*5th_mm_4/2nd/test.c*/

7 struct _led_t{

8 //hardware obb

9 unsigned long virt, phys;

10 unsigned long gpecon, gpedat, gpeup;

11 unsigned long reg;

12 struct resource *led_resource;

13

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、主要的显示屏IC IC(1)74HC04的作用:是一个6位反相器。 第7脚GND,电源地。 第14脚VCC,电源正极。 信号由A端输入Y端反相输出, A1与Y1为一组,其它类推。例:A1=“1”则Y1=“0”、A1=“0”则Y1=“1”,其它组功能一样。IC(2)74HC138的作用:八位二进制译十进制译码器。 第8脚GND,电源地。 第15脚VCC,电源正极 第1~3脚A、B、C,二进制输入脚。 第4~6脚片选信号控制,只有在4、5脚为“0”6脚为“1”时,才会被选通,输出受A、B、C信号控制。其它任何组合方式将不被选通,且Y0~Y7输出全“1”。通过控制选通脚来级联,使之扩展到十六位。例:G2A=0,G2B=0,G1=1,A=1,B=0,C=0,则Y0为“0”Y1~Y7为“1”。 IC(3)4HC595的作用:LED驱动芯片,8位移位锁存器。 第8脚GND,电源地。 第16脚VCC,电源正极 第14脚DATA,串行数据输入口,显示数据由此进入,必须有时钟信号的配合才能移入。第13脚EN,使能口,当该引脚上为“1”时QA~QH口全部为“1”,为“0”时QA~QH的输出由输入的数据控制。 第12脚STB,锁存口,当输入的数据在传入寄存器后,只有供给一个锁存信号才能将移入的数据送QA~QH口输出。 第11脚CLK,时钟口,每一个时钟信号将移入一位数据到寄存器。 第10脚RESET,复位口,只要有复位信号,寄存器内移入的数据将清空,显示屏不用该脚,一般接VCC。 第9脚DOUT,串行数据输出端,将数据传到下一个。 第15、1~7脚,并行输出口也就是驱动输出口,驱动LED。 IC(4)953的作用:行驱动管,功率管。其内部是两个CMOS管,1、3脚VCC,2、4脚控制脚,2脚控制7、8脚的输出,4脚控制5、6脚的输出,只有当2、4脚为“0”时,7、8、5、6才会输出,否则输出为高阻状态。 IC(5)TB62726的作用:LED驱动芯片,16位移位锁存器。 第1脚GND,电源地。 第24脚VCC,电源正极 第2脚DATA,串行数据输入 第3脚CLK,时钟输入. 第4脚STB,锁存输入. 第23脚输出电流调整端,接电阻调整 第22脚DOUT,串行数据输出 第21脚EN,使能输入其它功能与74HC595相似,只是TB62726是16位移位锁存器,并带输出电流调整功能,但在并行输出口上不会出现高电平,只有高阻状态和低电平状态。74HC595并行输出口有高电平和低电平输出.。TB62726与5026的引脚功能一样,结构相似。 二、LED显示屏常见信号的了解 1、CLK时钟信号:提供给移位寄存器的移位脉冲,每一个脉冲将引起数据移入或移出一位。数据口上的数据必须与时钟信号协调才能正常传送数据,数据信号的频率必须是时钟信号的频率的1/2倍。在任何情况下,当时钟信号有异常时,会使整板显示杂乱无章。 2、STB锁存信号:将移位寄存器内的数据送到锁存器,并将其数据内容通过驱动电路点亮LED显示出来。但由于驱动电路受EN使能信号控制,其点亮的前提必须是使能为开启状态。锁存信号也须要与时钟信号协调才能显示出完整的图象。在任何情况下,当锁存信号有异常时,会使整板显示杂乱无章。 3、EN使能信号:整屏亮度控制信号,也用于显示屏消隐。只要调整它的占空比就可以控制亮度的变化。当使能信号出现异常时,整屏将会出现不亮、暗亮或拖尾等现象。数据信号:提供显示图象所需要的数据。必须与时钟信号协调才能将数据传送到任何一个显示点。一般在显示屏中红绿蓝的数据信号分离开来,若某数据信号短路到正极或负极时,则对应的该颜色将会出现全亮或不亮,当数据信号被悬空时对应的颜色显示情况不定。 4、ABCD行信号:只有在动态扫描显示时才存在,ABCD其实是二进制数,A是最低位,如果用二进制表示ABCD信号控制最大范围是16行(1111),1/4扫描中只要AB信号就可以了,因为AB信号的表示范围是4行(11)。当行控制信号出现异常时,将会出现显示错位、高亮或图像重叠等现象。 三、常见故障处理手段(工具:万用表、电烙铁、刀片、螺丝刀、镊子……等。) 四、LED电子显示屏的维修方法判断问题必须先主后次方式的处理,将明显的、严重的先处理,小问题后处理。短路应为最高优先级。 1、电阻检测法,将万用表调到电阻档,检测一块正常的电路板的某点的到地电阻值,再检测另一块相同的电路板的同一个点测试与正常的电阻值是否有不同,若不同则就确定了问题的范围。 2、电压检测法,将万用表调到电压档,检测怀疑有问题的电路的某个点的到地电压,比较是否与正常值相似,否则确定了问题的范围。 3、短路检测法,将万用表调到短路检测挡(有的是二极管压降档或是电阻档,一般具有报警功能),检测是否有短路的现象出现,发现短路后应优先解决,使之

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值