一步一步摸索在MDK下进行S3C2440的开发
- 格式:doc
- 大小:453.00 KB
- 文档页数:9
文章记录了作者在S3C2440开发板上实现按键点亮LED驱动开发的详细过程,还记录了一些容易出现的错误,以及怎么解决这些错误。
一、驱动开发流程Linux驱动开发不同于应用程序的开发。
驱动开发是直接和硬件打交道的,通过对硬件的操作给应用程序提供一些接口函数,使得应用程序能够“间接”的控制硬件来工作。
对于按键点亮LED的驱动开发流程如下。
二、驱动开发具体步骤1、查看开发板TQ2440底板原理图,找到按键和LED模块,如下图:图-2 按键和LED电路图从上图我们可以清楚地看到K1~K4对应的管脚是ENT1~ENT4,LED1~LED4对应的管脚是nLED_1~nLED_4.2、查看TQ2440_核心板原理图,找到对应的CPU管脚,如下图:图-3 按键和LED对应CPU管脚电路图3、查看s3c2440芯片手册,查看CPU管脚的模式,如下图从上图我们可以看出按键对应的CPU管脚GPF0~GPF4都是占两位(如:GPF0[1:0])。
按键是一种中断,要想让按键工作在中断模式下,就要设置GPF0~GPF4(GPF3除外)管脚都设置在中断模式下,即为10。
对于LED对应的CPU管脚GPB5~GPB8也是占两位。
要想让LED工作,就要让LED工作在输出模式下,即对应管脚设置为01.4、编写按键点亮LED驱动程序/*调用内核头文件,和应用程序调用的头文件不一样*/#include <linux/module.h>#include <linux/kernel.h>#include <linux/fs.h>#include <linux/init.h>#include <linux/delay.h>#include <asm/irq.h>#include <linux/interrupt.h>#include <asm/uaccess.h>#include <asm/arch/regs-gpio.h>#include <asm/hardware.h>#include <linux/device.h>#include <linux/poll.h>#define DEVICE_NAME "tope-buttons" //自定义驱动称为“tope-buttons”。
Realview MDK4.0 进行2440开发快速入门----苑臣芒(光芒)RealView MDK在中国推出已经有一段时间了,而且作为未来发展的趋势必将取代ADS1.2,成为工程师广泛应用的开发平台。
但是好多工程师还习惯于用ads环境来调试,编译,我以前也是,但毕竟ads软件已经没有技术支持了,这势必会在以后对开发工作有一定影响,ARM将Keil公司收购之后,正式推出了针对ARM微控制器的开发工具RealView Microcontroller Development Kit (简称RealView MDK 或者MDK),它将ARM开发工具RealView Development Suite(简称RVDS)的编译器RVCT与Keil的工程管理、调试仿真工具集成在一起,是一款非常强大的ARM微控制器开发工具。
所以将ads工程转成rvmdk工程势必会成为开发道路上的难题。
第一步:分析一下ads工程及环境。
这是我的工程文件,看一下ads的设置,首先是target setting选项,选择arm from elf接下来编译器选项总平台都选择arm920t,其余不需要修改。
如图其余几个编译器(c,c++)也相应都设置为arm920t,其他地方不需要动。
接下来就是关键的link选项了,最关键的是ro,这个是程序运行地址,也就是在ram的哪个地址运行,tq2440和mini2440都可以设置为0x30000000,也可以比这个数值稍微大些,看实际需要吧,我们设置为0x30000000.在option标签页中添加程序入口点,这个入口点就是主程序运行的第一条指令的地方,在2440init.s中可以找到是entry,所以这里填写“__ENTRY”接下来看lay out选项卡,设置如下:到这里,设置基本完工了,但还不能生成文件,在arm fromELF中我们选择plain binary,接可以生成与工程名字同名的bin文件了。
S3C2440之中断操作(MDK4.22)
背景知识:2440 中断控制器接收60 个中断源。
中断被分为多种类别,此处为32 类别,正好用32 位。
图上可以很好的表示整个中断的流程。
有些中断源对应一个中断类别,比如
串口中断发送,接收最后都对应到串口中断。
submask 屏蔽子类别,未屏蔽的会引起srcpnd 相应位置位,如果mask 未屏蔽的话,就会紧接着判断优先级,最后导致intpnd 置位,然后产生了IRQ,而FIQ 不需要优先级判断,会直接产生,由intmod 设置。
注意的是:进入ISR 后,清除中断的顺序很重要,首先是srcpnd 接着是intpnd,如果还需要清除eintpnd 的话,要最先清除。
实验过程:
编译工具--MDK4.22
硬件图
首先需要配置GPF0/1/2/4 的脚为EINT0/1/2/4。
由于用到了外部4-7 中断,需要开启EINTMASK 寄存器相应位。
设置优先
级寄存器,设置INTMSK 寄存器。
在2440A.s 中已经设置了I F 位开启,可以接收中断了。
在中断初始化代码里,需要将中断函数的地址安装到中断向量表中。
程序如下:
MDK4.22 的启动代码设置
配置了堆,栈,以及中断向量表的地址为0x33ffff20 处。
配置了B 口和F 口,B 口试LED 的灯显示,F 口是连接按键的外部中断。
按一个键会亮一个LED。
int.c 代码。
一、Uboot移植前的准备1、修改makefile、配置文件在配置文件之前,需要修改makeflie相关内容:修改如下:(1)修改编译器,这里我们的makefile已经设置为arm-linux-无需再修改,如下所示:ifeq ($(ARCH),arm)CROSS_COMPILE = arm-linux-Endif(2)添加fl2440的配置项,如下所示:fl2440_config:unconfig@$(MKCONFIG) $(@:_config=) arm arm920t fl2440 step s3c24x0注意:在添加的fl2440_config的第二行,必须以Table开头,不能有任何多余的符号,否则极易导致编译错误。
Uboot支持多种处理器和平台,在编译uboot之前需要对其进行配置,使其支持我们自己的开发平台。
在执行编译make之前,需要进行配置即make fl2440_config。
通过查看顶层目录的makeflie文件,通过以下语句:MKCONFIG := $(SRCTREE)/mkconfig得出实际执行的命令为:./mkconfig fl2440 arm arm920t fl2440 step s3c24x0执行完这句后,产生如下结果:(1)开发板名称为fl2440;(2)将include中的头文件连接到同平台相关的头文件中,这里的连接为:asm->asm-armarch->arch-s3c24x0proc->proc-armv(3)创建顶层Makefile包含的文件inclued/config.mk,该文件内容如下ARCH = armCPU = arm920tBOARD = fl2440VENDOR = stepSOC = s3c24x0(4)创建开发板相关头文件include/config.h,该文件中包含了对开发板的相关配置,如下所示:#include <configs/fl2440.h>从上面可以知道,在将uboot配置为适合自己的平台的时候,需要在路径/include/configs下添加配置头文件fl2440.h。
由于片面问题,所以可能会看起来不太美观,可以看附件中的内容。
ARM启动代码相当于我们电脑的BIOS,也就是ARM启动时对处理器的一些初始化及嵌入式系统硬件的一些初始化。
由于它直接面对处理器内核和硬件控制器进行编程,一般都是用汇编语言。
一般包括:中断向量表,初始化存储器系统,初始化堆栈,初始化有特殊要求的断口,设备初始化,变量初始化等。
这几天对着RealView MDK-ARM中自带的启动代码研究了一下,遇到问题又对着数据手册和指令表看了一下,总算对S3C2440A的硬件有了一个大致的了解。
学习嵌入式系统重在系统,学习ARM只是为学习嵌入式系统铺路,懒猫比较笨可能在上系统之前要裸奔几天以强化以下对S3C2440A内部结构的了解。
把MDK自带的S3C2440A.S文件的注释发一下,这些是懒猫结合数据手册与ARM指令表理解了,可能会有错误,放在这里只是引导一下像我一样还没有入门的兄弟们,希望你们不要害怕ARM害怕嵌入式,老毛他老人家说的对,世上无难事,只怕有心人,ARM指令就那么多,看一遍不会就多看几遍,还有一定要学习看软件自带的帮助文件.;/*****************************************************************************/;/* S3C2440.S: Startup file for Samsung S3C440 */;/*****************************************************************************/;/* <<< Use Configuration Wizard in Context Menu >>> */ ;/*****************************************************************************/;/* This file is part of the uVision/ARM development tools. */ ;/* Copyright (c) 2005-2008 Keil Software. All rights reserved. */ ;/* This software may only be used under the terms of a valid, current, */;/* end user licence from KEIL for a compatible version of KEIL softwar e */;/* development tools. Nothing else gives you the right to use this softwa re. */;/*****************************************************************************/;下面这些参数是与CPSR状态寄存器有关;参数的由来:这里各个模式的参数是由寄存器CPSR的模式位设置M[4:0]得来的,;比如这里的用户模式,CPSR的M[4:0]设置为10000就是0x10。
22科技资讯 SC I EN C E & TE C HN O LO G Y I NF O R MA T IO N 信 息 技 术随着各种控制系统监控界面要求的提高,触摸屏和彩色LC D屏的应用越来越受到用户的欢迎。
本文以配有3.5寸触摸屏和彩色LCD屏的32位计算机S3C2440为硬件平台,以“风帆旋转角度控制系统”的具体案例开发为背景,详细介绍在S3C2440裸机上开发LC D及触摸屏应用的方法和具体过程,经实践证明按本方法可快速开发L C D 及触摸屏监控界面且可靠性好。
1 LCD 显示函数库开发一般S3C2440开发板配套开发资料包含PutPixel(U32x,U32y,U32c)单象素显示函数,可在此基础上开发LC D显示函数库graph.h,以便用显示接口函数开发各种应用程序。
L CD 显示函数库如表1所示,各L C D 显示接口函数在本文案例应用的方法作如下简介。
以画直线、画矩形、画填充矩形和画填充圆函数为基础,编写风帆绘制风帆状态绘制函数和实时曲线绘制,利用Glib_Sail ( )在LCD屏上显示风帆当前状态图,利用Act_Curve( )绘制风帆角度实时曲线;把0~9数码和小数点制作成12×16的位图,并用BM P图片转换软件转化成数据,建立数码库sm_1216.h,以便数值显示函数显示数值;由于建立文字库工作量大,且要显示的中文字符较少,所以把连在一起要显示的文字和按钮都做成位图,并转化建立文字图片库zf_6522.h和按钮图片库anniu_7034.h,以便图片显示函数显示文字和触摸按钮。
2 触摸屏应用函数库开发一般S3C2440开发板配套开发资料中包含触摸屏触摸中断服务函数,该函数获取当前触摸点的坐标(xdata,ydata),可在此基础上开发触摸屏应用函数库Touchpanel.h,以方便开发各种应用程序。
本文应用触摸屏需完成任务有:通过触摸完成控制系统参数设定(风帆设定角度),还需通过触摸启动或停止按钮完成控制系统的启停状态的转换。
S3C2440完全开发流程作者:dreamer2006@2009-11-3 一.简介 (3)二.建立开发环境 (4)1、编译器ARM-LINUX-GCC-3.4.1 (4)2、J FLASH-S3C2440:S3C2440芯片的JTAG工具 (4)3、安装GDB调试工具 (5)4、USB下载工具 (6)5、UBUNTU开发环境建立 (6)三.S3C2440基础实验 (8)1、实验一:LED_ON (8)2、实验二:LED_ON_C (9)3、实验三:I/O PORTS (11)5、实验五:MEMORY CONTROLLER (15)6、实验六:NAND FLASH CONTROLLER (17)7、实验七:UART (20)8、实验八:PRINTF、SCANF (23)9、实验九:INTERRUPT CONTROLLER (24)10、实验十:TIMER (28)11、实验十一:MMU (31)12、实验十二:CLOCK (39)四.BOOTLOADER VIVI (43)1、阶段1:ARCH/S3C2440/HEAD.S (43)2、阶段2:INIT/MAIN.C (45)1)、Step 1:reset_handler() (45)2)、Step 2:board_init() (46)3)、Step 3:建立页表和启动MMU (47)4)、Step 4:heap_init() (50)5)、Step 5:mtd_dev_init() (52)6)、Step 6:init_priv_data() (56)7)、Step 7:misc()和init_builtin_cmds() (57)8)、Step 8:boot_or_vivi() (58)五.附录一VI命令解释 (65)1、HELP命令 (65)2、MEM命令 (65)3、LOAD命令 (66)4、PARAM命令 (67)5、PART命令 (69)6、BOOT命令 (70)7、BON命令 (71)一.简介本书面向由传统51单片机转向ARM嵌入式开发的硬件工程师、由硬件转嵌入式软件开发的工程师、没有嵌入式开发经验的软件工程师,本书开发板基于天嵌科技的TQ S3C2440开发板,其官方网站为:/,共分9个部分:1、开发环境建立2、S3C2440功能部件介绍与实验(含实验代码)3、Bootloader vivi详细注释4、Linux移植5、Linux驱动6、Yaffs文件系统详解7、调试工具8、GUI开发简介9、UC/OS移植通过学习第二部分,即可了解基于ARM CPU的嵌入式开发所需要的外围器件及其接口。
MDK工程创建+程序下载+硬件仿真1、创建工程文件夹,添加以上几个文件夹Config文件夹包含配置文件,具体配置文件如下:Src文件夹包含程序用到的.c和.s文件Inc文件夹包含程序用到的.h文件Obj_list文件夹用于编译调试产生的目标文件和过程文件2、创建新的工程3、保存选择ARM芯片4、选择否5、右键Target 1,选择Manage Components... 6、如上图所示添加文件,点击OK。
(如果新加了.h和.c的头文件,也要在这里添加)7、右键Target 1,选择Options for Target ‘Target 1’...8、Output选项卡,点击Select Folder for Objects...,选择之前创建的obj_list文件夹,该文件夹用于存放目标文件。
9、Listing选项卡,点击Select Folder for Listings...,选择之前创建的obj_list文件夹,该文件夹用于存放调试生成的过程文件。
10、User选项卡,勾中Run #1 添加fromelf.exe --bin -o .\obj\@p.bin .\obj\@p.axf 11、C/C++和Asm选项卡,Include Paths添加之前添加的inc文件夹,目的是为了添加头文件。
12、Linker选项卡,设置如上图。
13、Debug选项卡,硬件仿真选中右侧user,选中J-Link仿真器,点击Setting,弹出右侧窗口,选择JTAG Speed 为Auto Selection。
点击Initialization File,选中之前添加的config文件夹中的Ext_RAM.ini文件,点击右侧Edit.14、Utilities选项卡,选择J-LINK仿真器,去掉Update Target before Debugging前面的对号。
点击OK,完成15、在编程区窗口,对Ext_RAM.ini文件进行修改,如上图,只需修改.axf文件为所建工程的名字即可。
第1步:在MDK下建立一个最简单的基本S3C2440的点亮LED工程,启动代码采用MDK自带的。
编写代码控制TQ2400板子上的一个LED灯闪烁,结合TQ2440底板可找到LED连接在GPB5~GPB8。
具体代码如下:#include <S3C2440.h>#define LED1 (1<<5)#define LED2 (1<<6)#define LED3 (1<<7)#define LED4 (1<<8)void Delay(void){int i,j;for(i=0; i<1000; i++){for(j=0; j<1000; j++);}}int main(){GPBCON = 0x15555;while(1){GPBDAT &= ~LED1; //LED1闪一下Delay();GPBDAT |= LED1;Delay();GPBDAT &= ~LED2; //LED2闪一下Delay();GPBDAT |= LED2;Delay();GPBDAT &= ~LED3; //LED3闪一下Delay();GPBDAT |= LED3;Delay();GPBDAT &= ~LED4; //LED4闪一下Delay();GPBDAT |= LED4;Delay();}}第2步:对工程进行初步的配置。
为避免工程文件目录中文件比较乱,要对工程的输出文件和连接文件各单独建立一个文件夹,让它们在各自文件夹内。
点击“Select Folder For Objects”,新建一个名为out的文件夹,然后双击打开并点击OK,这样所有的输出文件就会放在这个文件夹内。
编译一下,出现如下错误:示:而2440并没有内部RAM,只有外接的SDRAM。
先将内部RAM选项去掉。
TQ2440的程序运行是在外接的SDRAM中的,SDRAM的开始地址是0x30000000,仿真的时候代码都是在SDRAM中运行的,那我们就先将代码地址和内存地址都配置为外部的,如下图所示:其中ROM1和RAM1的空间大小都是随便填写的,当然总的大小不能超过实际使用的SDRAM的大小。
然后再点击工程配置窗口中的Linker选项,勾选User Memory Layout from Target Dialog 选项(即选择使用上面的目标选项对话框中的存储空间分配方式)配置如下图:编译后的编译信息如下:编译顺利通过。
第3步:使用Jlink接上TQ2440开发板进行仿真调试一下。
打开工程配置对话框选择Debug选项进行配置,选择使用J-LINK/J-TRACE仿真选项,然后点击Setting按键,JTAG Speed配置为自动。
配置如下:然后还要在Initialization File:选项下添加一个初始化文件Ext_RAM.ini,不然是没法进行仿真的。
这个文件可在MDK安装目录中的例子中找到:我电脑上的路径是C:/Keil/ARM/Boards/Samsung/S3C2440/RTX_Blinky/Ext_RAM.ini 文件内容如下:/************************************************************************** ****//* Ext_RAM.INI: External RAM (SDRAM) Initialization File */ /************************************************************************** ****/// <<< Use Configuration Wizard in Context Menu >>> // /************************************************************************** ****//* This file is part of the uVision/ARM development tools. *//* Copyright (c) 2005-2008 Keil Software. All rights reserved. *//* This software may only be used under the terms of a valid, current, *//* end user licence from KEIL for a compatible version of KEIL software *//* development tools. Nothing else gives you the right to use this software. *//************************************************************************** ****/FUNC void SetupForStart (void) {// <o> Program Entry PointPC = 0x30000000;}FUNC void Init (void) {_WDWORD(0x4A000008, 0xFFFFFFFF); // Disable All Interrupts_WDWORD(0x53000000, 0x00000000); // Disable Watchdog Timer// Clock Setup// FCLK = 300 MHz, HCLK = 100 MHz, PCLK = 50 MHz_WDWORD(0x4C000000, 0x0FFF0FFF); // LOCKTIME_WDWORD(0x4C000014, 0x0000000F); // CLKDIVN_WDWORD(0x4C000004, 0x00043011); // MPLLCON_WDWORD(0x4C000008, 0x00038021); // UPLLCON_WDWORD(0x4C00000C, 0x001FFFF0); // CLKCON// Memory Controller Setup for SDRAM _WDWORD(0x48000000, 0x22000000); // BWSCON_WDWORD(0x4800001C, 0x00018005); // BANKCON6_WDWORD(0x48000020, 0x00018005); // BANKCON7_WDWORD(0x48000024, 0x008404F3); // REFRESH_WDWORD(0x48000028, 0x00000032); // BANKSIZE_WDWORD(0x4800002C, 0x00000020); // MRSRB6_WDWORD(0x48000030, 0x00000020); // MRSRB7_WDWORD(0x56000000, 0x000003FF); // GPACON: Enable Address lines for SDRAM}// Reset chip with watchdog, because nRST line is routed on hardware in a way// that it can not be pulled low with ULINK_WDWORD(0x40000000, 0xEAFFFFFE); // Load RAM addr 0 with branch to itselfCPSR = 0x000000D3; // Disable interruptsPC = 0x40000000; // Position PC to start of RAM_WDWORD(0x53000000, 0x00000021); // Enable Watchdogg, 0 // Wait for Watchdog to reset chipInit(); // Initialize memoryLOAD Obj\Blinky.axf INCREMENTAL // Download programSetupForStart(); // Setup for Runningg, main // Goto Main将此文件复制到所建的工程下面,然后修改下面这句代码,将Blinky.axf替换为自己工程下生成的调试文件名称即可。
LOAD Obj\Blinky.axf INCREMENTAL // Download program例如我所建工程生成的调试文件是在out文件夹内的LED2.axf,则将此句修改为LOAD out/LED2.axf INCERMENTAL即可,如果调试文件在所建工程根文件夹内则修不需要再加out/路径,直接改为LOAD LED2.axf INCERMENTAL即可。
然后再点击Utilities选项,Use Target Driver for Flash Programming选项选择J-LINK/J-TRACE选项,并且不勾选后面的Update Target before Debugging选项,如下图所示:设置完成之后,点击Debug按钮即可进入调试界面以上这些步骤只是做到简单的使用JLINK进行仿真,即代码在SDRAM中运行,还不能烧写到NANDFLASH中运行。
接下来继续摸索如果将代码下载到NandFlash中运行的方法,呵呵。