完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
跟韦老师学习嵌入式-LED总结 本文内容由浅入深主要介绍了JZ2440的LED裸板程序,LED的简单驱动程序 一、LED裸板程序 1.硬件原理图: JZ2440的硬件连接图,如下图所示: 从图中可以看出LED1、LED2、LED3、LED4这四个LED灯分别于GPB5-GPB8相连,因此需要通过控制GPB5-GPB8的寄存器的输出来控制,LED等的亮灭。 2.寄存器的配置 s3c2440的I/O口可以用于输入、输出或是其他特殊功能,因此需要有寄存器来对引脚的功能进行配置。GPB引脚的位置及配置可以从s3c2440手册上查到,如下图所示: 由上图可以看出对GPB引脚进行设置的有4个寄存器,其中包括一个保留的,即有三个寄存器来对GPB引脚进行设置。 这三个寄存器的功能如下: GPBCON:主要用于配置,选择引脚的功能。GPBDAT:用于读写引脚,当引脚被设为输入时,读此寄存器可知相应引脚的电平状态是高还是低;当引脚被设为输出时,写此寄存器相应位可令此引脚输出高电平或低电平。GPBUP寄存器:某位为1时,相应引脚无内部上拉电阻;为0时,相应引脚使用内不上拉电阻。 3、代码分析 点亮LED的C语言代码很简单,如下所示: /*定义GPBCON的地址,其中的volatile主要是为了防止编译器在编译时对代码进行优化,从而产生错误*/ #define GPBCON (*(volatile unsigned long*)0x56000010) #define GPBDAT (*(volatile unsigned long*)0x56000014) int main() { GPBCON=0x00015400;//设置GPB5-GPB8位输出端口 GPBDAT=0x00000000;//GPB5-GPB8输出0,LED1-4点亮 } 二、LED驱动程序1.驱动简介 一个软件系统可以分为:应用程序、库、操作系统、驱动程序四部分,其架构图如下所示: 首先应用程序使用库提供的open函数打开代表LED的设备文件;库根据open函数传入的参数执行swi指令,该指令引起系统调用;内核的异常处理函数根据这些参数找到对应的驱动程序,返回文件的句柄;应用程序得到文件句柄后,使用库提供的write或ioctl函数发出控制命令;库根据write或ioctl函数传入的参数执行swi指令,这条指令会引起CPU异常,进入内核;内核的异常处理函数根据这些参数调用驱动程序的相关函数,点亮LED。 Linux的外设可以分为3类:字符设备、块设备和网络设备。字符设备是能够像字节流一样被访问的设备,对设备的读写是以字节为单位的。块设备的数据是以块的形式存放的,如硬盘、U盘等。 2.源码分析 #define LED_MATOR0 Static unsignedlong led_table[]={ S3C2410_GPB(5), S3C2410_GPB(6), S3C2410_GPB(7), S3C2410_GPB(8), }; staticint s3c2440_leds_open(struct inode *inode,struct file *file) { int i; for(i=0;i<4;i++) { S3c2410_gpio_cfgpin(led_table, S3C2410_GPIO_OUTPUT);//配置引脚为输出 } return 0; } staticint s3c2440_leds_ioctl(struct inode *inode,struct file *file,unsigned intcmd,unsigned long arg){ if(arg>4) return –EINVAL; switch(cmd){ case IOCTL_LED_ON: s3c2410_gpio_setpin(led_table[arg],0);//设置引脚输出电平为0 return 0; case IOCTL_LED_OFF: s3c2410_gpio_setpin(led_table[arg],1); //设置引脚输出电平为1 return 0; defaule: return –EINVAL; } } /*驱动的操作函数集*/ static structfile_operations s3c2440_leds_fops={ .owner=THIS_MODULE, .open=s3c2440_leds_open, .ioctl=s3c2440_leds_ioctl, }; staticint s3c2440_leds_init(void) { int ret; ret=register_chrdev(LED_MATOR,”leds”,&s3c2440_leds_fops);//向内核注册驱动函数 if(ret<0) return ret; return 0; } Staticvoid s3c2440_leds_exit(void) { Unregister_chrdev(LED_MATOR, ”leds”);//卸载驱动的函数 } module_init(s3c2440_leds_init);//指定驱动程序的初始化函数 module_exit(s3c2440_leds_exit);//指定驱动程序的卸载函数
|
|
相关推荐
|
|
精致JZ2440 开发板——嵌入式Linxu 应用开发完全手册配套开发板 当场编写代码——韦东山第一期视频(免费) 当场编写代码——韦东山第二期视频 当场编写代码——韦东山第三期视频 开发板的相关配套硬件 详情请登录淘宝查询“通程商铺” 第一期是免费的哦,可上华为网盘搜索“韦东山第一期视频”进行下载 支持售后服务,买开发板,视频即可加入技术讨论群 |
|
|
|
|
|
只有小组成员才能发言,加入小组>>
「含关键代码」基于AM3352/AM3354/AM3359的Linux开发案例分享
4877 浏览 0 评论
87372 浏览 0 评论
【高手问答】如何做到精通linux技术?资深工程师带你突破难点
4697 浏览 2 评论
3587 浏览 2 评论
解读Linux :先从创建一个文件夹用来存放jdk压缩文件开始
2462 浏览 0 评论
1973浏览 3评论
这是i.mx6ull的关于usb的宏定义,能解释下这些宏定义的意思
1332浏览 1评论
1244浏览 1评论
求解:aarch64交叉编译工具已经安装成功,环境变量已经配置,怎么将系统架构切换为ARM的架构
1312浏览 0评论
电脑和虚拟机可以互ping,电脑和开发板也可以互ping,但是虚拟机和开发板ping不通是什么原因
1219浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-2 14:20 , Processed in 1.236512 second(s), Total 74, Slave 56 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号