当前位置: 首页 > news >正文

《嵌入式操作系统》_移植三星原版uboot20251114

目录

1.三星原版uboot文件

1.1找到相关配置

1.2直接make的尝试

1.3使用原版文件烧录进sd卡

1.4开发板的运行结果

2.uboot的初次修改

2.1让uboot跑起来

2.2更改时钟和ddr的配置

2.2.1打印信息的更改(没啥用)

2.2.2确认时钟问题

2.2.3DRAM(DDR内存)配置

2.3inand的驱动问题(硬盘驱动)

2.3.1出错现象:

2.3.2修改方法

2.3.3uboot初始化mmc的问题

2.4串口输出位置修改

2.5网络配置修改

2.6修改行提示符


1.三星原版uboot文件

     android_uboot_smdkv210.tar.bz2

        使用tar -jxvf命令解压文件,打开文件夹找到makefile,找到当前架构下的交叉编译配置。

        并无问题。

1.1找到相关配置

        我们使用第一个相关配置,即smdkv210single_config,其对应include/configs/smdkv210single.h文件。

        第一行代码的意思:

传递六个参数,分别是smdkv210single,arm,s5pc11x,smdkc110,samsung,s5pc110

1.2直接make的尝试

使用命令配置环境

make smdkv210single_config

使用make编译uboot

make

编译完成后进入烧录步骤,在sd_fusing目录下查看以下关键内容:

(1)用来烧录的sd_fusing.sh脚本

打开sd_fusing.sh文件,bl1和uboot的位置必须为1和49

(2)sd_fusing.sh文件中的reader_type1应该和实际的sd卡标号保持一致,煮波这里是/dev/sda(使用 ls /dev/ 命令查看当前外设标号)

(3)sd_fdisk和mkbl1文件格式,发现这俩都是X86的

        需要make clean之后重新make生成

1.3使用原版文件烧录进sd卡

./sd_fusing.sh /dev/sda
/dev/sda reader is identified.
make sd card partition
./sd_fdisk /dev/sda
1+0 records in
1+0 records out
512 bytes copied, 0.0132428 s, 38.7 kB/s
mkfs.vfat -F 32 
mkfs.fat 4.1 (2017-01-24)
No device specified.
Usage: mkfs.fat [-a][-A][-c][-C][-v][-I][-l bad-block-file][-b backup-boot-sector][-m boot-msg-file][-n volume-name][-i volume-id][-s sectors-per-cluster][-S logical-sector-size][-f number-of-FATs][-h hidden-sectors][-F fat-size][-r root-dir-entries][-R reserved-sectors][-M FAT-media-byte][-D drive_number][--invariant][--help]/dev/name [blocks]
BL1 fusing
16+0 records in
16+0 records out
8192 bytes (8.2 kB, 8.0 KiB) copied, 0.0614244 s, 133 kB/s
u-boot fusing
544+0 records in
544+0 records out
278528 bytes (279 kB, 272 KiB) copied, 1.54659 s, 180 kB/s
U-boot image is fused successfully.
Eject SD card and insert it again.

1.4开发板的运行结果

只输出了inand数据检查失败,连ok都没有,但是开发板上电了。直接拿来的运行结果是失败的。

分析结果:uboot中串口的最早的输出在“ok”,在lowlevel_init.s中初始化串口时打印出来的,串口无输出说明在打印‘o’之前就已经死掉了,但是开发板的供电锁存也在lowlevel_init.s中。那么问题就在lowlevel_init中。

2.uboot的初次修改

2.1让uboot跑起来

        uboot从start.s开始运行,,找到/cpu/s5pc11x文件夹,找到start.s,找到lowlevel_init函数,其对应/board/samsung/smdkc110/lowlevel_init.s文件,打开,其100-104行有供电锁存内容

	/* PS_HOLD pin(GPH0_0) set to high */ldr	r0, =(ELFIN_CLOCK_POWER_BASE + PS_HOLD_CONTROL_OFFSET)ldr	r1, [r0]orr	r1, r1, #0x300	orr	r1, r1, #0x1	str	r1, [r0]

        而第128行初始化串口时打印出来了ok

        发现代码拥有对pmic的控制,而开发板并没有pmic(power manager ic电源管理芯片)出现错误,可以将其屏蔽掉。

        重新make整个uboot文件

在sd_fusing文件夹中运行make clean

make

./cd_fusing.sh /dev/sda,即可将uboot烧录进sd卡。

重启开发板后读取串口输出信息

uboot成功启动,但是没能成功启动内核

2.2更改时钟和ddr的配置

2.2.1打印信息的更改(没啥用)

打开lib_arm文件夹的board.c

第185行函数打印了版本信息

static int display_banner (void)
{printf ("\n\n%s\n\n", version_string);debug ("U-Boot code: %08lX -> %08lX  BSS: -> %08lX\n",_armboot_start, _bss_start, _bss_end);
#ifdef CONFIG_MEMORY_UPPER_CODE /* by scsuh */debug("\t\bMalloc and Stack is above the U-Boot Code.\n");
#elsedebug("\t\bMalloc and Stack is below the U-Boot Code.\n");
#endif
#ifdef CONFIG_MODEM_SUPPORTdebug ("Modem Support enabled\n");
#endif
#ifdef CONFIG_USE_IRQdebug ("IRQ Stack: %08lx\n", IRQ_STACK_START);debug ("FIQ Stack: %08lx\n", FIQ_STACK_START);
#endifreturn (0);
}

其中version_string的定义:

const char version_string[] =U_BOOT_VERSION" (" __DATE__ " - " __TIME__ ")"CONFIG_IDENT_STRING;

其中CONFIG_IDENT_STRING的定义在smdkv210single.h中

/** SMDKC110 board specific data*/#define CONFIG_IDENT_STRING	" for SMDKV210"

这里该改为自己喜欢的内容

2.2.2确认时钟问题

lowlevel_init.s中有代码初始化时钟

	/* init system clock */bl system_clock_init

他的时钟配置在smdkv210single.h宏定义中,我们只需要打开相关的宏定义来更改系统频率,一般来说,不会有什么问题,我们可以手动修改cpu的频率

//#define CONFIG_CLK_667_166_166_133
//#define CONFIG_CLK_533_133_100_100
//#define CONFIG_CLK_800_200_166_133
//#define CONFIG_CLK_800_100_166_133
#define CONFIG_CLK_1000_200_166_133
//#define CONFIG_CLK_400_200_166_133
//#define CONFIG_CLK_400_100_166_133

2.2.3DRAM(DDR内存)配置

我们在串口调试助手中使用bdinfo命令获取当前boot的配置信息

发现其

内存0起始于0x2000_000

内存0大小为0x2000_0000

内存1起始于0x4000_0000

内存1大小为0x2000_0000

配置与开发板不匹配,需要修改

uboot中查看内存命令:

md 20000000 10//查看内存地址20000000开始的10个内存
mw.l 20000000 22222222//将内存地址为20000000的内存更改为22222222

我们需要在smdkv210single.h文件中更改配置,(我们只有2块256mb大小的内存),还有bank2内存的起始地址应该更改为0x40000000,到此内存相关配置完成

重新配置环境

make distclean
make smdkv210single_config

编译工程、编译烧录文件

至此内存方面初始化完成。

哎!你说我就是想把bank1内存的开头地址给写到0x30000000上(可以跳过)

那怎么办呢?

首先更改开头地址(30指的是开头,F0是范围取反~0X0FFF_FFFF)

再更改软件配置地址

再更改虚拟地址映射表(uboot开启了mmu对内存进行了段式映射)

查看三星的内存映射逻辑

在start.s里有

_mmu_table_base的配置为:

mmu_table在lowlevel.init.s中的配置如下,更改其地址为0x30000000

mmu_table:.set __base,0// Access for iRAM.rept 0x100FL_SECTION_ENTRY __base,3,0,0,0.set __base,__base+1.endr// Not Allowed.rept 0x200 - 0x100.word 0x00000000.endr.set __base,0x200// should be accessed.rept 0x600 - 0x200FL_SECTION_ENTRY __base,3,0,1,1.set __base,__base+1.endr.rept 0x800 - 0x600.word 0x00000000.endr.set __base,0x800// should be accessed.rept 0xb00 - 0x800FL_SECTION_ENTRY __base,3,0,0,0.set __base,__base+1.endr/*	.rept 0xc00 - 0xb00.word 0x00000000.endr */.set __base,0xB00.rept 0xc00 - 0xb00FL_SECTION_ENTRY __base,3,0,0,0.set __base,__base+1.endr//.set __base,0x200.set __base,0x300	//--------------------------------修改位置// 256MB for SDRAM with cacheable.rept 0xD00 - 0xC00FL_SECTION_ENTRY __base,3,0,1,1.set __base,__base+1.endr// access is not allowed.@.rept 0xD00 - 0xC80@.word 0x00000000@.endr.set __base,0xD00// 1:1 mapping for debugging with non-cacheable.rept 0x1000 - 0xD00FL_SECTION_ENTRY __base,3,0,0,0.set __base,__base+1.endr	#else	// CONFIG_MCP_AC, CONFIG_MCP_H, CONFIG_MCP_B

在smdkc110.c中更改虚拟内存映射逻辑

ok到此完美启动-指的是uboot能工作(没事别瞎改代码)

2.3inand的驱动问题(硬盘驱动)

2.3.1出错现象:

串口输出结果:

2.3.2修改方法

搜索关键字可以找到代码:

** Read and decode extended CSD.*/
static int mmc_read_ext_csd(struct mmc *host)
{int err;u8 *ext_csd;unsigned int ext_csd_struct;//版本控制器版本问题if (host->version < (MMC_VERSION_4 | MMC_VERSION_MMC))return 0;/** As the ext_csd is so large and mostly unused, we don't store the* raw block in mmc_card.*/ext_csd = malloc(512);if (!ext_csd) {printf("could not allocate a buffer to ""receive the ext_csd.\n");return -1;}err = mmc_switch(host, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, 0);if (err)return err;err = mmc_switch(host, EXT_CSD_CMD_SET_NORMAL,EXT_CSD_BUS_WIDTH,EXT_CSD_BUS_WIDTH_1);if (err)return err;err = mmc_send_ext_csd(host, ext_csd);if (err) {/** High capacity cards should have this "magic" size* stored in their CSD.*/if (host->capacity == (4096 * 512)) {printf("unable to read EXT_CSD ""on a possible high capacity card. ""Card will be ignored.\n");} else {printf("unable to read ""EXT_CSD, performance might suffer.\n");err = 0;}goto out;}ext_csd_struct = ext_csd[EXT_CSD_REV];if (ext_csd_struct > 5) {//-------------------------------------修改为10printf("unrecognised EXT_CSD structure ""version %d\n", ext_csd_struct);err = -1;goto out;}

修改代码后发现uboot可以成功引导内核启动(歪日,干掉提出问题的代码)。

2.3.3uboot初始化mmc的问题

板子上有两块硬盘区域,一块inand在板子上处于sd0位置,一块sd卡在sd1位置

uboot初始化了sd0位置的硬盘:

修改mmc.c文件中1166行代码

uboot就会初始化外置sd卡(但是好像启动不了内核)。

2.4串口输出位置修改

        uboot默认使用串口2进行控制台进行输入输出。

        soc一共设置了串口0123四个串口,板子上一共有串口0和串口2,如果你想修改为串口0输入输出控制,你只需要修改配置文件即可

2.5网络配置修改

        修改uboot配置头文件smdkv210single.h中的网络配置即可

       

      但是我们在源代码中修改的是默认的环境变量,但是inand中存在env分区,会优先使用env分区中的环境变量。

        使用以下代码可以更新inand中的环境变量

set ipaddr 192.168.1.30
save

        可以使用以下命令来擦除mmc的内容

mmc write 0 30000000 11#      //使用内存地址为30000000的32个扇区长度的内容填充mmc从第17个扇区开始的32个扇区

2.6修改行提示符

         修改uboot配置头文件smdkv210single.h中的提示符配置即可


 

http://www.dtcms.com/a/618555.html

相关文章:

  • 云南省和城乡建设厅网站环保空调东莞网站建设
  • 做鞋子网站的域名高端建站设计
  • Android内核进阶之周期更新PCM状态snd_pcm_period_elapsed:用法实例(九十二)
  • 做外汇关注的网站大学生创业做网站的筹资方式
  • HttpServletResponse 与 ResponseEntity 详解
  • 网络安全 | 深入了解OAuth 2.0原理
  • 人人商城网站开发wordpress图片放大镜
  • 2016年软件评测师,web测试案例分析解答
  • Vue 项目实战《尚医通》,获取挂号医生的信息展示,笔记43
  • wordpress创建多站点互联网公司排名伊对排第几
  • 什么网站容易做流量中小微企业名录查询系统
  • 杂志社网站模板wordpress网址导航模板
  • RAG 场景中常用的向量索引
  • 【论文阅读】Harnessing the Power of LLMs in Practice: A Survey on ChatGPT and Beyond
  • LC144 二叉树的前序遍历
  • Map的遍历方式
  • 有没有找人做标书的网站建网站用自己的主机做服务器
  • Day18:二叉树part8(669.修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树)
  • 常见的简单的营销软件宁波seo哪家最便宜
  • 电力系统设备故障因果推理与深度学习驱动的根因分析优化
  • ElasticSearch详解(篇二)
  • 重庆网站建设怎么样来个手机能看的网站2021
  • 网站建设的财务分析wordpress阶梯插件
  • CSS Position(定位)
  • redis安装与部署
  • 做网站的毕业设计做网站用什么语言高效
  • 长春好的做网站公司排名软件推广公司
  • VSCode终极版
  • NFS服务器
  • MYSQL索引的底层数据结构