OK6410A学习笔记三:嵌入式Linux驱动之LED驱动

发布者:冰雪勇士最新更新时间:2016-04-12 来源: eefocus关键字:OK6410A  Linux驱动  LED驱动 手机看文章 扫描二维码
随时随地手机看文章
开发环境:
Windows7 + vmware workstation 6.5 + Ubuntu9.10
Linux Source Code: FORLINX_linux-3.0.1.tar.gz
ARM CROSS GCC: arm-linux-gcc v4.3.2
 
源码:
//s3c6410_led.c – driver file
#include
#include
#include
#include
#include
 
#define DEV_MAJOR 176
#define DEV_NAME "s3c6410_leds"
 
 
#define GPMCON 0x7F008820
#define GPMDAT 0x7F008824
#define GPMPUD 0x7F008828
 
 
volatile unsigned long *gpmcon = NULL;
volatile unsigned long *gpmdat = NULL;
volatile unsigned long *gpmpud = NULL;
 
 
static int s3c6410_led_open(struct inode *inode, struct file *filp)
{
         //int ret;
        
         printk(KERN_ALERT "This is open function of s3c6410 led driver.\n");
 
         *gpmpud &= 0xffffffaa; //set GPM0~3 as pull up enabled
         *gpmcon &= 0xffff1111; //set GPM0~3 as output
         *gpmdat &= 0xfffffff0; //set GPM0~3 to low level, which turn on leds
 
         return 0;
 
}
 
static ssize_t s3c6410_led_write(struct file *filp,const char __user *buf,size_t count,loff_t *ppos)
{
         int val;
 
         //copy_from_user(&val,buf,count);
 
         printk(KERN_ALERT "This is write function of s3c6410 led driver.\n");
 
         return count;
}
 
 
struct file_operations s3c6410_led_flops = {
         .owner = THIS_MODULE,
         .open = s3c6410_led_open,
         .write = s3c6410_led_write,
};
 
static int __init s3c6410_led_init(void)
{
         int ret;
 
         //register led device driver into kernel
         ret = register_chrdev(DEV_MAJOR,DEV_NAME,&s3c6410_led_flops);
 
         //retriver the vritual address by ioremap
         gpmcon = (volatile unsigned long *)ioremap(GPMCON,4); //32-bit reg
         gpmdat = gpmcon + 1;
         gpmpud = gpmcon + 2;
 
         return 0;
}
 
static void __exit s3c6410_led_exit(void)
{
         //unregister led device dirver from kernel
         unregister_chrdev(DEV_MAJOR,DEV_NAME);
 
         //iounmap
         iounmap(gpmcon);
}
 
module_init(s3c6410_led_init);
module_exit(s3c6410_led_exit);
 
MODULE_DESCRIPTION("This is led driver sample for OK6410A board.");
MODULE_VERSION("1.0");
MODULE_AUTHOR("");
MODULE_LICENSE("Dual BSD/GPL");
 
//s3c6410_led_test.c – test file
#include
#include
 
int main(int argc,char* argv[])
{
         int fd;
 
         fd = open("/dev/s3c6410_led",0);
 
         if(!fd){
                   printf("open s3c6410 led failed.\n");
                   }else{
                   printf("open s3c6410 led succeed.\n");
                            }
         return 0;
}
 
解析:
1.       查看OK6410A开发板原理图,4个LED灯接在GPM0~3四个GPIO上。
2.       查看Samsung S3C6410X User’s Manual.pdf ,查看GPm端口操作说明,包括GPMCON,GPMDAT,GPMPUD三个寄存器的基地址以及配置信息,从而确定点亮LED灯和熄灭LED灯的操作。
3.       编写源代码,包括驱动源码和测试源码。这里比较重要的地方是,Linux驱动是工作在保护模式下,无法直接操作寄存器,因此必须将步骤二中找到的寄存器基地址通过IO地址重映射,从而得到虚拟地址进行操作,在驱动程序入口函数中使用ioremap()函数进行地址重映射,在退出函数中使用iounmap()结束地址重映射。另外,如果想在加载驱动的同时,让系统自动新建设备节点,则要将设备信息提供给系统内核,Linux系统支持的mdev机制会根据驱动程序提供的信息新建设备节点。在上述源码中并没有实现这一功能。
4.       编译源码
驱动程序Makefile如下:
obj-m:=s3c6410_led.o
KERNELDIR?=/usr/src/linux-3.0.1
 
