LED显示(4):使用内核IO操作及延时函数
2009-12-06 16:30
447 查看
使用内核函数
代码:
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. 对函数名做了一些调整,并添加更改了一些模块申明与描述。这样子更加专业一点,呵呵。
代码:
]#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. 对函数名做了一些调整,并添加更改了一些模块申明与描述。这样子更加专业一点,呵呵。
相关文章推荐
- Linux简单设备驱动(1):使用IO内存操作GPIO--LED
- Linux 内核使用毫秒延时函数
- .net micro framework的入门例程-点灯神话-6.使用定时器代替延时函数闪烁LED
- 树莓派 Learning 002 装机后的必要操作 11 解决在使用SecureCRT软件链接树莓派时,SecureCRT软件的终端中显示树莓派的中文字体乱码的问题
- openssl之BIO系列之6---BIO的IO操作函数
- 关于如何使用websocket 接收并显示图片或者操作二进制
- 显示对象列表-为什么要使用list_detail.object_list(...)视图函数
- SQL语句操作数据与一些函数使用的丰富数据库
- IO端口和IO内存的区别及分别使用的函数接口
- 使用C语言操作文件的基本函数整理
- effective C++笔记之条款27:如果不想使用隐式生成的函数就要显示地禁止它
- PHP 删除文件与文件夹操作 unlink()与rmdir()这两个函数的使用
- linux之延时及内核定时器的使用
- 一步步点亮LED5_汇编编写延时函数并实现LED闪烁效果
- [Linux流操作]使用fread和fwrite函数读写文件
- Java IO操作——专门的数据输入类Scanner(java.util工具包中)的具体使用
- 关于block使用导致键盘的延时操作
- linux 用户空间 和 内核空间 延时函数
- matlab中text 函数在显示字符串时的使用方法
- flex学习笔记 使用函数,显示实时更新的标签