s5p6818/fs4418系统移植之uboot的移植
/*****************uboot移植
******************/
【1】获取u-boot源码1. u-boot官方网站https://ftp.denx.de/pub/u-boot/2. 开发板厂家 3. 芯片厂家4. 主管领导(推荐)第1种和第2,3,4种有何区别?芯片厂家没有将芯片的uboot支持的源码开源到u-boot官方源码中,uboot官方源码不支持此处理器。S5P6818芯片三星没有将支持此处理器的源码开源到uboot官方,uboot官方获取的uboot源码不支持S5P6818芯片。此课程使用的fs6818的uboot源码:u-boot-2014.07-netok.tar.bz2【2】uboot版本选择* 1. 芯片厂家提供哪个版本就直接用哪个版本2. 不选最新 --》 不稳定,资料较少3. 不选太旧 --》 不支持硬件平台4. 不选择测试版,选择稳定版后缀有rc为测试版
【3】移植的准备工作根据处理器获取硬件相关的信息。cpu:Cortex-A53 arch:ARMSOC:S5P6818 vendor:samsungboard:S5P6818 ---》fs6818开发板
【4】移植uboot源码
1. 准备uboot源码 1》 拷贝uboot源码到ubuntu中。2》 解压缩uboot源码tar -vxf u-boot-2014.07-netok.tar.bz23》 进入uboot源码目录 cd u-boot-2014.07不要将源码放到共享文件夹中,源码不要在windows下边去解压缩。windows不支持软连接文件。
2. 分析uboot源码的目录结构 平台相关:跟硬件相关的代码arch :架构相关代码board:板子相关代码 samsung公司将arch和borad目录下很多跟自己硬件无关的代码全部删除uboot源码的配置编译和管理使用Makefile工具。
3. 配置和编译uboot源码:1》 make help : 查看make的帮助信息清除目标:clean mrproper distclean 编译uboot源码:all Execute "make" or "make all" to build all targets marked with [*] For further info see the ./README file更多的详细的信息查看README。2》读README 254 For all supported boards there are ready-to-use default255 configurations available; just type "make <board_name>_config".256 257 Example: For a TQM823L module type:258 259 cd u-boot260 make TQM823L_configmake <board_name>_config 作用?由于uboot源码支持多种架构和开发板,应该配置uboot支持当前自己使用的开发板,目的是编译uboot源码时,只编译跟自己硬件平台相关的代码。3》uboot源码详细的配置编译过程1> 修改Makefile配置交叉编译工具链打开uboot源码顶层目录的Makefile,修改以下内容:198 ifeq ($(HOSTARCH),$(ARCH))199 CROSS_COMPILE ?= 200 endif修改为:198 ifeq (arm,arm)199 CROSS_COMPILE ?= arm-none-linux-gnueabi-200 endif2> 清除中断文件make distclean 切记:make distclean只在第一次编译是执行一次。3> 配置uboot源码支持fs6818开发板make fs6818_config打印以下信息表示配置成功:Configuring for fs6818 board...4> 编译uboot源码,生成uboot的镜像(可执行文件)make/make all打印以下信息表示编译成功,生成ubootpak.binLD u-bootOBJCOPY u-boot.srecOBJCOPY u-boot.bin./tools/mk6818 ubootpak.bin nsih.txt 2ndboot u-boot.binNSIH : 188 line processed.NSIH : 512 bytes generated.Generate destination file: ubootpak.bin
分析make fs6818_config命令的执行过程详解需要具备能力:看到Makefile shell脚本
1. 打开uboot源码顶层目录的Makefile文件,搜索fs6818_config,搜索发现没有fs6818_config目标。%:模式匹配符搜索_config,找到以下信息:467 %_config:: outputmakefile 468 @$(MKCONFIG) -A $(@:_config=)469 @cp net/x6818-eth.mk net/eth.o去掉@$(MKCONFIG) -A $(@:_config=)前边的@符号,将命令回显到终端。/home/hqyj/20021/porting/u-boot-2014.07/mkconfig -A fs6818$(@:_config=):截取fs6818_config中的fs6818字符串2. 使用file命令查看mkconfig文件的属性file mkconfig : shell脚本文件3. 打开uboot源码顶层目录的mkconfig脚本文件 24 if [ \( $# -eq 2 \) -a \( "$1" = "-A" \) ] ; then25 # Automatic mode26 line=`awk '($0 !~ /^#/ && $7 ~ /^'"$2"'$/) { print $1, $2, $3, $4, $5, $6, $7, $8 }' $srctree/boards.cfg`27 if [ -z "$line" ] ; then28 echo "make: *** No rule to make target \`$2_config'. Stop." >&229 exit 130 fi31 32 set ${line}33 # add default board name if needed34 [ $# = 3 ] && set ${line} ${1}35 fi 解析:$# : 参数的个数$1 : 第一个参数$2 : 第二个参数-eq :相等-a :并且 $0 !~ /^#/ : 不是以#开头 $7 ~ /^'"$2"'$/ :$7和$2相等打开uboot源码顶层目录的boards.cfg line=Active arm slsiap s5p6818 s5p6818 fs6818 fs6818 - set ${line} :重新设置脚本文件传递的参数之前:mkconfig -A fs6818 $1 $2执行set ${line}之后:mkconfig Active arm slsiap s5p6818 s5p6818 fs6818 fs6818 - $1 $2 $3 $4 $5 $6 $7 $8
51 CONFIG_NAME="${7%_config}"52 53 [ "${BOARD_NAME}" ] || BOARD_NAME="${7%_config}"54 55 arch="$2" 56 cpu=`echo $3 | awk 'BEGIN {FS = ":"} ; {print $1}'`57 spl_cpu=`echo $3 | awk 'BEGIN {FS = ":"} ; {print $2}'`解析: CONFIG_NAME=fs6818 arch=armcpu=slsiap63 [ "$6" != "-" ] && board="$6"64 [ "$5" != "-" ] && vendor="$5" 65 [ "$4" != "-" ] && soc="$4"board=fa6818vendor=s5p6818SOC=S5P681896 if [ "$options" ] ; then97 echo "Configuring for ${BOARD_NAME} - Board: ${CONFIG_NAME}, Options: ${98 else # 配置成功打印以下内容99 echo "Configuring for ${BOARD_NAME} board..."
100 fi# 创建架构头文件102 #103 # Create link to architecture specific headers104 #105 if [ -n "$KBUILD_SRC" ] ; then106 mkdir -p ${objtree}/include107 LNPREFIX=${srctree}/arch/${arch}/include/asm/108 cd ${objtree}/include109 mkdir -p asm110 else111 cd arch/${arch}/include112 fi113 114 rm -f asm/arch115 116 if [ "${soc}" ] ; then117 ln -s ${LNPREFIX}arch-${soc} asm/arch118 elif [ "${cpu}" ] ; then119 ln -s ${LNPREFIX}arch-${cpu} asm/arch120 fi121 122 if [ -z "$KBUILD_SRC" ] ; then123 cd ${srctree}/include124 fi# 创建Make工具需要使用的配置头文件126 #127 # Create include file for Make128 #129 ( echo "ARCH = ${arch}"130 if [ ! -z "$spl_cpu" ] ; then131 echo 'ifeq ($(CONFIG_SPL_BUILD),y)'132 echo "CPU = ${spl_cpu}"133 echo "else"134 echo "CPU = ${cpu}"135 echo "endif"136 else137 echo "CPU = ${cpu}"138 fi139 echo "BOARD = ${board}"140 141 [ "${vendor}" ] && echo "VENDOR = ${vendor}"142 [ "${soc}" ] && echo "SOC = ${soc}"143 exit 0 ) > config.mk打开include目录下的config.mk文件,有以下信息:1 ARCH = arm 2 CPU = slsiap3 BOARD = fs68184 VENDOR = s5p68185 SOC = s5p6818创建板子指定的头文件152 #153 # Create board specific header file154 #155 if [ "$APPEND" = "yes" ] # Append to existing config file156 then157 echo >> config.h158 else159 > config.h # Create new config file160 fi161 echo "/* Automatically generated - do not edit */" >>config.h162 163 for i in ${TARGETS} ; do164 i="`echo ${i} | sed '/=/ {s/=/ /;q; } ; { s/$/ 1/; }'`"165 echo "#define CONFIG_${i}" >>config.h ;166 done 168 echo "#define CONFIG_SYS_ARCH \"${arch}\"" >> config.h169 echo "#define CONFIG_SYS_CPU \"${cpu}\"" >> config.h170 echo "#define CONFIG_SYS_BOARD \"${board}\"" >> config.h 171 172 [ "${vendor}" ] && echo "#define CONFIG_SYS_VENDOR \"${vendor}\"" >> config.h173 174 [ "${soc}" ] && echo "#define CONFIG_SYS_SOC \"${soc}\"" >> config.h175 176 [ "${board}" ] && echo "#define CONFIG_BOARDDIR board/$BOARDDIR" >> config.h177 cat << EOF >> config.h178 #include <config_cmd_defaults.h>179 #include <config_defaults.h>180 #include <configs/${CONFIG_NAME}.h>181 #include <asm/config.h>182 #include <config_fallbacks.h>183 #include <config_uncmd_spl.h>184 EOF185 打开include目录下的config.h文件,有以下信息:1 /* Automatically generated - do not edit */2 #define CONFIG_SYS_ARCH "arm"3 #define CONFIG_SYS_CPU "slsiap"4 #define CONFIG_SYS_BOARD "fs6818"5 #define CONFIG_SYS_VENDOR "s5p6818"6 #define CONFIG_SYS_SOC "s5p6818"7 #define CONFIG_BOARDDIR board/s5p6818/fs68188 #include <config_cmd_defaults.h>9 #include <config_defaults.h>10 #include <configs/fs6818.h>11 #include <asm/config.h>12 #include <config_fallbacks.h>13 #include <config_uncmd_spl.h>
【8】开发板系统的部署uboot镜像:ubootpak.bin linux内核镜像:uImage根文件系统镜像:ramdisk.img 根文件系统:rootfsramdisk.img由rootfs打包压缩得到 1. 开发阶段系统部署方式 (驱动开发)uboot ---》EMMC/SD卡 uImage ---》使用tftp下载到内存中rootfs ---》使用nfs网络文件系统的方式进行挂载2. 产品阶段系统部署方式(项目完成) uboot ---》EMMC/SD卡 uImage ---》EMMC/SD卡 ramdisk.img ---》EMMC/SD卡
【开发阶段系统部署方式】 内核镜像:系统移植\系统移植资料\镜像\uImage 1. 启动uboot进入uboot的交互界面2. 下载内核镜像uImage到内存中先将uImage镜像文件拷贝到tftpboot目录下,tftp 0x48000000 uImage3. 设置自启动参数bootargs, 重点掌握面试出现概率高。uboot环境变量中的bootargs变量是一个自启动参数,linux内核启动时,会uboot环境变量的分区读取bootargs变量的值。(只需要设置一次)ubuntu系统是32位:setenv bootargs root=/dev/nfs nfsroot=192.168.1.250:/home/hqyj/nfs/rootfs rw console=/dev/ttySAC0,115200 init=/linuxrc ip=192.168.1.222saveenv ubuntu系统是16.04 64位:setenv bootargs root=/dev/nfs nfsroot=192.168.1.250:/home/hqyj/nfs/rootfs v4,tcp rw console=/dev/ttySAC0,115200 init=/linuxrc ip=192.168.1.222ubuntu系统是18.04以上 64位:setenv bootargs root=/dev/nfs nfsroot=192.168.1.250:/home/hqyj/nfs/rootfs v4,tcp rw console=/dev/ttySAC0,115200 init=/linuxrc ip=192.168.1.222ubuntu系统是18.04以上版本需要修改ubuntu中的配置文件:参考文档:https://www.jianshu.com/p/10e3245f15f3?tdsourcetag=s_pctim_aiomsgroot=/dev/nfs:根文件系统的类型是nfsnfsroot=192.168.1.250:/home/hqyj/nfs/rootfs:根文件系统的路径,改成自己的ubuntu IP地址和根文件系统的路径rw:对根文件系统具有可读可写的权限console=/dev/ttySAC0,115200:开发板使用的是串口0,波特率是115200 init=/linuxrc:内核启动之后执行的1号进程ip=192.168.1.222:开发板的IP地址bootargs:就是告诉内核从哪里挂载根文件系统的,4. 启动linux内核 bootm 0x48000000bootm:用于启动linux内核的命令5. 总结:根文件系统挂载不成功的原因1》检查nfs安装和配置是否正确2》重启nfs服务sudo service nfs-kernel-server restart3》检查bootargs参数设置是否正确 tftp下载镜像不成功的原因,翻阅前边的笔记。
uboot配置编译流程:
uboot配置编译流程1》配置交叉编译工具链CROSS_COMPILE2》清除源码的中间文件make clean / distclean 3》配置源码支持自己的硬件平台make <board_name>_configmake fs6818_config4》编译uboot源码make all
通过ubuntu系统烧写ubootpak.bin到SD卡中
使用sdtool工具:工具在以下目录中:系统移植\系统移植资料\工具\sdtool1》拷贝sdtool工具到ubuntu中,并切换到sdtool目录下 ....cd sdtool 2》将SD卡插到PC上,并让ubuntu识别SD卡,要求:必须使用SD卡读卡器,不可以使用电脑自带的SD卡卡槽SD卡被ubuntu识别之前,先在windows下对SD卡进行格式化。ubuntu识别SD卡步骤:虚拟机-》可移动设备-》读卡器的名字-》连接读卡器或者电脑是USB3.0的接口:虚拟机-》设置-》USB控制器-》USB兼容性:--》USB3.03》进入到sdtool目录下s5p6818-sdmmc.sh:烧写ubootpak.bin到SD卡中的脚本文件ubootpak.bin:自己编译生成的u-boot的镜像 使用我们自己制作的ubootpak.bin文件替换sdtool目录下的ubootpak.bin文件。4》烧写ubootpak.bin文件到SD卡中 在ubuntu的终端中执行以下命令 sudo ./s5p6818-sdmmc.sh /dev/sdb ubootpak.bin /dev/sdb : SD卡在dev目录下的设备文件执行以上命令出现以下内容,表示制作成功:669+1 records in670+0 records out343040 bytes (343 kB) copied, 0.00605781 s, 56.6 MB/s^_^ The image is fused successfully5》测试SD卡是否成功烧写uboot的镜像1. 开发板断电,2. 将SD卡插到开发板的SD卡槽上3. 设置开发板的启动方式为SD卡启动:查看拨码开关上边的表格拨码开关 1 OFF2 OFF 3 OFF4. 开发板上电注意: 1. 格式化SD卡,格式化为Fat32格式 在ubuntu中格式化使用fdisk命令。2. SD卡上的开关拨到lock位置,如果拨到Lock的对立面,SD卡会写保护。s5p6818-sdmmc.sh脚本文件分析:dd if="${xboot}" of="${dev}" bs=512 seek=1 conv=sync dd:数据烧写命令xboot=ubootpak.bin dev=/dev/sdbif:输入文件 (input file)of:输出文件 (output file)bs:大写是512字节seek:偏移seek*bs大小空间conv=sync:同步
通过windows系统烧写xin_ubootpak.bin到SD卡中
通过windows系统烧写xin_ubootpak.bin到SD卡中使用windows下的工具:系统移植\系统移植资料\工具\ImageWriter.7z解压缩之后,双击打开工具:Win32DiskImager.exe1. 首先得到windows版本的ubootpak.bin 在ubuntu版本的ubootpak.bin文件前边添加512字节的占位,跳过SD的前边512字节的分区表。dd if=/dev/zero of=512B bs=512 count=1chmod 777 512B cat 512B ubootpak.bin > win_ubootpak.bin拷贝win_ubootpak.bin到windows文件夹中2. 将SD卡插到PC上,可以使用PC自带的SD卡卡槽打开Win32DiskImager.exe,选择SD卡的盘符,选择要写到SD卡中的win_ubootpak.bin文件,单击write,就可以写入到SD卡中。3. 测试SD卡是否制作成功。
烧写ubootpak.bin到EMMC(flash)中
烧写ubootpak.bin到EMMC(flash)中前提:SD卡启动盘必须制作好,前边已经完成。通过SD卡的方式启动uboot,并进入uboot的交互界面。思路:ubootpak.bin烧写到EMMC中的思路.png1. 通过SD卡的方式启动uboot,并进入uboot的交互界面。 2. 使用tftp命令将ubootpak.bin文件烧写到内存中先将ubootpak.bin拷贝到tftpboot目录下cp ubootpak.bin ~/tftpboot/tftp 0x41000000 ubootpak.bin 将ubootpak.bin烧写到内存的0x41000000地址中3. 将内存中的ubootpak.bin使用update_mmc命令烧写到EMMC中update_mmc <dev no> <type> <mem> <addr> <length>- type : 2ndboot | boot | raw | part<dev no>:设备号 EMMC设备号为:2<type>:类型 2ndboot <mem>:从内存的哪个地址开始进行数据搬移<addr>:搬移到EMMC的起始地址,以字节为单位<length>:搬移数据的长度,以字节为单位 具体长度要看ubootpak.bin大小pri打印环境变量有以下信息:flash=mmc,2:ubootpak:2nd:0x200,0x78000;flash=mmc,2:2ndboot:2nd:0x200,0x4000;update_mmc 2 2ndboot 0x41000000 0x200 0x780004. 测试是否烧写成功1. 开发板断电,2. 切换到EMMC的启动方式拨码开关 1 ON2 OFF 3 ON3. 开发板上电
uboot中mmc命令的使用
uboot中mmc命令的使用1》mmc info - display info of the current MMC device查看当前mmc设备的信息2》mmc read addr blk# cnt作用:从MMC中读数据到内存中addr:内存的起始地址 blk#:MMC块设备的编号,一块是512字节cnt:个数从MMC的起始块号为blk的位置读数据到内存的addr为起始地址处,读cnt块数据的大小3》mmc write addr blk# cnt作用:从内存中写数据到MMC中addr:内存的起始地址 blk#:MMC块设备的编号,一块是512字节cnt:个数从内存的addr为起始地址写数据到MMC的blk块号处,写数据的大小位cnt块。4》mmc erase blk# cnt作用:擦除MMC中的数据blk#:MMC块设备的编号,一块是512字节cnt:个数从MMC的blk处开始擦除数据,擦除数据的大小是cnt块。
产品阶段系统部署方式(项目完成)
【产品阶段系统部署方式(项目完成)】 uboot ---》EMMC/SD卡 uImage ---》EMMC/SD卡 ramdisk.img ---》EMMC/SD卡 1. 将uboot镜像烧写到EMMC中(uboot烧写阶段已经完成)update_mmc 2. 将内核镜像uImage烧写到EMMC中系统移植\系统移植资料\镜像\uImage将uImage拷贝到ubuntu的tftpboot目录下tftp 0x41000000 uImage mmc write 0x41000000 0x800 0x40003. 将根文件系统镜像ramdisk.img烧写到EMMC中系统移植\系统移植资料\镜像\ramdisk.img将ramdisk.img拷贝到ubuntu的tftpboot目录下tftp 0x41000000 ramdisk.img mmc write 0x41000000 0x20800 0x208004. 设置uboot的启动参数bootcmd bootargssetenv bootcmd mmc read 0x48000000 0x800 0x4000\;mmc read 0x49000000 0x20800 0x20800\;bootm 0x48000000 0x49000000setenv bootargs root=/dev/ram rw initrd=0x49000040,0x1000000 rootfstype=ext4 init=/linuxrc console=ttySAC0,115200saveenv 解析:root=/dev/ram :从内存中挂载根文件系统rw :对根文件系统具有读写的权限initrd=0x49000040,0x1000000挂载根文件系统的起始地址和大小跳过根文件系统的64字节的头部信息。rootfstype=ext4 :根文件系统的类型init=/linuxrc console=ttySAC0,115200开发板的内存是1G大小,寻址空间是0x4000_0000 - 0x8000_0000
系统的部署开发阶段系统的部署u-boot镜像 : EMMC/SD/TFlinux内核镜像 : tftp服务下载到内存中根文件系统 : nfs服务从服务器端去挂载setenv bootargs root=/dev/nfs nfsroot=192.168.2.149:/home/topeet/nfs/rootfs rw console=/dev/ttySAC0,115200 init=/linuxrc ip=192.168.2.213setenv bootcmd tftp 48000000 uImage\;bootm 48000000产品阶段系统的部署u-boot镜像 : EMMC/SD/TFlinux内核镜像 : EMMC/SD/TF根文件系统 : EMMC/SD/TFsetenv bootcmd mmc read 0x48000000 0x800 0x4000\;mmc read 0x49000000 0x20800 0x20800\;bootm 0x48000000 0x49000000setenv bootargs root=/dev/ram rw initrd=0x49000040,0x1000000 rootfstype=ext4 init=/linuxrc console=ttySAC0,115200
uboot启动过程主要做了什么?
uboot启动过程主要做了什么?分析uboot启动过程中,代码的执行主要做什么。ubootpak.bin的程序的入口代码(第一行代码)1. 打开uboot源码顶层目录的u-boot.lds链接脚本文件8 .text :9 {10 *(.__image_copy_start)代码段的第一个文件11 arch/arm/cpu/slsiap/s5p6818/start.o (.text*)12 arch/arm/cpu/slsiap/s5p6818/vectors.o (.text*)13 *(.text*)14 }2. 打开arch/arm/cpu/slsiap/s5p6818/start.S构建异常向量表20 .globl _stext21 _stext:22 b reset23 ldr pc, _undefined_instruction24 ldr pc, _software_interrupt 25 ldr pc, _prefetch_abort26 ldr pc, _data_abort27 ldr pc, _not_used28 ldr pc, _irq29 ldr pc, _fiq3. 通过b reset跳转到reset标签处78 reset:保存uboot的启动参数79 bl save_boot_params80 /*81 * set the cpu to SVC32 mode82 */切换CPU进入SVC模式83 mrs r0, cpsr84 bic r0, r0, #0x1f 85 orr r0, r0, #0xd386 msr cpsr,r087 禁止看门狗88 /* disable watchdog */89 ldr r0, =0xC001900090 mov r1, #091 str r1, [r0]禁止MMU和catch95 bl cpu_init_cp15获取CPUID,初始锁相环,选择器,内存96 bl cpu_init_crit 252 ENTRY(cpu_init_crit)259 b lowlevel_init @ go setup pll,mux,memory260 ENDPROC(cpu_init_crit)实现uboot的自搬移的过程,从flash中搬移到内存中100 relocate_to_text:101 /*102 * relocate u-boot code on memory to text base103 * for nexell arm core (add by jhkim)104 */105 adr r0, _stext /* r0 <- current position of code */106 ldr r1, TEXT_BASE /* test if we run from flash or RAM */107 cmp r0, r1 /* don't reloc during debug */108 beq clear_bss109 110 ldr r2, _bss_start_ofs111 add r2, r0, r2 /* r2 <- source end address */ 112 113 copy_loop_text:114 ldmia r0!, {r3-r10} /* copy from source address [r0] */115 stmia r1!, {r3-r10} /* copy to target address [r1] */116 cmp r0, r2 /* until source end addreee [r2] */117 ble copy_loop_text118 119 ldr r1, TEXT_BASE /* restart at text base */120 mov pc, r1// 清除BSS段 122 clear_bss:123 #ifdef CONFIG_MMU_ENABLE124 bl mmu_turn_on125 #endif126 ldr r0, _bss_start_ofs127 ldr r1, _bss_end_ofs128 ldr r4, TEXT_BASE /* text addr */ 129 add r0, r0, r4130 add r1, r1, r4131 mov r2, #0x00000000 /* clear */132 133 clbss_l:str r2, [r0] /* clear loop... */134 add r0, r0, #4135 cmp r0, r1136 bne clbss_l// 初始化C代码运行所需的栈空间138 ldr sp, =(CONFIG_SYS_INIT_SP_ADDR)139 bic sp, sp, #7 /* 8-byte alignment for ABI compliance */140 sub sp, #GD_SIZE /* allocate one GD above SP */ 141 bic sp, sp, #7 /* 8-byte alignment for ABI compliance */142 mov r9, sp /* GD is above SP */143 mov r0, #0// 全局数据结构体类型变量的初始化144 bl board_init_f// 板子硬件初始化函数160 ldr pc, =board_init_r /* this is auto-relocated! */arch/arm/lib/board.c710 for (;;) {711 main_loop(); // 死循环712 }82 s = bootdelay_process(); 获取倒计时的时间83 if (cli_process_fdt(&s)) 倒计时减到0之前按下任意键,进入交互模式84 cli_secure_boot_cmd(s); 交互的程序85 86 autoboot_command(s); 自启动的程序
内核源码配置和编译的详细过程
内核源码配置和编译的详细过程 1> 配置交叉编译工具链,打开内核源码顶层目录的Makefile,将以下内容:195 ARCH ?= 196 CROSS_COMPILE ?= 修改为: 195 ARCH ?= arm196 CROSS_COMPILE ?= arm-none-linux-gnueabi-2> 清除中间文件 make clean / distclean 3> 配置内核源码支持fs6818硬件平台 make fs6818_defconfig4> 通过菜单选项的方式对内核进行配置make menuconfig 5> 编译内核生成uImage的内核镜像文件make -j2 uImage 或者make -j4 uImage 或者make uImage打印以下信息表示编译成功:Image Name: Linux-3.4.39-farsightCreated: Mon Jul 20 15:09:28 2020Image Type: ARM Linux Kernel Image (uncompressed)Data Size: 5391608 Bytes = 5265.24 kB = 5.14 MBLoad Address: 40008000Entry Point: 40008000uImage内核镜像在一下目录中:Image arch/arm/boot/uImage is ready问题1:make menuconfig Your display is too small to run Menuconfig!It must be at least 19 lines by 80 columns.make[1]: *** [menuconfig] Error 1make: *** [menuconfig] Error 2原因:终端字体太大,缩小终端的字体问题2:make menuconfig第一次使用make menuconfig 需要安装图形化界面的工具配置之前需要安装图形图(make meuconfig):sudo apt-get install libncurses5-dev 问题3:make uImage在编译的过程中可能出现如下错误:"mkimage" command not found - U-Boot images will not be builtmake[1]: *** [arch/arm/boot/uImage] Error 1make: *** [uImage] Error 2错误的原因:找不到mkimage命令,根据提示分析出来mkimage应该存在uboot源码目录中uboot源码必须进行编译之后才会有mkimage可执行程序 解决问题的方法:将uboot源码的tools目录下的mkimage,拷贝到到ubuntu的/usr/bin目录下:sudo cp ~/uboot源码目录/tools/mkimage /usr/binuboot目录 ubuntu目录再次make uImage重新编译内核即可。测试生成的uImage内核镜像文件是否可以使用1》拷贝arch/arm/boot/目录下的uImage文件到tftpboot目录下2》设置开发板的系统启动方式开发阶段系统的部署和自启动的模式tftp 下载内核 nfs挂载根文件系统bootcmd bootargs3》系统启动成功,说明内核编译成功
make fs6818_defconfig命令执行过程详解
make fs6818_defconfig命令执行过程详解1. 打开内核源码顶层目录的Makefile文件,搜索fs6818_defconfig,没有搜索到;搜索%config,搜索到一下信息491 %config: scripts_basic outputmakefile FORCE 492 $(Q)mkdir -p include/linux include/config493 $(Q)$(MAKE) $(build)=scripts/kconfig $@$@ : 目标$^ :所有的依赖$< :第一个依赖解析:Q = @mkdir -p include/linux include/configmake -f scripts/Makefile.build obj=scripts/kconfig fs6818_defconfig进入scripts/kconfig目录下执行make fs6818_defconfig2. 打开scripts/kconfig目录下的Makefile文件搜索%_defconfig,得到以下信息95 %_defconfig: $(obj)/conf96 $(Q)$< --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig)解析:scripts/kconfig/conf --defconfig=arch/arm/configs/fs6818_defconfig Kconfig使用file命令查看scripts/kconfig目录下conf文件的类型file scripts/kconfig/conf可知conf文件是一个elf可执行文件通过以上分析可知,conf文件根据arch/arm/configs/目录下的fs6818_defconfig默认配置文件和内核源码顶层目录的Kconfig文件生成.config文件。
make menuconfig执行过程详解
make menuconfig执行过程详解
1. 搜索menuconfig,没有搜索到;搜索%config,搜索到一下信息491 %config: scripts_basic outputmakefile FORCE 492 $(Q)mkdir -p include/linux include/config493 $(Q)$(MAKE) $(build)=scripts/kconfig $@解析:Q = @mkdir -p include/linux include/configmake -f scripts/Makefile.build obj=scripts/kconfig menuconfig进入scripts/kconfig目录下执行make menuconfig
2. 打开scripts/kconfig目录下的Makefile文件搜索menuconfig,得到以下信息20 menuconfig: $(obj)/mconf 21 $< $(Kconfig)解析:scripts/kconfig/mconf Kconfig使用file命令查看scripts/kconfig目录下mconf文件的类型file scripts/kconfig/mconf可知mconf文件是一个elf可执行文件mconf根据内核源码顶层目录的Kconfig文件生成图形化界面的菜单选项配置界面。3. 打开内核源码顶层目录的Kconfig文件5 mainmenu "Linux/$ARCH $KERNELVERSION Kernel Configuration"6 7 config SRCARCH8 string9 option env="SRCARCH"10 11 source "arch/$SRCARCH/Kconfig" 解析: mainmenu : 主菜单语法格式:mainmenu "主菜单名字"source:包含下一级子菜单对应的Kconfig文件路径语法格式: source "下一级子菜单的Kconfig路径"打开arch/arm/目录下的Kconfig文件。Kconfig文件作用?Kconfig用于存放菜单选项的配置信息。1. 主菜单 包含:子菜单,菜单选项2. 子菜单:包含:子菜单,菜单选项3. 菜单选项
s5p6818/fs4418系统移植之uboot的移植相关推荐
- STM32MP157 Linux系统移植开发篇4: BootLoader(Uboot)移植
本文章为<STM32MP157 Linux系统移植开发篇>系列中的一篇,笔者使用的开发平台为华清远见FS-MP1A开发板(STM32MP157开发板).stm32mp157是ARM双核,2 ...
- 创客exynos-fs4412系统移植-(uboot,内核,文件系统)
fs4412系统移植学习笔记 环境: ubuntu 14.04 发行版 FS4412 实验平台 交叉编译工具:arm-none-linux-gnueabi- gcc: 4.8.5 目录 fs4412系 ...
- 全志h3linux移植教程,全志H3启动分析,移植主线UBOOT
全志H3启动分析,移植主线UBOOT 参考资源 启动流程 因为使用的是外扩SD卡,因此主要参考了这部分内容:Bootable SD card SD卡Layout如下: start sector siz ...
- uboot环境下mmc操作_【记录】将Uboot 2011.06中mmc驱动移植到uboot 1.1.6的过程
[记录]将Uboot 2011.06中mmc驱动移植到uboot 1.1.6的过程 时间:2011-8-14 作者:crifan 联系方式:green-waste (at) 163.com 附上代码: ...
- u-boot移植第三弹——移植2013.10u-boot到RealARM210 cortex-A8开发板(支持moviNAND_Fusing_Tool_v2.0)
在移植2012.10过程中遇到个麻烦的问题,到写这篇文章的时候还是没找原因在哪,导致无法正常运行.我遇到的问题如下:__bss_start和__bss_end__这两个地址无法正确得到地址,也就是bs ...
- Linux学习笔记---移植官方uboot步骤(二)
在上一篇 Linux学习笔记---移植官方uboot步骤(一) 自己的uboot已经编译成功了,接下来继续移植LCD驱动和网络驱动. 修改LCD驱动 修改配置参数 打开my_uboot/board/f ...
- Linux学习笔记---移植官方uboot步骤(一)
目录 编写shell脚本 修改MakeFile文件 重命名shell脚本 添加默认配置文件 修改默认配置文件 准备需要的板级文件夹 重命名.C文件 修改Makefile 修改imximage.cfg配 ...
- 图像识别DM8127开发攻略——UBOOT的移植说明
图像识别DM8127开发攻略--UBOOT的移植说明 根据前几篇文章的介绍,想必大家对DM8127软件架构有了全局的认识,下面我们从开发的角度进行裁剪移植最基本的BOOT软件包,嵌入式开发人员拿到一个 ...
- 嵌入式uboot移植之三星官方uboot开始移植
注:以下内容来自朱老师物联网课件 1. 移植前的准备工作 1.1 获取三星移植过的uboot源代码 我们使用的是老师提供的android_uboot_smdkv210.tar.bz2,文件存储在课件2 ...
- uboot的移植——移植uboot官方的uboot到x210开发板
以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除. 参考内容 uboot--官网下载直接移植(一) - biaohc - 博客园 uboot--官网下载直接移植(二) - biaohc - ...
最新文章
- Google工作10年,关于技术、管理和职场生涯的一些感悟
- 维护人员的VMware日常工作
- 抗锯齿_最好的抗锯齿,画质保留提升帧数
- lua把userdata写入mysql_Lua教程(十九):userdata
- Windows Server 2008 R2卸载干净ORACLE 11G
- c#中已知一个外部窗口的句柄,怎么关闭
- db2有MySQL那样的时间戳_MySQL 按照日期格式查询带有时间戳数据
- 多项式牛顿迭代(应用:求逆,开根,对数exp)
- 点击网页跟踪php代码的工具,使用ltrace工具跟踪PHP库函数调用的方法
- html checked属性值,HTML复选框的checked属性的值是多少?
- Windows Eclipse Maven 安装
- linux如何让普通用户有root权限
- win10无线投屏_Win10电脑屏幕分割成四分屏投屏测试
- oracle plsql 字符串长度,PLSQL SQL
- mysql2008安装失败_sql server 2008为什么会安装失败 sql2008安装失败解决办法
- 仿微信、qq聊天,@好友功能
- 微信接口返回码对照表
- Safari 手机浏览器无法下载的问题
- php日志写什么内容,Monolog-PHP日志类库介绍
- perforce(P4)常用命令(命令行)