limingth 发表于 2005-6-11 11:03:57

Learn lumit Step 10 : LED 实验

Learn lumit Step 10 :LED 显示灯实验
++++++++++++++++++++++++++++++++++++++++++++++++++++++

    这一小节的代码沿用了 Step 8/9 中的代码,但是我们会详细讲解一下
有关 led 驱动的编程原理和方法。在 led_driver.c 文件中我们实现了如下
四个接口函数:
   
int led_open( void )
函数入口参数:无
    返回值:正常返回值 0
执行流程:
1) 设置 IOPMOD 寄存器相应位为输出方向。
2) 初始化所有 led 状态为熄灭。

int led_read( char * buf, int count )
函数入口参数:buf   : 读缓冲的首地址
            count : 需要读的字节数
    返回值:正常返回值 count 表示已经读出的字节数, 出错则返回 -1
执行流程:
1) 直接将 led 内部状态的数组 led_status 的值返回给 buf 指针

int led_write( char * buf, int count )
函数入口参数:buf   : 写缓冲的首地址
            count : 需要写的字节数
    返回值:正常返回值 count 表示已经写入的字节数, 出错则返回 -1
执行流程:
1) 首先把 buf 的值赋给 led 内部状态数组 led_status。
2) 根据要写入的字节数,每个 byte 字节代表一个led灯的状态,依次设置。

int led_ioctl( unsigned int cmd, unsigned long arg )
函数入口参数:cmd   : ioctl 的入口命令名
            arg   : 命令所带参数
    返回值:正常返回值 0
执行流程:
暂时实现为空操作
   
int led_release( void )
函数入口参数:无            
    返回值:正常返回值 0
执行流程:
暂时实现为空操作


    所有在 led_api.c 中出现的 led api 编程接口,都是基于上面实现的驱动接口
实现的,这样在应用程序和驱动程序就出现了一层与硬件无关的驱动设备编程接口,
通过调用这些接口,我们就能实现更多的应用程序接口 api ,为上层用户程序提供
更多更好的功能。

    这里以 led_api 中的 led_set_value 编程接口为例,介绍一下如何使用底层接口。

/* set hex value of low-4-bits to 4 leds */
int led_set_value( int value )
{
        char buf;
        int i = 0;

        // set the i bit value to buf
        for( i = 0; i < LED_NUM; i++ )
                buf = (value & (1 << i)) ? 1 : 0 ;
       
        // write buf value back
        led_write( buf, LED_NUM );
       
        return 0;
}

    该接口的输入 value 即一个 32 位的整型数,这个整型数的每一个 bit 表示一个
led 灯的状态,因为 lumit4510 只有 4 个 led ,所以这个整型数只有低4位是有效的,
这里有效的灯数量用 LED_NUM 宏定义表示。将这个整型数的每一位提取出来,赋值给
buf。buf 取二值: 1 表示点亮;0 表示熄灭,i 的有效值最小从 0 开始。最后,
通过调用 led_driver 的驱动接口 led_write 实现对 led 灯的控制。

    led 是一个相对简单的设备,可能大家会觉得建立这么一个复杂机制来实现对它的
控制是没有多大必要的。我想,当同时需要在三块不同的开发板上实现一个跑马灯效果
的演示程序时,结构清晰,层次分明,接口简单,代码易读是每一个开发者所希望的,
能大大提高编程的效率和实现的乐趣。
页: [1]
查看完整版本: Learn lumit Step 10 : LED 实验