实验一mini2440裸板驱动开发环境搭建.

合集下载

mini2440裸板烧写u-boot

mini2440裸板烧写u-boot

1.J-Link commander:如果没有发现检测到CPU,就在里面执行usb命令连接JLink,再执行r命令识别处理器(复位)2.3 下载运行特制的程序对于S3C2410、S3C2440处理器,它们内部有4K的SRAM,当使用Nor Flash启动时,地址为0x40000000;当使用Nand Flash启动时,地址为0。

对于S3C2410、S3C2440开发板,一般都外接64M的SDRAM。

SDRAM能被使用之前,需要经过初始化。

所以,先把一个init.bin下载到内部SRAM去运行,它执行SDRAM的初始化;然后再下载一个比较大的程序,比如u-boot到SDRAM去动行,它将实现对Nor、Nand Flash的操作。

以下是在J-Link commander里的命令,假设init.bin、u-boot.bin在e:盘下。

1. speed 12000 //设置TCK为12M,下载程序时会很快2. 下载并运行init.bin,这是用来初始化SDRAM的2.1 如果是NAND启动:(跳线打到NAND)loadbin e:\init.bin 0setpc 0g2.2 如果是Nor启动:(跳线打到NOR)loadbin e:\init.bin 0x40000000setpc 0x40000000g3. 下载特制的uboot:hloadbin e:\u-boot.bin 0x33f80000 链接地址setpc 0x33f80000g同理可以通过J-link下载其他程序文件:hloadbinyour_file.bin 0x30000000g这时,你的文件已经被下载到SDRAM 0x30000000去了。

5.使用u-boot烧写Flash(1).通过u-boot烧写到Nor Flash:在u-boot里执行:protect off all // 解锁erase 0 2ffff // 擦除从0地址开始的大小为0x30000的NOR Flash扇区(大小为可擦除块的整数倍,可以运行flash info命令查看)cp.b 0x30000000 0 30000 // 把前面下载到0x30000000的程序烧写到NOR去(2).通过u-boot烧写到Nand Flash:在u-boot里执行:nand erase 0 30000 // 擦除从0地址开始的大小为0x30000的Nnad Flash扇区nand write.jffs2 30000000 0 30000 // 把前面下载到0x30000000的程序烧写到Nand去注意,上面用的2ffff、30000等数字是192K,如果你的程序比较小,请自行设置。

使用QEMU建立Mini2440的模拟环境

使用QEMU建立Mini2440的模拟环境

使用qemu 建立mini2440的模拟仿真环境1. 首先下载qemu for mini2440git clone git://repo.or.cz/qemu/mini2440.git qemu如果感觉速度慢,直接打包下载http://repo.or.cz/w/qemu/mini2440.git/snapshot/HEAD.tar.gz解压后,今日源代码的主目录中,git clone git://repo.or.cz/w/u-boot-openmoko/mini2440.git uboot或者打包下载http://repo.or.cz/w/u-boot-openmoko/mini2440.git/snapshot/HEAD.tar.gz(注意采用打包下载的时候这几个包的文件名可能相同,注意区分)解压后,配置Makefile 文件,打开Makefile文件,CROSS_COMPILE变量赋值,即自己所使用的交叉编译工具链,比如我的是arm-none-linux-gnueabi-,保存退出,输入nfs下载文件功能,需要修改代码中的一部分,将net/nfs.c文件中的NFS_TIMEOUT = 2UL 修改为NFS_TIMEOUT = 20000UL 否则会造成nfs文件下载失败,如果不使用nfs下载功能,不改也可。

然后将u-boot.bin文件拷贝到qemu-mini2440/mini2440文件夹下。

3. 下载linux kernel for mini2440(可以使用原mini2440开发板的内核源代码)(下载步骤略去)进入源码目录文件夹下,并将mini2440文件夹中的mini2440_start.sh作如下修改将kernel 一行改为-kernel "$base/uImage" \,回到上层目录后运行一、1.如果在编译QEMU时没有安装,即make install,那么需要打开mini2440/mini2440_start.sh,将第16行的qemu-img改为:$base/../qemu-img2.如果编译时安装了QEMU,即有make install,不管这一步骤。

构建MINI2440开发板 Ubuntu linux常见问题

构建MINI2440开发板 Ubuntu linux常见问题

构建MINI2440开发板Ubuntu开发环境-串口配置及使用2012-06-14 10:52:15来源: 作者: 【大中小】浏览:2次评论:0条做嵌入式开发,调试开发板最常使用的工具就是串口和网口,本文主要介绍在Ubuntu系统如何安装和设置串口软件(minicom和kermit)连接MINI2440开发板。

本文假设你已经在电脑上安装了Ubuntu系统。

对于现今大多数的笔记本而言,主板上一般都没有配置接口。

我们可以在网上购买到USB口转串口接口,网上有很多种类型的USB转接口,可以根据价格选择一个合适的就行。

这里使用的是基于PL2303芯片的USB 转接口。

1. 连接MINI2440开发板将USB串口转接器插上开发板和电脑后,在终端上敲dmesg命令,可以查看转接口已经被PC识别,如下图所示:从上图中我们可以看到我们所连接的串口设备是ttyUSB0,可以通过命令ls -l /dev/ttyUSB*来查看相关的信息。

至此,我们已经顺利的将串口连接到Ubuntu系统上了。

这里顺便提起一下,我在Windows下使用USB 转串口时,要先从网上下载一个安装PL-2302 USB Serial Driver,安装该驱动以后,才可以正常使用,而Linux 内核中已经支持PL2303芯片,所以不需要自行安装。

下面就会介绍minicom和kermit的使用。

2. minicom安装及设置Ubuntu系统中默认是没有安装minicom软件,所以我们首先自己需要安装,可以使用apt-get 命令来安装,如下图所示:安装完成以后,我们运行minicom -s命令进行一些初始配置,如下截图:参数的设置如下图所示,这里需要注意的一点是一定要把Hardware Flow Control也设置成None,我开始时就是因为没有设置这一项导致串口一直连不上去。

最后Save setup as dfl并退出,再次输入minicom命令,可以看到已经成功的连到了MINI2440开发板,如下图所示。

MINI2440

MINI2440

郑州轻工业学院校外实习报告实习名称:MiNI2440移植Uboot姓名:冯相楠院(系):计算机通信与工程学院专业班级:嵌入式软件14-2学号:541413430208指导教师:韩雪琴主要实习单位:郑州轻工业学院成绩:时间:2016年6月10日至2016年6月17日一、实习目的MiNI2440移植Uboot。

二、实习内容1、任务与要求1.移植uboot到mini2440,使其可以在nor flash中运行2.支持DM9000网卡3.支持nor flash读写主机:VMWare--redhat 5开发板:Mini2440--256MB Nand编译器:arm-linux-gcc-4.3.2.tgzu-boot:u-boot-2008.10.tar.bz22、设计思路1.选择移植参考开发板1.1 首先选择MCU相同的开发板,在uboot-2008.10中不支持MCU为s3c2440芯片的开发板1.2没有找到MCU相同的参考开发板,选择CPU相同的参考开发板,s3c2440的cpu为arm920T,smdk2410的cpu也是arm920T,选择smdk2410作为参考开发板。

2.在顶层makefile中为开发板添加新的配置选项(红色部分为添加代码,下同)smdk2410_config : unconfig@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0mini2440_config : unconfig@$(MKCONFIG) $(@:_config=) arm arm920t mini2440 NULL s3c24x0注释:增加配置选项,使make mini2440_config得以进行,为make提供编译环境和设置编译选择路径;unconfig执行@rm -f $(obj)include/config.h$(obj)include/config.mk \$(obj)board/*/config.tmp $(obj)board/*/*/config.tmp \$(obj)include/autoconf.mk$(obj)include/autoconf.mk.dep操作,该操作删除原有的配置;@$(MKCONFIG) $(@:_config=) arm arm920t mini2440 NULL s3c24x0执行根目录下的mkconfig脚本,后面几个为传入该脚本的参数,其中$(@:_config=) 的值为mini2440,mkconfig脚本根据传入的参数对mini2440编译环境进行配置.3.修改cpu/arm920t/start.s3.1修改编译条件使其支持s3c2440136 /*added by snowboyyzx mini2440*/137 #if defined(CONFIG_S3C2400) ||defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)138 /* turn off the watchdog */3.2添加寄存器的定义151 /*added by yzx for mini2440,register define base on the table of s3c2440 datesheet*/152 #define CLK_CTL_BASE 0x4c000000 //基地址153 #define MDIV_405 0x7f << 12154 #define PSDIV_405 0x21155 #define UPLL_MDIV_48 0x38 << 12156 #define UPLL_PSDIV_48 0x22157 #define MDIV_200 0xa1 << 12158 #define PSDIV_200 0x31上述定义是根据芯片手册来设置的MDIV相应的数据之所以要左移12位是因为它在对应的寄存器的12-19位,将pdiv和sdiv放在一起用16进制表示,因为pdiv正好从第四位开始取值。

mini2440底层驱动源程序

mini2440底层驱动源程序

#include "2440addr.h"#include "2440lib.h"#include "2440opt.h"#include <stdio.h>#include <stdarg.h>#include <string.h>static int delayLoopCount;void Delay(int time){int i,adjust=0;if(time == 0){time = 200;adjust = 1;delayLoopCount = 400;rWTCON = ((PCLK/1000000-1)<<8)|(2<<3);rWTDAT = 0xffff;rWTCNT = 0xffff;rWTCON = ((PCLK/1000000-1)<<8)|(2<<3)|(1<<5);}for(;time>0;time--)for(i=0;i<delayLoopCount;i++);if(adjust == 1){rWTCON = ((PCLK/1000000-1)<<8)|(2<<3);i = 0xffff - rWTCNT;delayLoopCount = 8000000/(i*64);}}void ChangeMPllValue(int mdiv, int pdiv, int sdiv){rMPLLCON &= 0x0;rMPLLCON = (mdiv << 12) | (pdiv << 4) | sdiv;}void ChangeClkDivn(int fclk2hclk, int hclk2pclk){int hdivn, pdivn;switch(fclk2hclk){case 1: hdivn=0; break;case 2: hdivn=1; break;case 3: hdivn=3; rCAMDIVN &= ~(1<<8); break;case 4: hdivn=2; rCAMDIVN &= ~(1<<9); break;case 6: hdivn=3; rCAMDIVN |= (1<<8); break;case 8: hdivn=2; rCAMDIVN |= (1<<9); break;default: hdivn=2; rCAMDIVN &= ~(1<<9);}switch(hclk2pclk){case 1: pdivn=0; break;case 2: pdivn=1; break;default: pdivn=1;}//rCLKDIVN &= ~(0x7);rCLKDIVN = (hdivn<<1) | pdivn;}void InitPort(void){rGPACON = 0x7fffff;rGPBCON = 0x044555;rGPBUP = 0x7ff;rGPCCON = 0xaaaaaaaa;rGPCUP = 0xffff;rGPDCON = 0xaaaaaaaa;rGPDUP = 0xffff;rGPECON = 0xaaaaa800;rGPEUP = 0x1fff;rGPFCON = 0x55aa;rGPFUP = 0xff;rGPGCON = 0xff95ffba;rGPGUP = 0xffff;rGPHCON = 0x2afaaa; //配置UART相应的多功能管脚为功能性引脚nCTS0nRTS0 TXD RXDrGPHUP = 0x7ff;rGPJCON = 0x02aaaaaa;rGPJUP = 0x1fff;rEXTINT0 = 0x22222222; //EINT[0-7]rEXTINT1 = 0x22222222; //EINT[8-15]rEXTINT2 = 0x22222222; //EINT[16-23]}void InitUart(int uartclk, int buad){int i;if(uartclk == 0)uartclk = UART_CLK;//UART0//UFCON: uart fifo control register() Status Query: UFSTATnrUFCON0 = 0x0;//UMCON: UART channel MODEM control register Status Query: UMSTAT rUMCON0 = 0x0;//set transmit type ULCONnrULCON0 = 0x3;//set uart clock source and interrupt typerUCON0 = 0x245;//set buad rate UBRDIVnrUBRDIV0 = ((int)(UART_CLK/16./buad+0.5)-1);//UART1rUFCON1 = 0x0;rUMCON1 = 0x0;rULCON1 = 0x3;rUCON1 = 0x245;rUBRDIV1 = ((int)(UART_CLK/16./buad+0.5)-1);//UART2rUFCON2 = 0x0;rULCON2 = 0x3;rUCON2 = 0x245;rUBRDIV2 = ((int)(UART_CLK/16./buad+0.5)-1);for(i=100; i>0; i--);}static int whichUART=0;void SelectUart(int uart_no){whichUART = uart_no;}void PrintOnUart(char *fmt, ...){va_list ap;char string[256];memset(string, 0, sizeof(string)/sizeof(string[0]));va_start(ap, fmt);vsprintf(string, fmt, ap);Uart_SendString(string);va_end(ap);}void Uart_SendString(char * pStr){while(*pStr)Uart_SendByte(*pStr++);}void Uart_SendByte(U8 data){switch(whichUART){case 0:if(data == '\n'){while(!(rUTRSTA T0 & 0x2));Delay(10);WrUTXH0('\r');}while(!(rUTRSTA T0 & 0x2));Delay(10);WrUTXH0(data);break;case 1:if(data == '\n'){while(!(rUTRSTA T1 & 0x2));Delay(10);rUTXH1 = '\r';}while(!(rUTRSTA T1 & 0x2));Delay(10);rUTXH1 = data;break;case 2:if(data == '\n'){while(!(rUTRSTA T2 & 0x2));Delay(10);rUTXH2 = '\r';}while(!(rUTRSTA T2 & 0x2));Delay(10);rUTXH2 = data;break;default:if(data == '\n'){while(!(rUTRSTA T0 & 0x2));Delay(10);rUTXH0 = '\r';}while(!(rUTRSTA T0 & 0x2));Delay(10);rUTXH0 = data;}}U8 Uart_GetChar(void){switch(whichUART){case 0:while(!(rUTRSTA T0 & 0x1));return RdURXH0();case 1:while(!(rUTRSTA T1 & 0x1));return rURXH1;case 2:while(!(rUTRSTA T2 & 0x1));return rURXH2;default:while(!(rUTRSTA T0 & 0x1));return RdURXH0();}}void Uart_GetLine(char * LineBuf){U8 ch;while(1){if((ch=Uart_GetChar()) != '\r'){*LineBuf++ = ch;}else{*LineBuf = '\0';break;}PrintOnUart("%c",ch);}}。

飞凌2440开发板—JLINK裸机仿真实验手册

飞凌2440开发板—JLINK裸机仿真实验手册

ADS JLINK裸机仿真实验手册
准备实验
一、硬件
1.Fl2440或者TE2440开发板一套
2.JLINK仿真器一个
二、软件
1.裸机实验代码,init.axf文件
2.ADS1.2开发环境
3.JLINK驱动
实验步骤
一、将JLINK与开发板和PC机连接到一起,这时可以看到JLINK上的电源指示灯亮了
二、打开AXD软件
(三)加载JLINK驱动,单机Options-》Configue Target如下所示(如果没有安装JLINK 驱动请参考开发板准备实验必读手册【实验四JLINK驱动安装】)
(四)点击“OK”后会有如下画面显示:
五、给开发板上电,按下面操作进行
六、点击Load Image后会有如下界面,选择2440init.axf文件,文件路径为:X:\FL2440\Bootloader\目标文件\2440init.axf
找到2440init.s文件,打开
七、点击“运行”让软件跑一会儿,然后点击“停止”,如下图所示
八、按下图所示操作
九、实验源码路径为X:\实验指导&demo\ADS基础实验\实验源码\1.3-led
向上查找init.s源文件,添加
点击“运行”,程序开始运行,如下所示,然后,点击“停止”
点击“运行”,出现如下界面,观察开发板的led灯,第一个已经点亮,稍微多等一会第二个灯也会点亮,这样流水灯的程序演示完毕,你可以根据自己的需求任意改动程序,开发属于自己的led灯。

一起学mini2440裸机开发(十)--mini2440外部中断实验

一起学mini2440裸机开发(十)--mini2440外部中断实验

一起学mini2440裸机开发(十)--mini2440外部中断实验我今天一整天都在试着将TQ2440的那种处理中断的方法(即安装中断向量表)移植到MDK 中的mini2440,但是一直没成功,这种方法一直没成功,后来又想,还是先从最简单的开始吧,就是不利用中断向量表,直接像利用51单片机那样的中断一样使用它,但是也没成功。

考虑到程序跑飞的可能性,将程序利用MDK中的Download功能下载到了Nor Flash 中去,竟然行了,想了想原因,明白是怎么回事了。

我原来是利用jlink调试的方法,这种调试方式是直接将程序放到了SDRAM的0x3000 0000处,如果发生中断后,比如发生了普通中断IRQ,那么PC指针被强制设为0x0000 0018,而我的程序是放在了0x3000 0000处,在地址0x0000 0018处有什么我也不知道,这样子程序就跑飞了。

下面还是简单说一下我的外部中断实验,结合具体的实验,分析中断的响应过程,以及中断服务函数的编写。

实验功能本实验实现的功能:mini2440开发板上有6个按键,将其中的前4个按键设为外部中断方式,当按下K1时,LED1亮;当按下K2时,LED2亮;当按下K3时,LED3亮;当按下K4时,LED4亮。

硬件电路分析:我的256M的mini2440板子上有4个LED,其接口电路如图1所示,当GPIO口输出为低电平时,相对应的LED灯亮;输出高电平时,LED灯灭。

按键接口电路如图2所示,当按键没有按下时,GPGx引脚为高电平;当按键按下时,引脚电平变为低电平。

程序分析:外部中断工程的文件布局如图3所示。

该工程有三个模块组成:按键模块、LED模块和中断处理模块。

按键模块主要包含button.c 和button.h文件。

LED模块包含led.c和led.h文件。

中断处理模块主要包含interrupt.c、interrupt.h、isrservice.c和isrservice.h文件。

Mini 2440 LED、按键和蜂鸣器裸机测试程序(C语言)

Mini 2440 LED、按键和蜂鸣器裸机测试程序(C语言)