default:
$(MAKE) -C $(KERNELDIR) M=$(shell pwd) modules
 
clean:
rm -rf *.o *~ *.ko *.mod.c *.order *.symvers
 
在终端下执行如下命令:
#make //编译驱动程序,得到s3c6410_led.ko文件
#arm-linux-gcc s3c6410_led_test.c –o s3c6410_led_test //编译测试源码
 
5.       拷贝s3c6410_led.ko和s3c6410_led_test到SD卡中,给开发板上电


关键字:OK6410A  Linux驱动  LED驱动 引用地址:OK6410A学习笔记三:嵌入式Linux驱动之LED驱动

上一篇:OK6410A学习笔记四:嵌入式Linux驱动之LED驱动进阶
下一篇:OK6410A学习笔记二:嵌入式Linux驱动开发环境的配置和测试

推荐阅读最新更新时间:2024-03-16 14:50

基于tiny4412的Linux内核移植 -- MMA7660驱动移植(九-2)
平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本:Linux-4.4.0 (支持device tree) u-boot版本:友善之臂自带的 U-Boot 2010.12 (为支持uImage启动,做了少许改动) busybox版本:busybox 1.25 交叉编译工具链: arm-none-linux-gnueabi-gcc (gcc version 4.8.3 20140320 (prerelease) (Sourcery CodeBench Lite 2014.05-29)) 摘要 上一篇 博文在tiny4412上移植了MMA7660驱动程序,使用的是exynos4
[单片机]
基于tiny4412的<font color='red'>Linux</font>内核移植 -- MMA7660<font color='red'>驱动</font>移植(九-2)
降压调节器变身智能可调光LED驱动
凭借使用寿命长和功耗低的优势,LED有望改变整个照明行业,但它的快速采用面临的主要障碍是LED本身的成本居高不下。LED灯具(完整电力照明设备)的成本各不相同,但LED的成本通常占据了整个灯具成本的大约25%至40%,而且预期在今后多年内仍会占据很高比例(图1)。 图1. LED灯具成本的细分1 降低整体灯具成本的一种方法是在产品规格允许的范围内,在可能最高的直流电流下驱动LED.此电流可能远高于其“分档电流”.如果正常驱动,这样可能产生更高的流明/成本比率。 图2. LED光输出和效率与驱动电流2 但是,这种做法需要更高电流驱动器。很多解决方案在低电流下( 500mA)驱动LED,但很少有高电流(700mA至
[电源管理]
降压调节器变身智能可调光<font color='red'>LED驱动</font>器
安森美中高功率照明LED驱动器方案
LED的诸多优点已经使其逐步取代白炽灯、荧光灯等传统光源,在小功率应用上越来越多地出现在我们日常工作生活中,而在我们传统定义的20至400瓦的中高功率照明范围内,荧光灯、高强度气体放电灯还是主流。但随着大功率LED产品的不断推陈出新,模块化的LED灯条、大阵列LED等产品的出现,公路、体育馆、户外大型设施等需要大功率照明的应用场景中也越来越多出现LED产品的身影。 LED照明电路相对设计简单、能集成控制、可方便实现调光、能有效降低电力消耗,所以在强调智能、绿色照明的今天,中高功率LED产品逐步替代高强度气体放电灯(HID)等传统光源已经是大势所趋。但我们也看到模块化的LED灯条和阵列对电源驱动的要求不尽相同,如何为中高功率
[电源管理]
安森美中高功率照明<font color='red'>LED驱动</font>器方案
电子基础(1):LED驱动器浅析
  基于电压-电流的变化率特性,LED驱动器需要一个符合要求的设计,所以了解它们的特性和基于特定应用选择适当的驱动电路是至关重要的。这样专用的驱动电路才能为这些LED提供额定的电压和电流,为它们正常工作创造一个良好的条件。   要达到发光的目的,LED需要一个正向电压来让电流流动。因此LED驱动器要为LED提供正向偏压以便使其发光。LED的发光等级或亮度通常与正向电流的大小成正比。另外,通过LED的电流不应该超过设备规定的额定电流,否则可能造成永久伤害。因而恒定电流驱动电路是将电流控制在驱动LED的正确水准的理想方案。换句话说,LED驱动电路就是一种提供恒定电流而非恒定电压的电源转换电路。LED驱动电路最少应该包含一个电压检测电
[电源管理]
电子基础(1):<font color='red'>LED驱动</font>器浅析
LED驱动器集成电路在汽车照明中的应用
   引言   目前,对高亮度LED(发光二极管)的市场预测存在很大差别。尽管预测数据不同,但是趋势是明显的:高亮度(HB)LED市场正在以惊人的速度增长。有些预测数据为年复合增长率15%,另一些则为年复合增长率35%。2007年汽车领域的LED照明处于起步阶段,销售额为6.7亿美元,但是预计将以15%的年复合增长率增长,到2011年(1)达到12亿美元。如果将非汽车应用考虑在内,那么年复合增长率接近35%,而且到2011年,总的高亮度LED市场有可能轻松超过25亿美元。   这么高的增长潜力靠什么驱动?首先,LED产生光的效率是白炽灯的10倍,同时几乎是荧光灯的两倍,因此极大地降低了提供特定光输出量(单位:流明)所需的电功率
[电源管理]
<font color='red'>LED驱动</font>器集成电路在汽车照明中的应用
XScale PXA270在Linux下的FPGA设备驱动
摘要 以ACEX1K50为例,介绍FPGA在Intel XScale PXA270微处理器系统上的应用。通过内存映射机制实现ACEX1K50在Linux下的设备驱动;通过用户应用程序实现对ACEX1K50设备的操作,为FPGA在嵌入式领域的应用提供一种方法。 关键词 XScale PXA270 FPGA Linux 驱动 引言   Intel公司推出的XScale采用ARM V5TE结构,是Strong ARM的升级换代产品。XScale PXA270处理器最高主频可达624 MHz,加入了Wireless MMX、Intel SpeedStep等新技术,以其高性能、低功耗、多功能等特点在信息家电、工业控制等领域得到了广泛的应用
[半导体设计/制造]
​用于高功率机器视觉闪光灯的LED驱动
机器视觉系统使用非常短的强光闪烁来产生用于各种数据处理应用的高速图像。例如,快速移动的传送带通过机器视觉系统进行快速标签和缺陷检测。红外和激光LED闪光灯常用于近程和运动检测机器视觉。安全系统发出高速、难以察觉的LED闪光灯来检测运动,捕获和存储安全影像。 所有这些系统都存在的一个挑战,即产生非常高的电流和短时间(微秒)LED相机闪光波形,这些波形可能散开在较长时间内,例如100 ms到1 s以上。产生间隔较长时间的短时LED闪光方波并非易事。当LED(或LED串)的驱动电流上升到1 A以上,并且LED开启时间缩短到几微秒时,挑战难度进一步加大。许多具有高速PWM能力的LED驱动器可能无法有效处理较长关断时间和短时间的高电流,
[电源管理]
​用于高功率机器视觉闪光灯的<font color='red'>LED驱动</font>器
用于并联LED驱动电流的电平转换器
摘要:利用一对匹配的晶体管配对翻译一个高边电流检测信号下降到接地参考,让你这个电路并联LED驱动器所需达到预期的驱动电流电路。   由于白光LED变得更加普遍,他们应用行业提供了更多的选择。线性恒流驱动器,例如,提供低电磁干扰,成本低,只需要几个组件。许多设计师青睐的低电流应用中,功耗是一个小的关注他们。如果功耗是一个问题,或者如果应用程序需要更多的电流,则可以并联两个或更多的驱动程序。两个并联司机提供两倍的电流并分割成两个位置,这使得它更容易消耗功率损失。   高侧传球元素是首选,特别是汽车应用,因为它们允许你连接只有一个限流线(底盘返回)到负载。要配置高侧传球元素并行驱动程序,但是,目前的检测反馈电路也必须偏高,而且必须能够承
[电源管理]
用于并联<font color='red'>LED驱动</font>电流的电平转换器
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved