文档库 最新最全的文档下载
当前位置:文档库 › exynos4412-uboot移植笔记

exynos4412-uboot移植笔记

exynos4412-uboot移植笔记
exynos4412-uboot移植笔记

Exynos4412 uboot移植笔记

一、准备原料

三星原厂提供的UBOOT代码-u-boot-samsung-dev.

二、在4212平台代码基础上修改成自己的平台YYGY4412

1.用户目录下新建文件夹yygy4412-uboot cd, mkdir yygy4412-uboot

2.进入yygy4412-uboot文件夹,将三星平台代码压缩文件拷贝至此。解压,重命名为:yygy4412-uboot tar -vxf u-boot-samsung-dev.tar.gz mv u-boot-samsung-dev yygy4412-uboot

3.拷贝迅为的CodeSign4SecureBoot文件夹到当前目录。至此当前目录结构为:

4.进入文件夹yygy4412-uboot cd yygy4412-uboot 进入三星平台cd board/samsung

cp -rf smdk4212 yygy4412 cd yygy4412

Mv clock_init_smdk4212.S clock_init_yygy4412.S

Mv mem_init_smdk4212.S mem_init_yygy4412.S

Mv smdk4212.c yygy4412.c

Mv smdk4212_val.h yygy4212_val.h

Mv smdk4412_val.h yygy4412_val.h

Vi lowlevel_init.S

#ifdef CONFIG_EXYNOS4412

#include "smdk4412_val.h" //改为#include "yygy4412_val.h"

#else

#include "smdk4212_val.h" //改为#include "yygy4212_val.h"

#endif

Vi clock_init_yygy4412.S

#ifdef CONFIG_EXYNOS4412

#include "smdk4412_val.h" //改为#include "yygy4412_val.h"

#else

#include "smdk4212_val.h" //改为#include "yygy4212_val.h"

#endif

Vi Makefile

33行:COBJS-y := smdk4212.o //改为:COBJS-y := yygy4412.o

37行;SOBJS += mem_init_smdk4212.o //改为:SOBJS += mem_init_yygy4412.o

38 ;SOBJS += clock_init_smdk4212.o //改为:SOBJS += clock_init_yygy4412.o

Cd , cd yygy4412-uboot/yygy4412-uboot

修改boards.cfg 添加yygy4412 arm armv7 yygy4412 samsung exynos Cp -av include/configs/smdk4412.h include/configs/yygy4412.h

Vi include/configs/yygy4412.h

265: #define CONFIG_SYS_PROMPT "SMDK4412 # "

改为:#define CONFIG_SYS_PROMPT "YYGY4412 # "

319:#define CONFIG_IDENT_STRING " for SMDK4412"

改为;#define CONFIG_IDENT_STRING " for YYGY4412"

Vi u-boot.lds

board/samsung/smdk4212/libsmdk4212.o (.text)

修改为:

board/samsung/yygy4412/libyygy4412.o (.text)

5.编译make yygy4412_config make

6.制作UBOOT

因CPU exynos_4412的启动过程是

BL0 //BL0固化在iram中的程序(关闭看门狗,关闭中断及MMU,时钟设置,检测om决定启动方式,拷贝bl1到iram中

BL1 <8k /*BL1 初始化化环境(中断初始化,设置堆栈等),搬移bl2代码到RAM中,并允许它,

BL1是三星提供的,无源码,见CodeSign4SecureBoot/E4412_N.bl1.SCP2G.bin

| 如果想看源码,可以反汇编分析,如arm-none-linux-gnueabi-objdump -D -b binary -m arm E4412_N.bl1.SCP2G.bin > b1.asm

BL2 <14k //bl2 完成基本硬件初始化(Low_init.s 时钟串口内存flash等)

u-boot.bin

所以我们单独运行u-boot是不行的,需使用三星提供的BL1 BL2进行打包加密校验cp -rf sdfuse_q ./ //sdfuse_q 三星提供的加密处理(checksum)

Cp mkuboot ./ //拷贝SD卡制作UBOOT脚本。

//cp -rf CodeSign4SecureBoot ../ // CodeSign4SecureBoot 三星提供的安全启动方式前面已拷贝

vim Makefile

修改,添加sdfuse_q的编译(sdfuse_q主要是进行checksum ,大小等检验,还有通过脚本可制作sd启动盘)

在354 ifeq ($(CONFIG_CPU_EXYNOS5250),y)

./mkbl2 u-boot.bin bl2.bin 14336

Endif后添加

@split -b 14336 u-boot.bin bl2

@+make -C sdfuse_q/

@./sdfuse_q/chksum

@./sdfuse_q/add_padding

@rm bl2a*

@echo

Cp build_uboot.sh ./ 拷贝编译脚本

Vi build_uboot.sh

修改路径:sec_path="../CodeSign4SecureBoot/"

if [ -z $1 ]

then

make tc4_android_config //改make yygy4412_config

elif [ $1 = $option1 ]

then

make tc4_plus_android_config //改make yygy4412_config

else

echo please input right parameter. //改make yygy4412_config

exit 0

Fi

cat E4412_N.bl1.SCP2G.bin bl2.bin all00_padding.bin u-boot.bin

tzsw_SMDK4412_SCP_2GB.bin > u-boot-iTOP-4412.bin改

为>u-boot-yygy-4412.bin

mv u-boot-iTOP-4412.bin $ROOT_DIR

改为mv u-boot-yygy-4412.bin $ROOT_DIR

chmod 777 ./build.sh

./build_uboot.sh 编译生成u-boot-yygy-4412.bin

7.加入点灯代码,确认uboot运行。

Vi board/samsung/yygy4412/lowlevel_init.S

96: /* PS-Hold high */ 电源管理

ldr r0, =0x1002330c

ldr r1, [r0]

orr r1, r1, #0x300

str r1, [r0] 后添加

ldr r0, =0x11000c08

ldr r1, =0x0

str r1, [r0]

/* Clear MASK_WDT_RESET_REQUEST */

ldr r0, =0x1002040c

ldr r1, =0x00

str r1, [r0]

//led test

ldr r0, =0x11000060 //GPK1[1]

ldr r1, [r0]

bic r1, r1, #0xf0

orr r1, r1, #0x10

str r1, [r0]

ldr r1, [r0, #4]

orr r1, r1, #2

str r1, [r0, #4]

保存重新编译,烧到开发板,运行,可以看灯一闪而过。但是串口无任何输出。

8.开启串口

开发板串口为UART2.

Vi include/configs/yygy4412.h

添加#define DEBUG 输出调试信息

161: #define CONFIG_SERIAL1 1

改为:#define CONFIG_SERIAL2 1

保存编译,烧到开发板,可以看到串口输出信息,进入UBOOT读秒,读取内核,但是EMMC读取速度超慢,无法忍受,但最终读取完成。

9.修改MMC驱动。加快内核的读取速度。

Vi drivers\mmc\mmc.c

1271; 在函数mmc_init中

mmc_set_clock(mmc, 1);

mmc_set_bus_width(mmc, MMC_BUS_WIDTH_1);

修改为:

mmc_set_clock(mmc, 40000000); //40M

mmc_set_bus_width(mmc, MMC_MODE_4BIT);

保存编译,烧到开发板,可以看到串口输出信息,进入UBOOT读秒,读取内核EMMC读取速度超快,读取完成。但是无法加载内核。打印信息如下:

### main_loop: bootcmd="movi read kernel 0 40008000;movi read rootfs 0 41000000 100000;bootm 40008000 41000000"

Hit any key to stop autoboot: 0

reading kernel..device 0 Start 1063, Count 8192

MMC read: dev # 0, block # 1063, count 8192 ... 8192 blocks read: OK

completed

reading RFS..device 0 Count 9255, Start 2048

MMC read: dev # 0, block # 9255, count 2048 ... 2048 blocks read: OK

completed

## Current stack ends at 0xc3cfbdc8 * kernel: cmdline image address = 0x40008000

Wrong Image Format for bootm command

ERROR: can't get kernel image!

10.修改EMMC分区信息。

Vi arch\arm\include\asm\arch-exynos\Movi_partition.h

修改21-57行为:

#define PART_SIZE_FWBL1 (8 * 1024)

#define PART_SIZE_BL1 (16 * 1024)

#define PART_SIZE_UBOOT (495 * 1024)

#define PART_SIZE_KERNEL (6 * 1024 * 1024)

#define PART_SIZE_ROOTFS (2 * 1024 * 1024)// 2M

////#define PART_SIZE_TZSW (156 * 1024)

#define PART_SIZE_TZSW (24 * 1024) //为了与迅为UBOOT中的

environment start 544一致。

#define MOVI_FWBL1_BLKCNT (PART_SIZE_FWBL1 / MOVI_BLKSIZE)

#define MOVI_BL1_BLKCNT (PART_SIZE_BL1 / MOVI_BLKSIZE)

#define MOVI_ENV_BLKCNT (CONFIG_ENV_SIZE / MOVI_BLKSIZE) /* 16KB */

#define MOVI_UBOOT_BLKCNT (PART_SIZE_UBOOT / MOVI_BLKSIZE) /* 328KB */

#define MOVI_ZIMAGE_BLKCNT (PART_SIZE_KERNEL / MOVI_BLKSIZE)

/* 4MB */

#define MOVI_ROOTFS_BLKCNT (PART_SIZE_ROOTFS / MOVI_BLKSIZE)

/* 26MB */

#define MOVI_TZSW_BLKCNT (PART_SIZE_TZSW / MOVI_BLKSIZE) /* 160KB */

#define MOVI_UBOOT_POS ((eFUSE_SIZE / MOVI_BLKSIZE) + MOVI_FWBL1_BLKCNT + MOVI_BL1_BLKCNT)

#define MOVI_TZSW_POS ((eFUSE_SIZE / MOVI_BLKSIZE) + MOVI_FWBL1_BLKCNT \

+ MOVI_BL1_BLKCNT + MOVI_UBOOT_BLKCNT)

#define ENV_START_BLOCK

MOVI_FWBL1_BLKCNT+MOVI_BL1_BLKCNT+MOVI_UBOOT_BLKCNT+MOV I_TZSW_BLKCNT+1

Vi arch\arm\cpu\armv7\exynos\Movi_partition.c

25: 修改函数init_raw_area_table

Image[2]部分修改为:

image[2].start_blk = location;

image[2].used_blk = MOVI_UBOOT_BLKCNT + MOVI_BL1_BLKCNT + MOVI_FWBL1_BLKCNT;

image[2].size = PART_SIZE_UBOOT + PART_SIZE_FWBL1 + PART_SIZE_BL1;

image[2].attribute = 0x2;

strcpy(image[2].description, "u-boot");

dbg("u-boot: %d\n", image[2].start_blk);

Image[3]部分:

image[3].start_blk = image[2].start_blk + MOVI_UBOOT_BLKCNT;

修改为:image[3].start_blk = image[2].start_blk + MOVI_UBOOT_BLKCNT + MOVI_BL1_BLKCNT + MOVI_FWBL1_BLKCNT;

Image[4]部分

image[4].attribute = 0x10;

strcpy(image[4].description, "environment");

后改为:

if (location == 0)

image[4].start_blk = image[4].start_blk + 2;

else

image[4].start_blk = image[4].start_blk + 1;

为了与迅为UBOOT中的environment start 544一致。

保存编译,烧到开发板,可以看到串口输出信息,进入UBOOT读秒,读取内核EMMC读取速度超快,读取完成。加载内核成功,文件系统也成功加载。但是UBOOT 下,fastboot失败!Starting download of 527104 bytes

---------ERROR: DMA Address is not aligned by 8---------

11.使用fastboot功能

Vi include\configs\yygy4412.h

167: #undef CONFIG_USB_CPUMODE

修改为#define CONFIG_USB_CPUMODE

保存编译,烧到开发板.fastboot命令成功

12.环境变量的保存。

到目前为止,环境变量是默认的。迅为开发板环境变量保存在错误的分区了,只要使用saveenv命令,就会破坏EMMC中的文件系统。导致加载文件系统不断重启而失败。最后连fastboot命令都失效。EMMC分区被破坏。重新分区,烧UBOOT,文件系统。

Vi drivers\mmc\mmc.c

在函数mmc_read_ext_csd中。

959: if (ext_csd_struct > 6) {

printf("unrecognised EXT_CSD structure "

"version %d\n", ext_csd_struct);

err = -1;

goto out;

}

改为

if ((ext_csd_struct > 5) && (7 != ext_csd_struct)) {

printf("unrecognised EXT_CSD structure "

"version %d\n", ext_csd_struct);

err = -1;

goto out;

}

因刚好version =7;

保存编译,烧到开发板.saveenv命令成功,现在读取的是EMMC中的环境变量。

13. 疑问:迅为提供的UBOOT E4412_N.bl1.SCP2G.bin 已经将整个UBOOT拷贝到内存中。测试是否如此?

修改lowlevel_init.S

load_uboot函数修改为:

/*****************************************************************************/ .globl load_uboot

load_uboot:

push {lr}

ldr r0, =INF_REG_BASE

ldr r1, [r0, #INF_REG3_OFFSET]

cmp r1, #BOOT_MMCSD

beq m mcsd_boot

cmp r1, #BOOT_EMMC

beq emmc_boot

cmp r1, #BOOT_EMMC_4_4

beq emmc_boot_4_4

cmp r1, #BOOT_SEC_DEV

beq mmcsd_boot

second_mmcsd_boot:

ldr r3, =BOOT_MMCSD

ldr r0, =INF_REG_BASE

str r3, [r0, #INF_REG3_OFFSET]

mmcsd_boot:

#ifdef CONFIG_CLK_1000_400_200

ldr r0, =ELFIN_CLOCK_BASE

ldr r2, =CLK_DIV_FSYS2_OFFSET

ldr r1, [r0, r2]

orr r1, r1, #0xf

str r1, [r0, r2]

#endif

mov r0, #SDMMC_CH2

str r0, _boot_device

bl load_uboot_image

b load_uboot_exit

emmc_boot:

#if defined(CONFIG_CLK_1000_400_200) || defined(CONFIG_CLK_1000_200_200) || defined(CONFIG_CLK_800_400_200) ldr r0, =ELFIN_CLOCK_BASE

ldr r2, =CLK_DIV_FSYS1_OFFSET

ldr r1, [r0, r2]

orr r1, r1, #0x3

str r1, [r0, r2]

#endif

mov r0, #EMMC

str r0, _boot_device

bl load_uboot_image

b load_uboot_exit

emmc_boot_4_4:

#if defined(CONFIG_CLK_1000_400_200) || defined(CONFIG_CLK_1000_200_200) || defined(CONFIG_CLK_800_400_200) ldr r0, =ELFIN_CLOCK_BASE

ldr r2, =CLK_DIV_FSYS3_OFFSET

ldr r1, [r0, r2]

orr r1, r1, #0x3

str r1, [r0, r2]

#endif

/* mmc ch4 devider value change */

// bl mmc_ch4_devider_change

mov r0, #EMMC_4_4

str r0, _boot_device

bl load_uboot_image

/* store second boot information in DRAM */

ldr r0, =CONFIG_PHY_UBOOT_BASE

ldr r1, [r0]

ldr r2, =0x2000

cmp r1, r2

bne second_mmcsd_boot

b load_uboot_exit

load_uboot_exit:

pop {pc}

/********************************************************************/

149行附近时钟,内存初始化部分。

ldr r0, =0xff000fff

bic r1, pc, r0 /* r0 <- current base addr of code */

ldr r2, _TEXT_BASE /* r1 <- original base addr in ram */

bic r2, r2, r0 /* r0 <- current base addr of code */

cmp r1, r2 /* compare r0, r1 */

beq after_copy /* r0 == r1 then skip sdram init and u-boot.bin loading */

ldr r0, =CHIP_ID_BASE

ldr r1, [r0]

lsr r1, r1, #8

and r1, r1, #3

cmp r1, #2

bne v310_1

bl mem_ctrl_asm_init

bl system_clock_init

b 1f

v310_1:

bl system_clock_init

bl mem_ctrl_asm_init_ddr3

1:

b load_uboot

cold_boot:

bl relocate_code

ldr r0, _boot_device

b coldboot

修改为:

ldr r0, =0xff000fff

bic r1, pc, r0 /* r0 <- current base addr of code */

ldr r2, _TEXT_BASE /* r1 <- original base addr in ram */

bic r2, r2, r0 /* r0 <- current base addr of code */

cmp r1, r2 /* compare r0, r1 */

beq after_copy /* r0 == r1 then skip sdram init and u-boot.bin loading */

ldr r0, =CHIP_ID_BASE

ldr r1, [r0]

lsr r1, r1, #8

and r1, r1, #3

cmp r1, #2

bne v310_1

/* Memory initialize */

bl mem_ctrl_asm_init

/* init system clock */

bl system_clock_init

b 1f

v310_1:

/* init system clock */

bl system_clock_init

/* Memory initialize */

bl mem_ctrl_asm_init_ddr3

1:

bl load_uboot

/******* 若拷贝了则点亮此LED灯*************************/

ldr r0, =0x11000100 // GPL2CON的地址是0x11000100

ldr r1, [r0] // 先读出原值

bic r1, r1, #0xf // 清除bit[3:0]

orr r1, r1, #1 // 设置bit[3:0]为0b0001

str r1, [r0] // 写入GPL2CON

ldr r0, =0x11000104 // GPL0DAT的地址是0x11000104

ldr r1, [r0] // 读出原值

orr r1, r1, #1 // bit[0]为1

str r1, [r0] // 写入GPL0_0

mov r1, #0x1000000

3: subs r1, r1, #1

bne 3b

_boot_device:

.word 0x0

after_copy:

保存编译,烧到开发板.发现另一个LED灯根本没亮过,说明BL1已经把完整的UBOOT拷贝到内存。

14 网卡移植,迅为网卡芯片为DM9621, USB接口的网络芯片。驱动与DM9000完全

不同,如果哪位移植成功,请告诉我一声,谢谢!

以太网及TCPIP通俗理解

1 以太网------EtherNet: ---------------------------参考图解 以太网最早由Xerox(施乐)公司创建,于1980年DEC、lntel和Xerox三家公司联合开发成为一个标准。以太网是应用最为广泛的局域网,包括标准的以太网(10Mbit/s)、快速以太网(100Mbit/s)和10G(10Gbit/s)以太网,采用的是CSMA/CD访问控制法,它们都符合IEEE802.3。 IEEE 802.3标准 IEEE802.3规定了包括物理层的连线、电信号和介质访问层协议的内容。以太网是当前应用最普遍的局域网技术,它很大程度上取代了其他局域网标准。如令牌环、FDDI和ARCNET。历经100M以太网在上世纪末的飞速发展后,目前千兆以太网甚至10G以太网正在国际组织和领导企业的推动下不断拓展应用范围。 常见的802.3应用为: 10M: 10base-T (铜线UTP模式) 100M: 100base-TX (铜线UTP模式) 100base-FX(光纤线) 1000M: 1000base-T(铜线UTP模式) 2 UIP协议: uIP由瑞典计算机科学学院(网络嵌入式系统小组)的Adam Dunkels 开发。其源代码由C 语言编写,并完全公开,uIP 的最新版本是1.0 版本,本指南移植和使用的版本正是此版本。uIP协议栈去掉了完整的TCP/IP中不常用的功能,简化了通讯流程,但保留了网络通信 必须使用的协议,设计重点放在了IP/TCP/ICMP/UDP/ARP这些网络层和传输层协议上,保证了其代码的通用性和结构的稳定性。 由于uIP协议栈专门为嵌入式系统而设计,因此还具有如下优越功能: 1)代码非常少,其协议栈代码不到6K,很方便阅读和移植。 2)占用的内存数非常少,RAM 占用仅几百字节。 3)其硬件处理层、协议栈层和应用层共用一个全局缓存区,不存在数据的拷贝,且发送和接收都是依靠这个缓存区,极大的节省空间和时间。 4)支持多个主动连接和被动连接并发。 5)其源代码中提供一套实例程序:web 服务器,web 客户端,电子邮件发送程序(SMTP 客户端),Telnet服务器,DNS主机名解析程序等。通用性强,移植起来基本不用修改就可以通过。 6)对数据的处理采用轮循机制,不需要操作系统的支持。 由于uIP对资源的需求少和移植容易,大部分的8位微控制器都使用过uIP 协议栈,而且很多的著名的嵌入式产品和项目(如卫星,Cisco 路由器,无线传感器网络)中都在使用uIP 协议栈。 3 TCP/IP协议: TCP/IP是(Transmission Control Protocol/Internet Protocol)的简写,中译名为传输控制协

