您的位置:首页 > 其它

LED显示(4):使用内核IO操作及延时函数

2009-12-06 16:30 447 查看
使用内核函数

代码:

]#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/delay.h>
#include <linux/io.h>
#define LED_OE       0x20
#define LED_D        0x00
#define LED_S0       0x10
#define LED_S1       0x20
#define LEDCS        0x04
#define LED_ENABLE   0x20350000
#define UP_TRIGER    0x20360000
#define DISP_SELECT  0x20380000
#define DATA2DISP    0x20390000
#define led_enable   *(volatile unsigned char *)(FLAG_OE)
#define write_trig   *(volatile unsigned short *)(FLAG_INER)
#define disp_select  *(volatile unsigned short *)(FLAG_B)
#define data2disp    *(volatile unsigned short *)(DATA_OUT)
const unsigned int led_code[10] = {0x3f, 0x06, 0x5b, 0x4f, 0x66,
0x6d, 0x7d, 0x27, 0x7f, 0x6f};
static void led_init(void)
{
writeb((0xff & (~LED_OE)), LED_ENABLE);
ndelay(20);
}
static inline void led_delete(void)
{
writeb(0xff, LED_ENABLE);
}
static void led_display(unsigned char led_num, unsigned char data)
{
printk(KERN_INFO "led_num:%d    data:%d/n", led_num, data);
switch(led_num)
{
case 1:
writew(LED_D, DISP_SELECT);
break;
case 2:
writew(LED_S0, DISP_SELECT);
break;
case 3:
writew(LED_S1, DISP_SELECT);
break;
default:
printk("ERROR!/n");
break;
}
writew(led_code[data], DATA2DISP);
writew(0x00, UP_TRIGER);
ndelay(20);
writew(LEDCS, UP_TRIGER);
}

static int __init led_module_init(void)
{
printk(KERN_INFO "init led module /n");
led_init();
led_display(1, 1);
//mdelay(2000);
ssleep(2);
led_display(2, 2);
//msleep(2000);
ssleep(2);
return 0;
}

static void __exit led_module_exit(void)
{
printk(KERN_INFO "cleanup led module /n");
led_display(3, 3);
ssleep(2);
led_display(4, 4);
ssleep(2);
led_delete();
}

module_init(led_module_init);
module_exit(led_module_exit);
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("led display");
MODULE_AUTHOR("kfoolish");
MODULE_VERSION("V1.0");


 
1. led_init(),led_delete()中的0xff与led_display()中的0x00不知道用什么宏名称,因为根据电路说明在LED显示中只用到了其中的几位这,两个数字是起到一定的屏蔽作用,但叫MASK又觉得有点不妥。就单从led显示来说是可以叫MASK之类的,但如果从整个系统的角度来说,就不太合适了。这两个数据反正也不能随便改,也不知道怎么起个合适的名就先这么放着拉。

2. 中间的ndelay()函数前面有提到就本人的板子是可以不用的,为了看上去更加合理还是加上了,顺便也用一下ndelay()这个函数,呵呵。

3. 之前为了学习使用不同的延时函数而用了不同的函数,现将其注视掉改成ssleep(),这样更加合理。

4. io操作/arch/blackfin/include/asm/io.h中有

#define writeb(b,addr) (void)((*(volatile unsigned char *) (addr)) = (b))

#define writew(b,addr) (void)((*(volatile unsigned short *) (addr)) = (b))

#define writel(b,addr) (void)((*(volatile unsigned int *) (addr)) = (b))

该头文件包含在<linux/io.h>中,一般只要添加<linux/io.h>即可。

5. 对函数名做了一些调整,并添加更改了一些模块申明与描述。这样子更加专业一点,呵呵。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  io module delete up 360