Parameter : 无
Description : 按下按键 1(key1)将会点亮 led1,并且蜂鸣器将发出响声,按键 1-4 依次对应,按
下按键 5(key5)点亮所有的 led,按下按键 6(key6)关闭所有的 led
Return
:无
Argument : 无
Autor & date : Hyfeng
} }
但是对应蜂鸣器来说 1 代表发出声音,而 0 则代表不出声音。
在此程序中并没有使用到按键的中断,而是使用了一个死循环去实现的。并且这个程序
保护两个部分,一个是汇编程序编写的引导部分,因为这是一个裸机的程序,即没有操作系
统的程序,因此想要在板子上运行 C 程序必须进行相应的初始化的工作,这个就是汇编程序
**************************************************/
//将按键的状态设置为输入的状态
void key_init(void)
{
rGPGCON &= ~((3<<0)|(3<<6)|(3<<10)|(3<<12)|(3<<14)|(3<<22));}
/*************************************************
rGPBCON &= ~((3<<0)); rGPBCON |= (1<<0); }
/*************************************************
Function name: delay
Parameter : times

mini2440使用uboot(详细)(zz)

mini2440使用uboot(详细)(zz)

mini2440使用uboot(详细)(zz)文章写于2010.4.17,总结了友善之臂的mini2440开发板使用自带uboot的具体方法,希望能对正在使用mini2440开发板,而且又想使用uboot引导系统的朋友们有所帮助。

Google一下会发现网上类似的帖子不少,但是对mini2440开发板是哪一个版本都没有具体的说明,个人感觉mini2440开发板的版本是经常更新的,可能不同的版本的开发板在移植uboot时会稍有不同,因此这里我把自己使用的开发板的详细信息都罗列一下,希望网友少走弯路。

另外,要感谢illidan和Martin两位的文章:/2009/05/mini2440使用u-boot//bbs/viewthread.php?tid=14使用的mini2440开发板的详细信息:kernel:linux-2.6.29-mini2440-20090708.tgzgcc:arm-linux-gcc-4.3.2.tgzuboot:bootloader.tgz(该压缩包内含有u-boot-1.1.6)roots:root_qtopia-64M.img问题源于:(1)使用128M NAND Flash mini2440开发板的用户都知道,此时开发板附带的supervivi-64M和supervivi-128M都不再支持“空格”进入supervivi的menu菜单,而是改成了使用开发板上的k1~k6任何一个按键触发进入menu(而我需要空格键触发menu的方式);(2)开发板附带的supervivi不支持网络下载kernel和root(文件系统)。

具体的修改步骤如下:注1:arm-linux-gcc的安装方法见《mini2440-um-20090817.pdf》第5.3小节。

注2:mini2440开发板附带的uboot源码已经是经过移植的,适用s3c2440处理器,我们只需要修改一些uboot参数即可。

j-link V7 调试mini2440教程

j-link V7 调试mini2440教程

图解JlinkV7 ADS下仿真mini2440
一、设备:
J_link V7仿真器一个
ADS开发软件
友善之臂mini2440_N35开发板一套
20脚Jtage转10 jtage转接板一块(自己焊接的)
J_link软件和驱动(/download_jlink.html下载)
二、操作说明
1、保证安装好J_link软件和驱动后
桌面上生成两个快捷方式
2、打开ADS,并打开一个工程
3、make并Debug,进入ADS,弹出Chose Taget对话框,添加驱动如下
4、添加后点击Configure进行配置如下General下默认
Jtag下选择1200KHz
断点设置
Log默认
5、设置确认后在程序会跳到Reset处
在Opetion下设置Configure Interface,修改下面两项
List.txt为初始化配置文件
6、点击F5运行,程序跳到Main函数,当然也可以单步运行,此时你可以开始仿真了
7、大功告成
注:chunyisihai 整理。

友善之臂mini2440配置方案

友善之臂mini2440配置方案

5.3 建立交叉编译环境在Linux 平台下,要为开发板编译内核,图形界面Qtopia,bootloader,还有其他一些应用程序,均需要交叉编译工具链。

之前的系统,要使用不同的编译器版本才能正常编译各个部分,因此要在开发过程不断切换设置,这十分不利于初学者使用,也降低了开发的效率;自从Linux-2.6.29 开始,我们把交叉编译器统一为arm-linux-gcc-4.3.2,下面是它的安装设置步骤。

Step1:将光盘目录linux\中的arm-linux-gcc-4.3.2.tgz 复制到某个目录下如tmp\,然后进入到该目录,执行解压命令:#cd \tmp#tar xvzf arm-linux-gcc-4.3.2.tgz –C /注意:C 后面有个空格,并且C 是大写的,它是英文单词“Change”的第一个字母,在此是改变目录的意思。

执行该命令,将把arm-linux-gcc 安装到/usr/loca/arm/4.3.2 目录。

解压过程如图所示:Step2:把编译器路径加入系统环境变量,运行命令#gedit /root/.bashrc编辑/root/.bashrc 文件,在最后一行export PATH=$PATH:/usr/local/arm/4.3.2/bin如图,保存退出。

重新登录系统(不必重启机器,开始->logout 即可),使以上设置生效,在命令行输入arm-linux-gcc –v,会出现如下信息,这说明交叉编译环境已经成功安装。

5.4 解压安装源代码及其他工具本小节将解压安装开发学习过程所用到的全部源代码以及其他一些小工具,这包括:- linux-2.6.29 内核源代码- 嵌入式图形界面Qropia 源代码(分为x86 和arm 平台两个版本)- busybox-1.13 源代码- linux 编程示例源代码(均为友善之臂自主开发并开放)- linux 下的开源bootloader(vivi 和u-boot)- 其他开源软件源代码,如boa(web server), madplay(一个命令行mp3 播放器)- 目标文件系统目录- 目标文件系统映象制作工具mkyaffsimage- 图形界面的Linux logo 制作工具logo_maker注意:所有的源代码和工具都是通过解压方式安装的,所有的源代码均使用统一的编译器arm-linux-gcc-4.3.2 编译(见上一节)下面是详细的解压安装过程,并有简要的介绍。

ARM开发板mini2440的按键控制LED小程序

ARM开发板mini2440的按键控制LED小程序

ARM开发板mini2440的按键控制LED小程序Posted in Hardware&Device by Hans AdreamanMay 24, 2009Tags: LED, mini2440, s3c2440, 嵌入式, 开发板, 按键, 驱动mini2440是当前最经济的arm9开发板了,目前就是500多元一块,麻雀虽小,重要的那几个部件也还算齐全,用它来做计算机系统底层的学习工具很合适。

而且关于s3c2410/2440系列的教程资料和经验文章在网上很多,大家遇到问题时多google一下也能快速地解决。

先拿一个最初步的LED控制程序上手吧。

我的实验开发环境是基于ubuntu9.04系统。

控制硬件的行为,说到底就是设置其对应的寄存器。

mini2440开发板有四个LED灯(下图黄色部分,得把LED 屏先取下来才能看到,用螺丝刀取下四角的四颗螺丝),还有六个按键(很小,在cmos电池的旁边排成两列,下图红色圈住的部分),我们可以通过配置这些硬件对应的寄存器的值(根据映射在内存空间的地址),来控制它们。

例如,四个LED灯有一个配置寄存器(在mini2440板上对应标称为GPBCON)和一个数据寄存器(对应标称为GPBDAT),这两个寄存器都是32bit的整数数值。

mini2440开发板布局图四个LED灯分别使用GPBCON寄存上的4组“2bit位”来配置其是否是输出状态,例如,LED1使用第11、12bit,LED2使用第13、14bit,LED3使用第15、16bit,LED4使用第17、18bit。

当把这两位(从高位到低位的顺序看,即[bit12、bit11]这样为一组)设置为00则表示输入状态,01(对于LED1就是bit12为0,bit11为1)表示输出状态,10为特殊功能,11保留待用。

GPBDAT寄存器的其中4个bit对应着4个LED灯的数值状态。

第6个比特对应LED1,第7个比特对应LED2,第8个比特对应LED3,第9个比特对应LED4。

一起学mini2440裸机开发(六)--UART原理与基础实验

一起学mini2440裸机开发(六)--UART原理与基础实验

一起学mini2440裸机开发(六)--UART原理与基础实验我个人感觉UART也不算是很难,学过单片机的相信都用过UART,在这里还是说说它吧,并且在写基础实验并调试的时候,出现了一个问题,就是我们平时使用jlink调试程序都是基于在sdram中运行的,由于ram的掉电易失性,所以咱们的裸机程序根本就不能脱机工作,也即是说复位之后程序就没有了,当然,我知道可以利用以后学的知识将它下载到NAND Flash中去,这个以后再说。

貌似还有一个办法,就是使用mdk直接Download到flash,不过需要什么算法之类的,这个算法我还不懂,先不管他了,先把UART的原理实验弄清楚了再说,以后学了nand flash就可以脱机工作了。

UART概述S3C2440通用异步收发器(UART)提供3个独立的异步串行I/O(UART0、UART1、UART2),每个端口都可以在中断或DMA模式下。

也就是说,在CPU和UART之间传输数据时,UART可以产生中断或DMA请求。

使用UART的最简单情况是只使用3根线:Tx用于数据发送,Rx用于数据接收,GND 是双方地线,提供通信双方的参考电平,如图1所示:其中电平转换器的作用是完成通信双方之间的电平转换,这又牵扯到RS232电平和CMOS电平,咱可以不管它,可以直接假设PC机的Rx、Tx粉笔用两根线直接与SC2440的Tx、Rx相连就行了,即,PC机发送端Tx发送一个数据,S3C2440接收端Rx就能接收到该数据,反之亦然。

S3C2440处理器UART工作原理:S3C240的3个UART包括可编程的波特率,红外(IR)发射/接收,一个或两个停止位,5位、6位、7位或8位的数据宽度,和奇偶校验位。

(不很懂是吧,其实我开始也不懂,这是什么玩意儿)每个UART包含一个波特率发生器、发送器、接收器和一个控制单元,如图2所示。

波特率发生器的输入时钟有3种:PCLK、FCLK/n、UEXTCLK(外部输入时钟)。

mini2440上qtopia应用程序开发步骤(arm-qtopia版本).

mini2440上qtopia应用程序开发步骤(arm-qtopia版本).

在完成x86下的qtopia的应用程序设计之后,就可以着手在arm上进行移植了,下面我将介绍如何在arm平台上开发qtopia应用程序,所有的编译工作将在arm-qtopia文件夹下完成。

同样地,我也会介绍一种一般性移植方法,和一种较快捷,简便的方法。

主机环境:RedHat9编译工具:arm-linux-gcc-4.3.21、进入arm-qtopia,创建工程文件夹2、设置开发环境,执行命令 # source qtopia-2.2.0-FriendlyARM/setQpeEnv3、创建工程 # progen -t app -o (工程名.pro4、进入qtopia-2.2.0-FriendlyARM/qt2/bin,启动Qt designer # ./designer,即可以进行图形界面的设计,5、将.ui文件存放在工程文件夹中6、生成.h和.cpp文件,运用.ui文件,# uic -o *.h *.ui # uic -o *.cpp -impl *.h *.ui7、在.h和.cpp文件中添加需要的代码8、编写main.cpp9、修改.pro文件,为其中的HEADERS= SOURCES= TARGET=添加文件,HEADERS指头文件,若有多个用空格分隔SOURCES为源文件,TARGET为目标文件,即最后生成的可执行文件名10、生成Makefile(1修改tmake/lib/qws/linux-arm-g++/tmake.conf将TMAKE_LINK=arm-linux-gcc和TMAKE_SHLIB=arm-linux-gcc改为=arm-linux-g++(2生成Makefile # tmake -o Makefile *.pro,如果是从x86下移植,请将x86下生成的Makefile删除(3修改Makefile 为LIBS=添加–luuid -lqtopia2 -lqtopia –lqpe11、生成可执行文件 # make12、编写一个.desktop,格式如下:[Desktop Entry]comment=A Hello Program //说明Exec=hello //可执行程序文件名Icon=Hello //图标名任意Type=Application //程序类型不变Name=hello //可执行程序文件名13、将可执行文件拷贝至root_qtopia/opt/Qtopia/bin下,将.desktop拷贝至root_qtopia/opt/Qtopia/apps下(我采用的是nfs挂载方式)以上就是在arm上开发qtopia应用程序的一般步骤,下面介绍较为简便的步骤:1、进入arm-qtopia,建立工程目录2、将编写好的.cpp和.h拷贝至工程目录3、产生工程文件执行命令 # qmake -project4、修改.pro工程文件在文件最后架上TARGET=可执行文件名5、拷贝arm-qtopia中例程hello中的脚本文件build至工程目录,并执行 # ./build,该脚本已经将设置环境变量调用相应库生成Makefile,生成可执行文件写入其中。

mini2440开发板内核模块编译及配置详解

mini2440开发板内核模块编译及配置详解

Linux 内核每个文件夹中都有一个相应的makefile,通过递归来调用各个文件夹中的makefile 来编译Linux内核。

现在我们通过一个char设备为例来讲解makefile与Kconfig的配置以及对应于menuconfig之间的相互对应,现在我们编写了一个mini2440_hello.c一个简单的例子,看看是怎样配置以及烧写到mini2440开发板上面去运行。

mini2440_hello.c的代码如下,仅供参考。

#include <linux/init.h>#include <linux/module.h>#include <linux/moduleparam.h>MODULE_LICENSE("Dual BSD/GPL");//Module load Functionstatic int hello_init(void){printk(KERN_ALERT "hello, module!\n");return 0;}//Module Unload Functionstatic void hello_exit(void){printk(KERN_ALERT "Goodbye, module!\n");}// beclarationmodule_init(hello_init);module_exit(hello_exit);首先我们打开/linux-2.6.32.2/drivers/char目录下的Makefile和Kconfig文件,Makefile Kconfig把我们刚刚编写好的mini2440_hello.c放入/linux-2.6.32.2/drivers/char中,目的是将mini2440_hello.c当作是一个杂项设备看待。

对Makefile和Kconfig的配置如上图,配置完了以后,回到/linux-2.6.32.2,输入make menuconfig则出现图形化菜单。

mini2440 led驱动调试

mini2440 led驱动调试

Mini2440调试总结从网上190RMB淘的mini2440开发板一块,当然什么配件都没有,要想学习必须自己找资料,找教程。

写这篇文章就是想记录我从0开始是如何学习arm-linux的,同时也为以后学习留下一些脚印。

下面是我自拿到开发板,在学习过程中所遇到的困难和自己的一小小总结。

在mini2440 上学习arm-linux,我主要经历了以下几个阶段(说是阶段,让大家见笑了。

对于arm-linux大神来说简直就是几分钟就能解决的事。

)1、烧写linux kernel2、搭建交叉编译环境3、编写led驱动4、下载至目标板观察、调试。

下面我来说说我在以上4阶段所遇到的问题,以及自己是如何解决的。

一、烧写linux kernellinux kernel的烧写,我参照mini2440的手册步骤,结构我的系统是win7的usb驱动怎么安都安不上,DNW当然也用不上。

最后我在网上找到了“SuperVivi-Transfer-Tool-Complete”和“SuperVivi-Transfer-Tool”,参照网上一篇“mini2440在win7下安装usb驱动”(网址/link?url=-AUR42L_7B4ywrmUF7mZo6J16b-0jbQ6qyZPBKzn4hbYfJfTVf2j XOjS2Zl07DSerppztQHPUFZSfCMgWnx9jth7-kSEL4w3TNkH-IiWNPy)的文章,成功安装了usb 驱动,并替换了DNW实现了vivi128M的下载,内核/文件系统的烧写。

就这样我的第一个linux系统烧写成功(具体步骤参照mini2440手册)二、搭建交叉编译环境这一步我也比较顺利的完成了,主要是得益于网上的一篇文章。

在此我灰常感谢百度贴吧里一位叫做“0000只是朱颜改”的网友,他写的“基于mini2440开发板的交叉编译环境及内核树配置”这篇文章详细描写了交叉编译环境的构建,我之后将会把此文章结合我自己的情况修改转载至我的网站。

一起学mini2440裸机开发(一)--第一个led灯点亮

一起学mini2440裸机开发(一)--第一个led灯点亮

一起学mini2440裸机开发(一)--第一个led灯点亮开发板:mini2440,NandFlash:K9F2G08U0B 256M大小,CPU:S3C2440A 。

开发环境:MDK4.11仿真器:Jlink v8这是我用csdn发表的第一个文章,之前使用过arm-linux-gcc裸机开发mini2440,但是很多函数什么的不能直接调用(我的技术问题),准备重新整理一下ARM裸机,整理好之后准备下一阶段学习。

关于软件MDK4.11和它的注册机,我传不上去,说是由于文件太大,又想要的直接加Q470868560要就行了。

下面开始我们的第一个LED灯的点亮程序吧!1、新建一个项目工程双击MDK图标进入开发环境,如下图,单击Project/New uVision Project,选择你要创建文档的位置,文档名为test,单击保存选择CPU为Samsung/S3C2440A,单击OK单击完OK按钮后,咱们先看一下原来的空test文件夹里多了什么文件,当然你也可以不用看,我是看看MDK到底是默认给咱们提供了什么方便,下图为单击OK后多出的文档很容易看出多出来一个test工程文档。

在上一步单击完OK后,会弹出下图,该图是为了让你选择是不是将Samsung S3C2440的启动代码复制添加的你的工程文档。

这段启动代码咱们以后分析,在这里先选择“是”选择“是”后,一个工程文档建好了,如下图所示。

你看上图,可以看到工程文档自动添加了S3C2440.s,这就是上一步选择“是”后自动添加的启动代码,咱们再看看test文件夹里多了什么文件。

很容易可以看出多了三个文件,其中一个就是S3C2440.s,这个代码很重要啊。

咱们现在先不管他,接着下一步。

2、新建一个文件。

选择File/New,新建一个文件。

将该文件保存并命名为test1,注意后面要加后缀.c,单击保存将test1.c文件添加到你的工程,对着Source Group1右击,选择“Add Files to Group "Source Group 1"...”选择刚才建立的test1.c,单击Add,该文件就被加到了工程中。

mini2440-128M开发板裸奔系列10——LCD测试程序

mini2440-128M开发板裸奔系列10——LCD测试程序

mini2440-128M开发板裸奔系列10——LCD测试程序2010-04-13 11:01#include "def.h"#include "option.h"#include "2440addr.h"#include "2440lib.h"#include "2440slib.h"extern const unsigned char sunflower_240x320[];extern const unsigned char girl[];extern const unsigned char Zhaidi[];extern const unsigned char hua[];//extern const unsigned char sunflower_800x480[];//extern const unsigned char sunflower_1024x768[];//extern const unsigned char sunflower_640x480[];#define LCD_XSIZE LCD_WIDTH#define LCD_YSIZE LCD_HEIGHT#define SCR_XSIZE LCD_WIDTH#define SCR_YSIZE LCD_HEIGHTvolatile static unsigned short LCD_BUFFER[SCR_YSIZE][SCR_XSIZE];/**************************************************************640×480 TFT LCD数据和控制端口初始化**************************************************************/static void Lcd_Port_Init( void ){----------------------------精品word文档值得下载值得拥有----------------------------------------------rGPCUP=0xffffffff; // 端口C上拉控制P141rGPCCON=0xaaaa02a8; //配置端口C的引脚功能P141Initialize VD[7:0],VM,VFRAME,VLINE,VCLKrGPDUP=0xffffffff; // Disable Pull-up registerrGPDCON=0xaaaaaaaa; //Initialize VD[15:8] P142}/**************************************************************640×480 TFT LCD功能模块初始化**************************************************************/static void LCD_Init(void){#define M5D(n) ((n)&0x1fffff)#define LCD_ADDR ((U32)LCD_BUFFER)rLCDCON1 = (LCD_PIXCLOCK << 8) | (3 << 5) | (12 << 1);//p200 CLKVAL=0x14 PNRMODE[6:5]为11rLCDCON2 = (LCD_UPPER_MARGIN << 24) | ((LCD_HEIGHT - 1) << 14) | (LCD_LOWER_MARGIN << 6) | (LCD_V SYNC_LEN << 0);//P201 [31:24]VBPD:场同步信号后沿[23:14]LINEVAL:决定LCD屏的垂直方向的大小[13:6]VFPD场同步信号前沿[5:0]VSP W:场同步脉冲宽度rLCDCON3 = (LCD_RIGHT_MARGIN << 19) | ((LCD_WIDTH - 1) << 8) | (LCD_LEFT_MARGIN << 0);//P201 [25:19]HBPD WDLY [18:8]决定LCD水平显示尺寸【7:0】rLCDCON4 = (13 << 8) | (LCD_HSYNC_LEN << 0);//[15:8]:MVAL 该位只对STN屏有效,当MMODE置位为1时,决定VM的变换频率[7:0]行同步脉冲宽度#if !defined(LCD_CON5)# define LCD_CON5 ((1<<11) | (1 << 9) | (1 << 8) | (1 << 3) | (1 << 0))//P202#endif----------------------------精品word文档值得下载值得拥有----------------------------------------------rLCDCON5 = LCD_CON5;rLCDSADDR1 = ((LCD_ADDR >> 22) << 21) | ((M5D(LCD_ADDR >> 1)) << 0); //p203rLCDSADDR2 = M5D((LCD_ADDR + LCD_WIDTH * LCD_HEIGHT * 2) >> 1); //p203rLCDSADDR3 = LCD_WIDTH; //p203rLCDINTMSK |= 3; ////p205-206 屏蔽LCD帧同步中断屏蔽LCD FIFO中断rTCONSEL &= (~7);rTPAL = 0x0;rTCONSEL &= ~((1<<4) | 1);}/**************************************************************LCD视频和控制信号输出或者停止,1开启视频输出**************************************************************/static void Lcd_EnvidOnOff(int onoff){if(onoff==1)rLCDCON1|=1; // ENVID=ONelserLCDCON1 =rLCDCON1 & 0x3fffe; // ENVID Off}/**************************************************************320×240 8Bpp TFT LCD 电源控制引脚使能----------------------------精品word文档值得下载值得拥有----------------------------------------------**************************************************************/static void Lcd_PowerEnable(int invpwren,int pwren){//GPG4 is setted as LCD_PWRENrGPGUP = rGPGUP|(1<<4); // Pull-up disablerGPGCON = rGPGCON|(3<<8); //GPG4=LCD_PWREN//Enable LCD POWER ENABLE FunctionrLCDCON5 = rLCDCON5&(~(1<<3))|(pwren<<3); // PWRENrLCDCON5 = rLCDCON5&(~(1<<5))|(invpwren<<5); // INVPWREN}/**************************************************************640×480 TFT LCD单个象素的显示数据输出**************************************************************/static void PutPixel(U32 x,U32 y,U16 c){if(x<SCR_XSIZE && y<SCR_YSIZE)LCD_BUFFER[(y)][(x)] = c;}/**************************************************************640×480 TFT LCD全屏填充特定颜色单元或清屏**************************************************************/----------------------------精品word文档值得下载值得拥有----------------------------------------------static void Lcd_ClearScr( U32 c){unsigned int x,y ;for( y = 0 ; y < SCR_YSIZE ; y++ ){for( x = 0 ; x < SCR_XSIZE ; x++ ){LCD_BUFFER[y][x] = c ;}}}/**************************************************************LCD屏幕显示垂直翻转// LCD display is flipped vertically// But, think the algorithm by mathematics point.// 3I2// 4 I 1// --+-- <-8 octants mathematical cordinate// 5 I 8// 6I7**************************************************************/static void Glib_Line(int x1,int y1,int x2,int y2, U16 color)----------------------------精品word文档值得下载值得拥有----------------------------------------------{int dx,dy,e;dx=x2-x1;dy=y2-y1;if(dx>=0){if(dy >= 0) // dy>=0{if(dx>=dy) // 1/8 octant{e=dy-dx/2;while(x1<=x2){PutPixel(x1,y1,color);if(e>0){y1+=1;e-=dx;}x1+=1;e+=dy;}}else // 2/8 octant{e=dx-dy/2;----------------------------精品word文档值得下载值得拥有----------------------------------------------while(y1<=y2){PutPixel(x1,y1,color);if(e>0){x1+=1;e-=dy;}y1+=1;e+=dx;}}}else // dy<0{dy=-dy; // dy=abs(dy)if(dx>=dy) // 8/8 octant{e=dy-dx/2;while(x1<=x2){PutPixel(x1,y1,color);if(e>0){y1-=1;e-=dx;}x1+=1;e+=dy;}}----------------------------精品word文档值得下载值得拥有----------------------------------------------else // 7/8 octant{e=dx-dy/2;while(y1>=y2){PutPixel(x1,y1,color);if(e>0){x1+=1;e-=dy;}y1-=1;e+=dx;}}}}else //dx<0{dx=-dx; //dx=abs(dx)if(dy >= 0) // dy>=0{if(dx>=dy) // 4/8 octant{e=dy-dx/2;while(x1>=x2){----------------------------精品word文档值得下载值得拥有----------------------------------------------PutPixel(x1,y1,color);if(e>0){y1+=1;e-=dx;}x1-=1;e+=dy;}}else // 3/8 octant{e=dx-dy/2;while(y1<=y2){PutPixel(x1,y1,color);if(e>0){x1-=1;e-=dy;}y1+=1;e+=dx;}}}else // dy<0{dy=-dy; // dy=abs(dy)if(dx>=dy) // 5/8 octant{----------------------------精品word文档值得下载值得拥有----------------------------------------------e=dy-dx/2;while(x1>=x2){PutPixel(x1,y1,color);if(e>0){y1-=1;e-=dx;}x1-=1;e+=dy;}}else // 6/8 octant{e=dx-dy/2;while(y1>=y2){PutPixel(x1,y1,color);if(e>0){x1-=1;e-=dy;}y1-=1;e+=dx;}}}}}----------------------------精品word文档值得下载值得拥有----------------------------------------------/**************************************************************在LCD屏幕上用颜色填充一个矩形**************************************************************/static void Glib_FilledRectangle(int x1,int y1,int x2,int y2, U16 color){int i;for(i=y1;i<=y2;i++)Glib_Line(x1,i,x2,i,color);}/**************************************************************在LCD屏幕上指定坐标点画一个指定大小的图片**************************************************************/static void Paint_Bmp(int x0,int y0,int h,int l,const unsigned char *bmp){int x,y;U32 c;int p = 0;for( y = 0 ; y < l ; y++ ){for( x = 0 ; x < h ; x++ ){----------------------------精品word文档值得下载值得拥有----------------------------------------------c = bmp[p+1] | (bmp[p]<<8) ;if ( ( (x0+x) < SCR_XSIZE) && ( (y0+y) < SCR_YSIZE) )LCD_BUFFER[y0+y][x0+x] = c ;p = p + 2 ;}}}/****************************************************************************************************************************/void TFT_LCD_Init(void){LCD_Init();LcdBkLtSet( 70 ) ;Lcd_PowerEnable(0, 1);Lcd_EnvidOnOff(1); //turn on vedioLcd_ClearScr( (0x00<<11) | (0x00<<5) | (0x00) );#if defined(LCD_N35) || defined(LCD_T35)Paint_Bmp(0, 0, 240, 320, hua);#endif}/****************************************************************************************************************************/void TFT_LCD_Test(void)----------------------------精品word文档值得下载值得拥有----------------------------------------------{#if defined(LCD_N35) || defined(LCD_T35)Uart_Printf("\nTest TFT LCD 240x320!\n");#endifLcd_Port_Init();LCD_Init();Lcd_EnvidOnOff(1); //turn on vedioLcd_ClearScr( (0x07e0<<11) | (0x07e0<<5) | (0x07e0) ) ; //clear screenUart_Printf( "\nLCD clear screen is finished! press any key to continue!\n" );Uart_Getch() ; //wait uart inputLcd_ClearScr( (0x1f<<11) | (0x3f<<5) | (0x1f) ) ; //clear screenUart_Printf( "LCD clear screen is finished! press any key to continue!\n" );Uart_Getch() ; //wait uart input//Lcd_ClearScr(0xffff); //fill all screen with some color#define LCD_BLANK 30#define C_UP ( LCD_XSIZE - LCD_BLANK*2 )#define C_RIGHT ( LCD_XSIZE - LCD_BLANK*2 )#define V_BLACK ( ( LCD_YSIZE - LCD_BLANK*4 ) / 6 )Glib_FilledRectangle( LCD_BLANK, LCD_BLANK, ( LCD_XSIZE - LCD_BLANK ), ( LCD_YSIZE - LCD_BLANK ),0x000 0); //fill a Rectangle with some colorGlib_FilledRectangle( (LCD_BLANK*2), (LCD_BLANK*2 + V_BLACK*0), (C_RIGHT), (LCD_BLANK*2 + V_BLACK*1),0x00 1f); //fill a Rectangle with some colorGlib_FilledRectangle( (LCD_BLANK*2), (LCD_BLANK*2 + V_BLACK*1), (C_RIGHT), (LCD_BLANK*2 + V_BLACK*2),0x07 ----------------------------精品word文档值得下载值得拥有----------------------------------------------e0); //fill a Rectangle with some colorGlib_FilledRectangle( (LCD_BLANK*2), (LCD_BLANK*2 + V_BLACK*2), (C_RIGHT), (LCD_BLANK*2 + V_BLACK*3),0xf80 0); //fill a Rectangle with some colorGlib_FilledRectangle( (LCD_BLANK*2), (LCD_BLANK*2 + V_BLACK*3), (C_RIGHT), (LCD_BLANK*2 + V_BLACK*4),0xffe 0); //fill a Rectangle with some colorGlib_FilledRectangle( (LCD_BLANK*2), (LCD_BLANK*2 + V_BLACK*4), (C_RIGHT), (LCD_BLANK*2 + V_BLACK*5),0xf81 f); //fill a Rectangle with some colorGlib_FilledRectangle( (LCD_BLANK*2), (LCD_BLANK*2 + V_BLACK*5), (C_RIGHT), (LCD_BLANK*2 + V_BLACK*6),0x07f f); //fill a Rectangle with some colorUart_Printf( "LCD color test, please look! press any key to continue!\n" );Uart_Getch() ; //wait uart input#if defined(LCD_N35) || defined(LCD_T35)Paint_Bmp(0, 0, 240, 320, hua);/*#elif defined(LCD_A70)Paint_Bmp(0, 0, 800, 480, sunflower_800x480);#elif defined(LCD_L80)Paint_Bmp(0, 0, 640, 480, sunflower_640x480);#elif defined(LCD_VGA1024768)Paint_Bmp(0, 0, 1024, 768, sunflower_1024x768);*/#endifUart_Printf( "LCD paint a bmp, please look! press any key to continue! \n" );Uart_Getch() ; //wait uart inputLcd_EnvidOnOff(0); //turn off vedio}//*************************************************************----------------------------精品word文档值得下载值得拥有--------------------------------------------------------------------------精品word文档值得下载值得拥有----------------------------------------------。

嵌入式Linux之我行 mini2440按键驱动

嵌入式Linux之我行 mini2440按键驱动

嵌入式Linux之我行,主要讲述和总结了本人在学习嵌入式linux中的每个步骤。

一为总结经验,二希望能给想入门嵌入式Linux的朋友提供方便。

如有错误之处,谢请指正。

∙共享资源,欢迎转载:一、开发环境∙主机:VMWare--Fedora 9∙开发板:Mini2440--64MB Nand, Kernel:2.6.30.4∙编译器:arm-linux-gcc-4.3.2二、实现步骤1. 硬件原理图分析。

由原理图可知每个按键所用到的外部中断分别是EINT8、EINT11、EINT13、EINT14、EINT15、EINT19,所对应的IO口分别是GPG0、GPG3、GPG5、GPG6、GPG7、GPG11。

再由按键的接口电路可知,当按键按下时按键接通,中断线上原有的VDD33V高电平被拉低,从而触发中断的产生。

2. 开始编写合适mini2440的按键驱动(含去抖动功能),文件名:my2440_buttons.c1)按键驱动基本框架。

这里我就指定主设备号为232,简单的注册为字符设备,另定义了一个结构体把按键要用到的资源组织起来#include<mach/regs-gpio.h>#include<mach/hardware.h>#define DEVICE_NAME "my2440_buttons"//设备名称#define DEVICE_MAJOR 232 //主设备号//组织硬件资源结构体struct button_irq_desc{int irq;//中断号int pin;//对应的IO引脚int pin_setting;//引脚配置char*name;//按键名称,注意这个名称,在后面的一个现象中会出现};//定义6个按键资源结构体数组static struct button_irq_desc button_irqs[]={{IRQ_EINT8 , S3C2410_GPG0 , S3C2410_GPG0_EINT8 ,"KEY0"}, {IRQ_EINT11, S3C2410_GPG3 , S3C2410_GPG3_EINT11 ,"KEY1"}, {IRQ_EINT13, S3C2410_GPG5 , S3C2410_GPG5_EINT13 ,"KEY2"}, {IRQ_EINT14, S3C2410_GPG6 , S3C2410_GPG6_EINT14 ,"KEY3"}, {IRQ_EINT15, S3C2410_GPG7 , S3C2410_GPG7_EINT15 ,"KEY4"}, {IRQ_EINT19, S3C2410_GPG11, S3C2410_GPG11_EINT19,"KEY5"}, };static int __init button_init(void){int ret;//注册字符设备ret = register_chrdev(DEVICE_MAJOR, DEVICE_NAME,&buttons_fops);if(ret < 0){printk(DEVICE_NAME " register faild!\n");return ret;}return 0;}static void __exit button_exit(void){//注销字符设备unregister_chrdev(DEVICE_MAJOR, DEVICE_NAME);}module_init(button_init);module_exit(button_exit);MODULE_LICENSE("GPL");MODULE_AUTHOR("Huang Gang");MODULE_DESCRIPTION("My2440 button driver");2)设备注册时用到的设备操作结构体buttons_fops的定义。

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验一mini2440裸板驱动开发环境搭建讲师:杨行【实验目的】1、了解minicom配置串口通信参数的过程,掌握利用minicom进行传输文件方法2、了解网络文件系统nfs的配置,掌握利用nfs进行文件的传输和异地运行目标板程序3、掌握tftp的使用方法【实验原理】一、安装编译器1. mkdir /usr/local/arm2. tar xjvf arm-linux-gcc-4.4.3.tar.bz2 –C /usr/local/arm3. vim /etc/profile+PATH=/usr/local/arm/4.4.3/bin:$PA TH4. source /etc/profile5. arm-linux-gcc -v注意:1 Ubuntu 14.04 64位系统无法运行32位可执行文件,需要安装一个32位兼容库lib32z12Ubuntu 12.04 64位系统安装ia32-libs3sudo apt-get install libstdc++64sudo apt-get install lib32stdc++6二、minicom的使用1. 安装:sudo apt-get install minicom2. 配置:minicom -s3. 使用:命令:ctrl a + q quitctrl a + w lineWrapctrl a + z help1、串口通信参数的设置确认USB转串口工具是否已经连接到电脑上,如果连接到电脑上,则:ls /dev/ttyUSB0如果已经确认了ttyUSB0已经存在,则:首先运行minicom,由于minicom是通过串口来工作的,所以要通过minicom程序来对串口通信参数进行设置。

启动minicom的设置窗口:在linux的终端中输入“minicom –s”,然后,按下回车键。

spring@spring-virtual-machine:~$ sudo minicom -s“-s”选项调出配置信息。

下面显示的就是配置的菜单。

有关串口通信选项的含义:"Filenames and paths":选择需要传输的文件和路径"File transfer protocols":选择传输文件的通信协议"Serial port setup":设置串口通信参数"Save setup as dfl":将设置好的各项参数保存为dfl"Save setup as":将设置好的各项参数保存为自定义的文件名"Exit":退出返回到minicom设置好后的终端"Exit from Minicom":从minicom命令中退出返回Linux终端将光标移到"Serial port setup",按回车键会弹出串口通信参数的配置菜单。

(1)、串口通信口的选择:(A - Serial Device)接"A"键把光标移动到Serial Device。

如果串口线连在PC机的串口1上,则把Serial device设置为/dev/ttyUSB0。

如果连在串口2上,则把Serial device设置为/dev/ttyUSB1,然后按下回车键。

(2)、串口参数的设置(E - Bps/Par/Bits)按"E"键来设置通信波特率、数据位、奇偶校验位和停止位。

可以通过按下不同的键来设置通信参数。

例如mini2440平台需要把波特率设为115200,数据位设为8,奇偶校验位设为无,停止位设为1。

可以分别通过按"E"、"V"、"L"、"W"键设置波特率、数据位、奇偶校验位和停止位。

设置完后按"Esc"返回。

(3)、数据流的控制选择(F - Hardware Flow Control、G - Software Flow Control)按"F"键可以完成硬件流控制切换,即完成"Yes"与"No"之间的切换。

按"G"键完成软件流控制切换,即完成"Yes"与"No"之间的切换。

下图显示的是串口配置好的后完整信息。

(4)、设置参数的保存与退出配置完成后,按下“Esc”键,将会出现下图的配置菜单。

选择“Save setup as dfl”按ENTER键来保存,当配置保存后,按下“Esc”键完成设置。

当minicom窗口出现后,将mini2440开发板的启动方式选择按键拨到nor flash重起mini2440将会看到启动信息。

如果没有出现启动信息,请检查mincom的设置和线缆连接是否有错。

2、利用串口通信文件传输在与目标板连接后,可以通过串口下传一些文件到目标板,具体操作步骤如下:(1)、在与目标正确连接后,进入[root@51board~],按下CTRL+A键后,再按Z键,系统调出minicom的命令选项菜单;其中Send files和Receive files两项负责文件数据的传输,所用命令使用热键进行激活。

如上传文件只需按S键。

(2)、当向目标板上传文件时,按S键,系统弹出串口通信协议选项,利用方向键选中zmodem 传输协议,按回车键,进入文件选择菜单。

(3)、文件传输文件选择菜单弹出后,利用空格键选中需要上传的文件,一次可以选择多个文件,选好需要传输的文件后按回车键,便可以进行文件数据传输。

当数据传输完毕,系统会弹出传输完毕提示菜单(如下图所示)。

三、安装tftp服务1. sudo apt-get install tftp tftpd xinetd2. sudo vim /etc/xinetd.d/tftpservice tftp{socket_type = dgramprotocol = udpwait = yesuser = rootserver = /usr/sbin/in.tftpdserver_args = -s /tftpbootdisable = noper_source = 11cps = 100 2 #每秒100连接入站,如果超过限制则等待2秒flags = IPv4}3. sudo mkdir /tftpboot4. sudo chmod 777 /tftpboot -R5. sudo /etc/init.d/xinetd restart6. sudo netstat -a | grep tftp说明:修改项server_args = -s <path> -c,其中<path>处可以改为你的tftp-server的根目录,参数-s指定chroot,-c 指定了可以创建文件。

四、安装NFS服务1. sudo apt-get install nfs-kernel-server2. sudo vim /etc/exports+/nfsroot *(rw,sync,no_root_squash)3. sudo /etc/init.d/portmap restart4. sudo /etc/init.d/nfs-kernel-server restart5. showmount -e网络文件系统nfs可以将PC机上的一部分文件系统作为目标机的资源,这样可以弥补目标机存储空间的不足。

在使用网络文件之时,应对网络文件配置进行一定的设置。

[root@51Board~]$ mount –t nfs 192.168.1.12:/mnt/nfs /mnt上述设置实现将主机上的/mnt/nfs目录挂载到目标机的/mnt目录下,并作为目标机文件系统的一部分。

这时,可以将需要传输的文件或需要运行的程序保存在主机的/mnt/nfs目录下,然后在目标机对主机/mnt/nfs上的文件进行运行或复制等相应的处理。

五、编译安装u-boot1. tar xvf bootloader.tar2. cd bootloader3. cd u-boot4. make distclean5. make mini2440_config6. make -j27. cp u-boot.bin ~/桌面8.使用mini2440提供的MiniTools 烧写到开发板中注:开发板的S2开关搬到nor处。

make clean仅仅是清除之前编译的可执行文件及配置文件。

而make distclean要清除所有生成的文件。

下载完成后,将S2开关拨到nand处,启动板子,出现如下信息:快速的按下任意键(建议按下回车键),使得进入u-boot模式中:六、使用putty工具实现远程桌面连接1、在ubuntu系统中安装ssh,可使用如下的命令进行安装:sudo apt-get install openssh-server2、为了保险起见,安装完成后重启一下ssh服务,命令如下:3、下载putty,运行,如下后图所示,输入IP地址即可,注意端口号不要改4、点击open,即可建立远程连接,运行后如下图所示6、输入用户名后回车,然后会提示输入密码,这时输入相应的密码就可以了注意:如果直接登录在登录时可能会出现中文乱码的情况,这时可以在登录前进行如下的设置,就不会出现乱码了这里我选择的是UTF-8是因为我的ubuntu系统是UTF-8编码格式的,大家可根据实际情况进行设置七、Ubuntu终端远程连接计算机(Linux)SSH是一个远程接入软件,可以让你想坐在计算机前面一样操作计算机。

SSH使用加密方式传输数据,是一种非常安全的工作方式。

步骤如下:前提:如果没有安装ssh的话请sudo apt-get install ssh1、在需要远程访问的计算机的“新立得”里面安装openssh-server。

这台计算机是远程计算机,你当前使用的计算机是本地计算机。

如果使用Ubuntu或者其他Linux版本,已经安装了连接到远程计算机的软件。

2、远程计算机软件安装完毕。

在本地计算机的终端里面输入:ssh username@address其中username是远程计算机的账户名称,address是远程计算机的IP地址或者域名。

平日你希望以root用户名登录192.168.0.99,可以使用:例如:ssh spring@192.168.0.99如果不知道远程计算机的IP地址,可以在远程计算机上面点击网络监视器,选择“连接信息”,查看IP地址信息。

3、首次连接,可能提示“the authenticity of the host can’t be established”。

相关文档
最新文档