uip移植笔记

本笔记适用于uIP1.0。 移植平台介绍:MSP430F149+cs8900a+IAR 1、阅读The uIP Embedded TCP/IP Stack The uIP 1.0 Reference Manual. 2、建立一个文件夹,起名myport,将uip-1.0下的uIP和lib两个文件夹拷贝过去,然后再在myport下建立app文件夹。 3、将unix子文件夹下的clock-arch.c、clock-arch.h拷贝到myport下,这个文件实现协议栈所用的时钟,由430的定时器完成,有三个函数: clock_time_t clock_time(void) { return ticks; } void clock_init(void) { 定时器的初始化工作 } __interrupt void timer_interrupt(void)/*定时器中断函数*/ { ++ticks; }。 4、将unix子文件夹下的uip-conf.h拷贝到myport下,这个文件实现协议栈所用的配置,按照需要修改之。 5、写cs8900a的驱动函数,这里采用8位、查询模式,替换tapdev.c 或slipdev.c。 6、将unix子文件夹下的main.c函数拷贝到myport下,这个是主调度流程,按照需要修改。 7、建立自己的工程,将以上文件包含。 8、调试,改错。 其中,uip的缓冲区是以字节数组的形式产生,为了保证它的起始地址是偶数,必须指定地址。 UDP的初始化如下 void myudp_init(void) { uip_ipaddr_t ipaddr;//定义IP类型变量 uip_ipaddr(ipaddr, 210,29,104,88); //远程IP为210.29.104.88 if(myudp_conn != NULL) { uip_udp_remove(myudp_conn);//如果连接已经建立,则删除之 } myudp_conn = uip_udp_new(&ipaddr, HTONS(1000));//建立到远程ipaddr,端口为1000的连接 if(myudp_conn != NULL) {

2012.11.6战略智慧笔记 陈果

N 《战略智慧》 --陈果 如何建立战略思维? 你现在最需要解决的是什么问题? 1、未来老百姓的健康生活方式? 2、房产中介的人力资源 3、企业做到一定程度,如何把规模缩小? 4、如何使用90后? 5、外贸出口利润越来越低,公司成本越来越大,如何突破?需要经营的: 1、原始积累(财富) 2、内部团队(精神共同体) 团队是利润,是巨大财富 3、忠实客户(了解客户需求) 企业一定要战略升级,为谁请命? 老板需要经营“空手套白狼”的本领。 企业做大的因素: 1、政府的力量 2、资金对你的加持 3、消费者对你的关注 4、优秀的人才向你靠齐

利润 (如:外婆家) 如:宋城集团,通过做“宋城千古情”项目,获得政府的支持 大老板:看似很傻,实际很厉害,用一年的时间赚10年的钱 如:王志纲老师用三十年的时间做中国最好的“战略思想智库”,一转身获得无数的财富 经营企业就是经营人,经营企业就是经营价值。 企业、产品都是媒介,关键是你想到哪里去。 战略思维思考的问题是:我要到哪里去? 老板必须为战略负责! 战略是唯一不能让职业经理人去做的事情。 没有战略就没有人追随,如果成功也是偶然的。 如:王建林(万达集团),当初做商业地产,所有人都反对如:吴亚军,(南湖地产,温州人)当初做战略十几人的核心团队全部走掉,但今天成为中国女首富。 老板不是所有事情都需要你来做,而是那些事情是你必须要做的。

如:华为,力排众议做最适合当下的战略 这是一场越来越激烈的商战,不要妄想今天的困难明天就过去了,要有打战的思维 如:微软 在战争当中总结经验,这是老板需要修炼的 战略智慧金三角: 找定位 定打法 开模具 战略之道的根本是定位。 打法和模具的关系: 模具是企业超级杀伤力的武器 如:工作室:帮企业找魂,帮企业开模具书院班:帮企业开模具,寻找战略突破打法:合适的发射装置 打法与模具的关系是炮弹和炮筒的关系 孵化人的板块: 从老板到老师的智慧

关于uCGUI移植详解

关于uCGUI在STM32上的移植移详解 首先我们得知道啥是μC/GUI: 它是一种用于嵌入式应用的图形支持软件。它被设计用于为任何使用一个图形LCD的应用提供一个有效的不依赖于处理器和LCD 控制器的图形用户接口。它能工作于单任务或多任务的系统环境下。 μC/GUI 适用于使用任何LCD 控制和CPU 的任何尺寸的物理和虚拟显示。 它的设计是模块化的,由在不同的模块中的不同的层组成。一个层,称作LCD 驱动程序,包含了对LCD 的全部访问。因为它100%由ANSI 的C 语言编写的,μ所以C/GUI 适用于所有的CPU。 我们知道windowsXP的操作界面,是通过窗口、按钮、等来对计算机进行操作,同样,我们所讲的uC/GUI也能实现类似效果。 在网上找了些教程,但是讲述的不够详细,导致我在移植过程中遇到了很多问题,自己重头开始自己一点点移植,遇到的问题也只能靠自己解决,终于在忙活了一天后把它搞定了。希望对初次进行移植的同学能有所帮助。下面是我的吐血总结: 所需工具:1、uC/GUI v3.90 尽量找到没有修改的源码 2、一个硬件开发平台、LCD底层驱动程序,我使用的是STM32F103ZE+TFT3.2寸LCD 3、MDK开发软件(就是Keil) 4、一个编译无误的工程模板 4、uC/GUI相关的中文手册 移植步骤:

第一步:首先,得把你的LCD底层驱动写好,既在裸机下,可以正常显示。 通常只需3个底层驱动函数: LCD_SetPoint(u16 x,u16,y,int color);//设置某点,及颜色 LCD_GetPoint(u16 x,u16 y); //读取某点及颜色返回 LCD_Init(); //LCD初始化硬件函数,这里改成其他名字如LCD2_Init();防止和 uC/GUI冲突 第二步:向事先准备好的工程中加入uC/GUI文件夹,在工程设置中包含相应头文件 工程目录如下: 第三步:配置LCDConf.h、GUIConf.h、GUITouchConf.h(由于我没使用触摸功能,此配置在此不讲。) 配置LCDConf.h文件如下:LCD的设置 #ifndef LCDCONF_H #define LCDCONF_H #define LCD_XSIZE (320) //配置TFTLCD的水平分辨率 #define LCD_YSIZE (240) //配置TFTLCD的垂直分辨率 #define LCD_CONTROLLER (-1) //为什么是-1?接下来讲 #define LCD_BITSPERPIXEL (16) //每个像素的位数

ucos操作系统在ARM上的移植

UC/OS-II 嵌入式系统在ARM 上的移植 UC/OS-II 操作系统是一款完全公开的源代码,它非常精简,整个操作系统的代码只有几千行,是专门针对于嵌入式开发而产生的一款代码。它有几个特点,分别是可移植性(Portable )、可固化(ROMable )、可裁剪(Scalable )、多任务、可确定性、任务栈、系统服务、中断管理、稳定性可靠性。 UC/OS-II 主要就是一个内核,由ANSIC 语言编写而成。负责任务管理和任务调度,没有文件系统和界面系统。它的代码是公开的,系统的实时性强、移植性好、可多任务。 UC/OS-II 作为基于优先级的抢占式多任务的实时操作系统,包含了实时内核、任务管理、时间管理、任务间通信同步和内存管理的功能。它使得任务的独立性,不相互干涉,非常的准时和高效,且易于设计和扩展。 UO/OS-II 共有16个内核文件,11个与CPU 类型无关,就是说可以直接使用不需要修改。还有3个内核文件与CPU 有关系,要根据需要作出相应的改动。剩下的两个内核文件和具体的应用有关。如图所示UC/OS-II 的16个内核文件的层次。 μC/OS -II 内核文件 软件 硬件

多任务操作的核心是系统调度器,利用TCB来管理任务调度功能。它的主要功能是保存任务的当前态、优先级、等待事件、代码起始地址、初始堆栈指针等。程序的设计关键就是确定划分多任务的问题,以及任务优先级和任务通信。 优先级的意思是每个任务都是无限循环的,有运行态度、就绪态、休眠态、挂起态和中断五种状态。当有高一级优先级的任务就绪后,低优先级立即停止运行,转为挂起态或就绪态。这就是可剥夺型的内核。当中断一个高优先级任务,中断时 挂起,中断结束后任务继续运行,并立即剥夺低优先级的任务。 对于这种可剥夺型内核,CPU的使用时可以确定的,可优化任务级响应。在很多单片机或ARM板上很容易就可以移植UC/OS-II。当然本次设计使用的TQ2440,也可以完美的移植它。移植程序在网上都可以找得到,所以设计中就不做解释了。 本次设计实现的是串口协议和网口协议组合成的一个数据网关。其主要的流程图如下所示:

Tiny6410_Uboot移植步骤详解

Uboot_for_Tiny6410_移植步骤详解 一、设计要求 1.目的 1)掌握U-boot剪裁编写 2)掌握交叉编译环境的配置 3)掌握U-boot的移植 2.实现的功能 1)U-boot编译成功 2)移植U-boot,使系统支持从NAND FLASH启动 二、设计方案 1.硬件资源 1)ARM处理器:ARM11芯片(Samsung S3C6410A),基于ARM1176JZF-S核设 计,运行频率533Mhz,最高可达 667Mhz 2)存储器:128M DDR RAM,可升级至 256M;MLC NAND Flash(2GB) 3)其他资源:具有三LCD接口、4线电阻 触摸屏接口、100M标准网络接口、标准DB9 五线串口、Mini USB2.0接口、USB Host 1.1、3.5mm音频输入输出口、标准TV-OUT

接口、SD卡座、红外接收等常用接口;另外 还引出4路TTL串口,另1路TV-OUT、 SDIO2接口(可接SD WiFi)接口等;在板的 还有蜂鸣器、I2C-EEPROM、备份电池、A D 可调电阻、8个中断式按键等。 2.软件资源 1)arm-linux-gcc-4.5.1(交叉编译) 2)u-boot-2010.09.tar.gz arm-linux-gcc-4.5.1-v6-vfp-20101103.t gz 三、移植过程 1.环境搭建 1)建立交叉编译环境 2)去这2个网站随便下载都可以下载得到最 新或者你想要的u-boot。( https://www.wendangku.net/doc/a217328472.html,/batch.viewl ink.php?itemid=1694 ftp://ftp.denx.de/pub/u-boot/ )

UCGUI移植教程

UCGUI在STM32上移植教程 1说明 ●开发板芯片型号STM32F103VET6 ●板载液晶型号ILI9341 ●所需准备资料UCGUI3.90源码 ●一个工程模板 为了节约时间,此处所用模板为野火M3工程模板(3.5.0) 制作时间---2013-08-07 By NUAA---Kylin 2移植过程讲解 2.1首先打开工工程模板,页面如下,这个模板工程很简单

2.2在工程模板中新建两个文件夹 2.2.1命名为GUI与Mylib 2.2.2在GUI文件夹下添加以下内容 ●上述图片为UCGUI3.90源码中的一些文件夹 ●进入UCGUI3.90源码文件夹/Start,将Config文件夹原封不动的拷过来 ●进入UCGUI3.90源码文件夹/Start/GUI文件夹,将其中所有文件夹拷过来 ●在GUI文件夹下新建GUI_X文件夹,进入UCGUI3.90源码文件夹/ Sample/ GUI_X文件夹 中,如果带操作系统应该拷贝GUI_X_uCOS.c,如果不带操作系统拷贝GUI_X.c,在这里我们将将GUI_X.c拷贝到新建GUI_X文件夹。

2.2.3各文件夹说明 1)AntiAlias:9个C文件,主要用于抗锯齿的显示效果。 2)ConvertColor:彩色显示的色彩转换支持。 3)ConvertMono:(b/w)和灰度显示的色彩转换支持。 4)Core:核心文件,提供了GUI基本的功能。 5)Font:字库。 6)JPEG:图片操作函数。 7)LCDDriver:LCD驱动程序 8)MenDev:Memorydevice 支持。这个东西可用在很多情况下,但最主要的功能是防止在 项目重叠时,防止屏幕的闪烁。 9)Widget:窗体控件库。 10)WM:窗口管理库。 11)Config:配置文件。 12)GUI:源代码。 13)GUI_X:操作系统接口函数。 2.3添加组及源文件 2.3.1将GUI文件夹下的所有文件夹添加到GROUP 右键工程工程项目名选择manage components将这些组全部添加上如图

UBoot移植详解

u-boot 移植步骤详解 1 U-Boot简介 U-Boot,全称Universal Boot Loader,是遵循GPL条款的开放源码项目。从FADSROM、8xxROM、PPCBOOT逐步发展演化而来。其源码目录、编译形式与Linux内核很相似,事实上,不少U-Boot源码就是相应的Linux内核源程序的简化,尤其是一些设备的驱动程序,这从U-Boot源码的注释中能体现这一点。但是U-Boot不仅仅支持嵌入式Linux 系统的引导,当前,它还支持NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS嵌入式操作系统。其目前要支持的目标操作系统是OpenBSD, NetBSD, FreeBSD,4.4BSD, Linux, SVR4, Esix, Solaris, Irix, SCO, Dell, NCR, VxWorks, LynxOS, pSOS, QNX, RTEMS, ARTOS。这是U-Boot中Universal的一层含义,另外一层含义则是U-Boot除了支持PowerPC系列的处理器外,还能支持MIPS、x86、ARM、NIOS、XScale等诸多常用系列的处理器。这两个特点正是U-Boot项目的开发目标,即支持尽可能多的嵌入式处理器和嵌入式操作系统。就目前来看,U-Boot对PowerPC系列处理器支持最为丰富,对Linux的支持最完善。其它系列的处理器和操作系统基本是在2002年11 月PPCBOOT 改名为U-Boot后逐步扩充的。从PPCBOOT向U-Boot的顺利过渡,很大程度上归功于U-Boot的维护人德国DENX软件工程中心Wolfgang Denk[以下简称W.D]本人精湛专业水平和持着不懈的努力。当前,U-Boot项目正在他的领军之下,众多有志于开放源码BOOT LOADER移植工作的嵌入式开发人员正如火如荼地将各个不同系列嵌入式处理器的移植工作不断展开和深入,以支持更多的嵌入式操作系统的装载与引导。 选择U-Boot的理由: ①开放源码; ②支持多种嵌入式操作系统内核,如Linux、NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS; ③支持多个处理器系列,如PowerPC、ARM、x86、MIPS、XScale; ④较高的可靠性和稳定性; ④较高的可靠性和稳定性; ⑤高度灵活的功能设置,适合U-Boot调试、操作系统不同引导要求、产品发布等; ⑥丰富的设备驱动源码,如串口、以太网、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、键盘等; ⑦较为丰富的开发调试文档与强大的网络技术支持; 2 U-Boot主要目录结构 - board 目标板相关文件,主要包含SDRAM、FLASH驱动; - common 独立于处理器体系结构的通用代码,如内存大小探测与故障检测;

uCGUI 汉字显示技巧及总结

UCGUI的基础应用 汉字显示 在uC/GUI中显示汉字,必要的一个步骤就是汉字取模。通常有两种方法: 一、单个字模法:使用字模取模软件,进行单个字的取模。此方法可应用于显示汉字字 数较少的情况下。其优点是:占用存储空间小,无冗余。但当显示汉字字数较多时,该方法则非常繁琐。 二、字模库法:该方式需要移植整个汉字字库,若项目要求需显示多种汉字字体,则需 移植多种字体的字库。其优点是:操作方便。若嵌入式系统的FLASH存储容量够大时,该方式可行。 根据作者多年的项目实践,找到一个兼具上述两种方式优点的显示方案:利用UCGUIFontTool软件,提取windows自带的字模库。该方法的使用步骤: 1、将项目中所要显示的汉字根据字体进行分类并汇总。 2、使用UCGUIFontTool软件分别提取上述字模。 3、将所产生的.C文件添加到工程中。 4、更改gui.h中的配置,添加该汉字的宏定义,如图 5、显示汉字前更改需显示的字体,如图 6、利用函数进行显示。 该方法移植方便,易实现同时显示多种字体,无字模冗余,占用存储空间最小。图片显示 uC/GUI提供了位图的解决方案,在GUI显示图片时,需先将其他格式的图片转换为bmp格式。可利用windows系统自带的画图软件打开一个图片,再另存为bmp格式,继而转换为.c 格式文件加入到工程中。其操作步骤如下: 1、将其他格式的图片另存为bmp格式。 2、打开UCGUI源码自带的工具uC-GUI-BitmapConvert,选择相应参数,并转换为.c文件。 3、将该.c文件加入到工程中。 4、添加外部变量,并调用相应函数进行显示。如图 5、也可UCGUI提供的缩放函数可对图片进行缩放显示。如图

基于STM32的uCGUI移植和优化

基于STM32的uCGUI移植和优化 移植篇 首先,我们需要准备的东西有uCGUI3.90,这个版本是大家现在用的比较多的,效率也比较高,别人都是这么评论的,至于其他版本的,我没有接触很多,所以 不能过多评论. uCGUI有三个文件夹,一个是tool,这个文件夹是用来使用一些uCgui的上位机程序,基本都是字体和模板查看之类的.在sample文件夹下面是已经别人帮你写好了很多有用的东西,像跟操作系统有关的GUI_X或者一些模板(后面我们会用到的自己定义的Demo),或者是gui配置.后面再一一详细叙说这个文件夹的功能.在Start文件夹里面,这是我们最主要的文件夹.里面就包含了uCGUI的源代码,uCGUI的作者把源代码放进vc里面进行编译了(当然,这是用标准C语言写的程序,所以我们可以放在任何C语言平台下编译而不会担心兼容性问题,这个uCGUI在这方面做的算是完美了),所以,我们可以在vc平台下写界面,然后再把代码拷进我们的下位机编译器进行编译,这样子效率就会非常高了.(像51 那时候写界面就是疯狂的一次一次的烧,真是纠结..). 然后这里放的就是uCGUI的源代码了,在GUI文件夹下面. 这则是每个文件夹的功能(参考uCGUI中文手册,https://www.wendangku.net/doc/a217328472.html,翻译). 大概看一下就可以了,这个跟我们移植的关系不大,关键点是带*的可以不包含进去(待会配置会讲到.).然后其他的都要包含进去. 接着我们要把我们的文件包含进我们已经搭建好的工程,这里说明下我们的工程要求. 一般来说,我们要画一个图形,最基本的就是从点开始,从点到线,从点到面...,所以在已经建好的工程里面你要能点亮你的屏幕,能点出最基本的点,能填充出 最基本矩阵(这是uCGUI最包含的函数),反正我移植的时候涉及到的包括三个函 数,LCD_Init();LCD_Draw_Point(x,y,color),LCD_Fillcircuit(x1,x2,y1,y 2).这三个函数是必须的,后面也会说明如何把这三个函数进行填充. 当我们把文件复制进去的时候,再加上我们一开始已经创建好的工程的时候,文件结构差不多就是这个样子了,截图如下 user包括,main函数就是我们初始化和函数调用,绘图用的文件,另外那几个文件相信大家都明白了把,tft_lcd.c就是你在,没有移植uCGUI的情况下,纯液晶屏驱动,这里建议把液晶屏的API和最底层驱动(API就是画圆啊,画椭圆啊,清除屏幕之类的,底层驱动就是驱动液晶屏的管脚运作,fsmc初始化,时钟配置之类的),不过我这里也是集成在一起了,比较懒,大家别学.

uip协议栈

uIP协议栈分析 uIP特性 uIP协议栈往掉了完整的TCP/IP中不常用的功能,简化了通讯流程,但保存了网络通讯必须使用的协议,设计重点放在了IP/TCP/ICMP/UDP/ARP这些网络层和传输层协议上,保证了其代码的通用性和结构的稳定性。 由于uIP协议栈专门为嵌进式系统而设计,因此还具有如下优越功能: (1)代码非常少,其协议栈代码不到6K,很方便阅读和移植。 (2)占用的内存数非常少,RAM占用仅几百字节。 (3)其硬件处理层、协议栈层和应用层共用一个全局缓存区,不存在数据的拷贝,且发送和接收都是依靠这个缓存区,极大的节省空间和时间。 (4)支持多个主动连接和被动连接并发。 (5)其源代码中提供一套实例程序:web服务器,web客户端,电子邮件发送程序(SMTP 客户端),Telnet服务器,DNS主机名解析程序等。通用性强,移植起来基本不用修改就可以通过。 (6)对数据的处理采用轮循机制,不需要操纵系统的支持。 由于uIP对资源的需求少和移植轻易,大部分的8位微控制器都使用过uIP协议栈, 而且很多的著名的嵌进式产品和项目(如卫星,Cisco路由器,无线传感器网络)中都在使用uIP协议栈。 uIP架构 uIP相当于一个代码库,通过一系列的函数实现与底层硬件和高层应用程序的通讯,对于整个系统来说它内部的协议组是透明的,从而增加了协议的通用性。uIP协议栈与系统底层和高层应用之间的关系如图2-1所示。 从上图可以看出,uIP协议栈主要提供了三个函数供系统底层调用。即uip_init(), uip_input() 和uip_periodic()。其与应用程序的主要接口是UIP_APPCALL( )。 uip_init()是系统初始化时调用的,主要初始化协议栈的侦听端口和默认所有连接是封闭的。当网卡驱动收到一个输进包时,将放进全局缓冲区uip_buf中,包的大小由全局变量uip_len

uboot移植实验

一、移植环境 ?主机:UBUNTU ?开发板:飞凌2440 ?编译器:arm-linux-gcc-4.3.2.tgz ?u-boot:u-boot-2009.03.tar.bz2

3)修改u-boot根目录下的Makefile文件。查找到smdk2410_config的地方,在他下面按照smdk2410_config的格式建立mini2440_config的编译选项,另外还要指定交叉编译器 4)测试编译新建的mini2440开发板项目

到此为止,u-boot对自己的mini2440开发板还没有任何用处,以上的移植只是搭建了一个mini2440开发板u-boot的框架,要使其功能实现,还要根据mini2440开发板的具体资源情况来对u-boot源码进行修改。 3. 根据u-boot启动流程图的步骤来分析或者修改添加u-boot源码,使之适合mini2440开发板(注:修改或添加的地方都用红色表示)。 1)mini2440开发板u-boot的stage1入口点分析。 一般在嵌入式系统软件开发中,在所有源码文件编译完成之后,链接器要读取一个链接分配文件,在该文件中定义了程序的入口点,代码段、数据段等分配情况等。那么我们的my2440开发板u-boot的这个链接文件就是cpu/arm920t/u-boot.lds,打开该文件部分代码如下:

知道了程序的入口点是_start,那么我们就打开mini2440开发板u-boot第一个要运行的程序cpu/arm920t/start.S(即u-boot的stage1部分),查找到_start的位置如下: 从这个汇编代码可以看到程序又跳转到start_code处开始执行,那么再查找到start_code 处的代码如下:

基于uCOSⅡ的LCD驱动编写

天津电子信息职业技术学院 课程设计 课题名称基于uCOSⅡ的LCD驱动编写姓名王浩 学号35 班级电信S10-1 专业电子信息工程 成绩 完成日期2012-06-01

基于uCOSII的LCD驱动编写 摘要 LCD是嵌入式操作系统的重要组成部分,是系统和用户之间进行交互和信息交换的媒介,它实现信息的内部形式与人类可以接受形式之间的转换。用户可以只通过LCD监测系统内部运行状态,然后作出相应的处理。因而具有良好的人机界面的嵌入式操作系统能过很好的完成系统开发、生产生活的需要。 S3C44B0X 中具有内置的LCD 控制器,它能将显示缓存(在SDRAM存储器中)中的LCD 图像数据传输到外部的LCD驱动电路上的逻辑功能。它支持单色、4级、16级灰度LCD显示,以及256彩色LCD显示。在显示灰度时,它采用时间抖动算法(time-based dithering algorithm)和帧率控制 (Frame Rate Control)方法,在显示彩色时,它采用RGB的格式,即RED、GREEN、BLUE,三色混合调色。通过软件编程,可以实现233或332的RGB调色的格式。对于不同尺寸的LCD显示器,它们会有不同的垂直和水平象素点、不同的数据宽度、不同的接口时间及刷新率,通过对LCD 控制器中的相应寄存器写入不同的值,来配置不同的LCD 显示板。 LCD能够正常工作得益于软硬件的协同工作,S3C44B0X集成了LCD的控制器,即不带驱动电路的LCD显示模块,驱动程序需要根据用户需要来自行添加。 u C / O S 是一种免费公开源代码、结构小巧、具有可剥夺实时内核的实时操作系统,在具体应用中稳定可靠,并且支持uIP TCP/IP协议栈、ucGUI等,可扩展性强,功能强大。因此,在uC/OS II下写的LCD驱动具有较好的实时性和稳定性,功能强大。 关键词:嵌入式系统;LCD显示;驱动电路;

uip学习笔记

uip_buf:定义如下u8_t uip_buf[UIP_BUFSIZE + 2];所有的数据处理都是通过处理它来完成的。比如接受的数据存储在这里,要发送的数据有会放在这里。 uip_len:uip_buf有用数据的字节 uip_appdata:uip_buf第一个可用字节的指针 uip_conn:总是指向当前连接的指针,定义:struct uip_conn *uip_conn; 下面是TCP连接的结构,用来区别不同的TCP连接,uip_tcp_appstate_t appstate是可以读写的且在实践应用中需要重定义,其他项read-only。 struct uip_conn { uip_ipaddr_t ripaddr; /**< The IP address of the remote host. 远程主机IP地址*/ u16_t lport; /**< The local TCP port, in network byte order. 本地TCP端口号,网络字节顺序*/ u16_t rport; /**< The local remote TCP port, in network byte order.本地远程连接主机TCP端口号*/ u8_t rcv_nxt[4]; /**< The sequence number that we expect to receive next. */ u8_t snd_nxt[4]; /**< The sequence number that was last sent by us. */ u16_t len; /**< Length of the data that was previously sent. */ u16_t mss; /**< Current maximum segment size for the connection. */ u16_t initialmss; /**< Initial maximum segment size for the connection. */ u8_t sa; /**< Retransmission time-out calculation state variable. */ u8_t sv; /**< Retransmission time-out calculation state variable. */ u8_t rto; /**< Retransmission time-out. */ u8_t tcpstateflags; /**< TCP state and flags. */ u8_t timer; /**< The retransmission timer. */ u8_t nrtx; /**< The number of retransmissions for the last segment sent. */ /** The application state. */ uip_tcp_appstate_t appstate; }; uip的应用事件: 1.接收数据:uip_newdata()为真,即远程连接的主机有发送新数据。uip_appdata指针指向实际数据。数据的大小通过uIP函数uip_datalen()获得。在数据不是被缓冲后,应用程序必须立刻启动。 2.发送数据:应用程序通过使用uIP函数uip_send()发送数据。uip_send()函数采用两个参数;一个指针指向发送数据和数据的长度。如果应用程序为了产生要发送的实际数据需要RAM 空间,包缓存(通过uip_appdata指针指向)可以用于这方面。在一个时间里应用程序只能在连接中发送一块数据。因此不可以在每个应用程序启用中调用uip_send()超过一次;只有上

嵌入式Linux之我行 史上最牛最详细的uboot移植,不看别后悔

嵌入式Linux之我行——u-boot-2009.08在2440上的移植详解(一) 嵌入式Linux之我行,主要讲述和总结了本人在学习嵌入式linux中的每个步骤。一为总结经验,二希望能给想入门嵌入式Linux 的朋友提供方便。如有错误之处,谢请指正。 ?共享资源,欢迎转载:https://www.wendangku.net/doc/a217328472.html, 一、移植环境 ?主机:VMWare--Fedora 9 ?开发板:Mini2440--64MB Nand,Kernel:2.6.30.4 ?编译器:arm-linux-gcc-4.3.2.tgz ?u-boot:u-boot-2009.08.tar.bz2 二、移植步骤 本次移植的功能特点包括: ?支持Nand Flash读写 ?支持从Nor/Nand Flash启动 ?支持CS8900或者DM9000网卡 ?支持Yaffs文件系统 ?支持USB下载(还未实现) 1.了解u-boot主要的目录结构和启动流程,如下图。

u-boot的stage1代码通常放在cpu/xxxx/start.S文件中,他用汇编语言写成;u-boot的stage2代码通常放在lib_xxxx/board.c文件中,他用C语言写成。各个部分的流程图如下:

2. 建立自己的开发板项目并测试编译。 目前u-boot对很多CPU直接支持,可以查看board目录的一些子目录,如:board/samsung/目录下就是对三星一些ARM 处理器的支持,有smdk2400、smdk2410和smdk6400,但没有2440,所以我们就在这里建立自己的开发板项目。 1)因2440和2410的资源差不多,主频和外设有点差别,所以我们就在board/samsung/下建立自己开发板的项目,取名叫my2440 2)因2440和2410的资源差不多,所以就以2410项目的代码作为模板,以后再修改

u_boot移植(五)之分析uboot源码中nand flash操作

u_boot移植(五)之分析uboot源码中nand flash操作 一、OneNand 和Nand Flash 我们已经能从Nand Flash启动了,启动之后,大家会看到如下效果: 可以看出,我们的uboot默认使用的是OneNand。需要注意的是我们的FSC100上面是没有OneNand的,有的是K9F2G08U0B 型号的NAND FLASH。 前面我们了解过Nor Flash 和Nand Flash,那OneNand Flash又是什么呢?

二、uboot 源码中Nand Flash部分代码分析 我们从Nand Flash初始化看起,打开lib_arm/board.c文件,为了紧抓主 线,以下代码只列举出了主线代码。

可以看出,我们可以通过CONFIG_CMD_NAND和 CONFIG_CMD_ONENAND两个宏来选择NAND FLASH初始化还是 ONENAND FLASH初始化。 uboot 中默认定义了宏CONFIG_CMD_ONENAND,所以选择的是ONENAND FLASH初始化。我们的FSC100上面使用的是 NAND FLASH,所以我们要定义CONFIG_CMD_NAND宏,取消CONFIG_CMD_ONENAND宏的定义。 嗯!先做个记录: 修改include/configs/fsc100.h,定义宏CONFIG_CMD_NAND,取消宏CONFIG_CMD_ONENAND。 好了,接下我们看看nand_init()函数时如何实现的。

看以看出,这段代码调用根据CONFIG_SYS_MAX_NAND_DEVICE宏[默认没有定义]的值来决定系统中Nand Flash设备的个数。接着调 用nand_init_chip()函数完成Nand Flash初始化,然后计算出每块Nand Flash的大小。最终会输出Nand Flash总的容量。 嗯!做个记录: 修改include/configs/fsc100.h,定义 宏CONFIG_SYS_MAX_NAND_DEVICE,值为1 没有看明白的地方是给nand_init_chip()函数传递的参数,接下来我们来看看他们是如何定义的。 哈哈,终于到了让人头疼的地方了。先来看看struct nand_chip和struct mtd_info两个结构体,这两个结构体的成员有很多很多,很多初学者一看到就晕头转向了,为了让大家不被吓到,我对这两个结构体的成员做了精简,只保留我们关心的成员,其它的都去掉了。 (1)struct nand_chip

UCOS-II ucGUI的完美移植

stm32 UCGUI 完美移植 作者:Changing发表时间:09-16 04:13分类:电子相关1 Comment 前一篇:stm32 DA 数模转换 后一篇:Stm32 SWD 下载 调试配置 UCGUI是一种嵌入式应用中的图形支持系统。它设计用于为任何使用LCD图形显示的应用提供高效的独立于处理器及LCD控制器的图形用户接口,它适用单任务或是多任务系统环境, 并适用于任意LCD控制器和CPU下任何尺寸的真实显示或虚拟显示。 它的设计架构是模块化的,由不同的模块中的不同层组成,由一个LCD驱动层来包含所有对LCD的具体图形操作。UCGUI可以在任何的CPU上运行,因为它是100%的标准C代码编写的。 类似程序还有国产的一个MINIGUI (https://www.wendangku.net/doc/a217328472.html,/zhcn/),MiniGUI 是一个自由软件项目。其目标是提供一个快速、稳定、跨操作系统的图形用户界面(GUI)支持系统,尤其是基于 Li nux/uClinux、eCos 以及其他传统 RTOS(如 VxWorks、ThreadX、uC/OS-II、Nucleus 等)的实时嵌入式操作系统。有机会尝试下,支持下国产,毕竟国内这样的公司不多。。 这里移植的UCGUI3.90a版本,虽然已经有更新的版本,比如UCGUI3.98、甚至4.04版本。但是目前来说只有这个版本的代码是最全的,包括了JPEG , MULTILAYER , MEMDEV ,AntiAlias等模块。一直想尝试做一个数码相册,JEPG模块自然少不了,所以移植了这个版本。 UCGUI390a 下载 整个移植过程,让LCD显示图案倒是没花多少时间,资料也比较多,但是在移植触摸屏的时候卡了好几天,然后又是 UCGUI 指针图标 移动有重影(LCD读取像素颜色函数有问题)。。。总之移植是个累人的活 首先需要保证你的LCD驱动和触摸屏驱动是有效的,如果你的LCD也是ili93xx 控制器 XPT2046控制器的触摸屏可以参考 stm32 驱动 T F T LCD stm32 驱动 触摸屏 两篇文章 UCGUI的文件数量很大,主要用到UCGUI390a/Start/Con f ig 和 UCGUI390a/Start/GUI两个文件夹下文件,不过文件数量也已经很多了 。。。 相关文件介绍如下:

uboot移植笔记

u-boot-2015-01移植笔记 一、修改编译器路径 修改顶层Makefile文件,查找CROSS_COMPILE =,注释掉if判断,增加一行CROSS_CMPILE = arm-linux- (根据编译器不同这个自行添加,在这里感谢胡茂晓同学)。 二、复制平台相近board 1、进入board子目录下的samsung子目录,复制trats2文件夹为自己平台名字的文件夹(这里笔者使用iTop4412)。 2、进入iTop4412子目录,修改为。 3、修改Makefile,将trats2改为iTop4412。 三、修改板子相应配置 1、从源码根目录下进入include/configs目录,复制为。 2、从源码根目录下进入configs目录,复制trats2_defconfig为iTop4412_defconfig。 3、修改iTop4412_defconfig,将CONFIG_DEFAULT_DEVICE_TREE="exynos4412-trats2"改为CONFIG_DEFAULT_DEVICE_TREE="exynos4412-iTop4412"。

四、增加自己的Device Tree Source 1、从源码根目录下进入arch/arm/Dts目录,复制 exynos4412- 。 2、修改当前目录下的Makefile文件,将 dtb-$(CONFIG_EXYNOS4) += \ \ \ \ \ 修改成 dtb-$(CONFIG_EXYNOS4) += \ \ \ \ \ \

五、制作顶层.config文件 1、在源码根目录下使用命令make menuconfig(貌似刚支持图形界面配置)。 2、先配置基本的,Architecture select 选项选择ARM architecture,architecture选项的子选项Target select选择Samsun EXYNOS;EXYNOS board select选项选择Exynos4412 Trat2 board。 3、在Device Tree Control选项下,y(yes)Run-time configuration via Device Tree,选择Provider of DTB for control 为Embedded DTB for DT control,在Default Device Tree for DT control选项下输入exynos4412-iTop4412,退出。 4、保存退出,在源码根目录下会生成.config文件,需要用命令ls –a 查看。 5、在源码根目录下使用命令vim .config,修改.config文件。将CONFIG_SYS_BOARD="trats2" 修改成CONFIG_SYS_BOARD="iTop4412";将CONFIG_SYS_CONFIG_NAME="trats2"修改成CONFIG_SYS_CONFIG_NAME="iTop4412";将CONFIG_DEFAULT_DEVICE_TREE=""修改成CONFIG_DEFAULT_DEVICE_TREE="exynos4412-iTop4412"。(注意:每次使用make menuconfig后都要修改本条)

ucGUI移植笔记-完善版

ucGUI移植笔记完善版 最近在弄ucGUI的移植,网上搜了不少资料,也问了同学,总算把简单的一个程序弄好了,也感谢openedv论坛和hua290565456的网友,看了他的贴子,才恍然大悟弄好。 该程序是直接用的原子大哥的TFTLCD显示的例子,直接拿过来移植的,感谢原子大哥的程序,在我学习STM32的旅途上帮助我不少。 所用到的是原子大哥TFTLCD例子(库函数版本)和ucGUI3.90源码。 建工程就不说了,附件里有,相信大家也看到别人建的工程了,下面直接说重点。 补充说明:如果你移植的时候怎么也不成功,大部分原因是GUI无法初始化LCD。考虑两方面的原因: 一、你写的底层驱动程序; 二、底层驱动程序与GUI系统的接口,即GUI的配置。 所有的问题几乎都是出现在这两方面,造成GUI无法成功调用正确的底层初始化程序。 所以: 1.确保你的底层驱动在没有移植GUI之前,能顺序驱动LCD成功。 2.然后,确保你的底层驱动接口没有与上层GUI有相同的公共的变量。可以有同名的变 量,但所有的变量都必须是私有的。也就是原子哥的那个结构体LCD不能在.h中定义。 如果LCD驱动文件是lcd.c和lcd.h,最好改为别的名字,比如ili93xx.c和ili93xx.h。然后还要把LCD_Init()初始化函数改为LCDx_Init();因为GUI系统已经有名为LCD.c的文件和LCD_Init()的函数。总而言之,确保你的底层的接口文件(xx.h)没有与上层同名的公共变量。 3.修改GUI系统与底层的接口: A.LCDConf.h中按照下面的图就行,其余的可以删除掉,一定要删除其他的,因为有 相同的LCD_CONTROLLER定义,会造成硬件出错而进入硬件出错中断死循环。注意红框中是刚刚改过的LCD初始化函数,改为刚刚更改的初始化函数就行。 B.接下来是GUIConf.h中的设置,目前只是用到简单的一个现实函数,多以就全部设

相关文档
相关文档 最新文档