文章目录

  • uboot启动内核分析
  • 简单配置内核
  • 编译内核
  • 设置机器ID
  • 修改晶振

移植Linux3.4.2内核其他文章链接:

S3C2440移植linux3.4.2内核之内核框架介绍及简单修改

S3C2440移植linux3.4.2内核之修改分区以及制作根文件系统

S3C2440移植linux3.4.2内核之支持YAFFS文件系统

S3C2440移植linux3.4.2内核之内核裁剪

uboot启动内核分析

  进入cmd_bootm.c,找到对应的bootm命令对应的do_bootm():

int do_bootm(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{boot_os_fn *boot_fn;             //boot_fn是个数组函数... ..boot_fn(0, argc, argv, &images); //调用数组函数... ...
}

  boot_os_fn是个typedef型,如下图所示:

  由于定义了宏CONFIG_BOOTM_LINUX,最终会跳转到do_bootm ->do_bootm_linux()
  代码如下所示:

int do_bootm_linux(int flag, int argc, char *argv[], bootm_headers_t *images)
{/* No need for those on ARM */if (flag & BOOTM_STATE_OS_BD_T || flag & BOOTM_STATE_OS_CMDLINE)return -1;if (flag & BOOTM_STATE_OS_PREP) {boot_prep_linux(images);return 0;}if (flag & BOOTM_STATE_OS_GO) {boot_jump_linux(images);return 0;}boot_prep_linux(images);      //该函数会将各个tag参数保存在指定位置,比如:内存tag、bootargs环境变量tag、串口tag等boot_jump_linux(images);      //该函数会跳转到内核起始地址return 0;
}

  最终跳转到do_bootm ->do_bootm_linux-> boot_jump_linux()

static void boot_jump_linux(bootm_headers_t *images)
{unsigned long machid = gd->bd->bi_arch_number;     //获取机器IDchar *s;void (*kernel_entry)(int zero, int arch, uint params);unsigned long r2;kernel_entry = (void (*)(int, int, uint))images->ep;  //设置kernel_entry()的地址为0x30000000s = getenv("machid");                     //判断环境变量machid是否设置,若设置则使用环境变量里的值   if (s) {       strict_strtoul(s, 16, &machid);      //重新获取机器IDprintf("Using machid 0x%lx from environment\n", machid);  //使用环境变量的machid}... ...r2 = gd->bd->bi_boot_params;     //获取tag参数地址, gd->bd->bi_boot_params在setup_start_tag()函数里被设置 kernel_entry(0, machid, r2);     //跳转到0x30000000,r0=0,r1=机器ID,r2=tag参数地址
}

   上面的machid默认值为MACH_TYPE_SMDK2410(也就是193),我们也可以在环境变量里设置machid变量
最终,便跳到内核执行代码,步骤如下所示:
  1)根据R1(机器ID),来判断内核是否支持该机器,若支持则初始化机器相关函数
  2)解析TAG参数,初始化串口,设置内存等
  3)挂载根文件系统,并执行应用程序

简单配置内核

  修改Makefile,修改配置

tar xjf linux-3.4.2.tar.bz2
cd linux-3.4.2/
vi Makefile


  改为

ARCH            ?= arm
CROSS_COMPILE   ?= arm-linux-

  配置编译

cd arch/arm/configs                //由于我们板子是arm板,进入该目录
ls  *2440*                            //找到有mini2440_defconfig、
ls  *2410*                            //找到有s3c2410_defconfigcd ../../..
make s3c2410_defconfig                //配置2410, 更新.config配置文件
make uImage                          //编译,生成uImage
cp arch/arm/boot/uImage /work/nfs_root/           //拷贝
cd /work/nfs_root/
mv uImage uImage_new


  进入.config查看支持的CPU

vi .config


  如上图所示,有我们的2440

编译内核

make uImage

  报错如下

Can't use 'defined(@array)'(Maybe you should just omit the defined? )at kernel/timeconst pl line 373
/root/working/Hi3520D SDK V2.0.3.0/osdrv/kernel/linux-30y/kernel/Makefile:140
recipe for target kernel/timeconst h failed make【1】:*** 【kernel/timeconst h】 Error 255
Makefile:945:recipe for target kernel ' failed
【kernel】 Error 2

解决办法
  将 kernel/timeconst.pl中第373行的 defined0去掉只留下@val就可以了

vim kernel/timeconst.pl +373

  进入uboot烧写

nfs 32000000 192.168.2.106:/work/nfs_root/uImage_new
bootm 32000000

  如下图所示,发现串口输出乱码:

设置机器ID

  uboot传递进来的机器ID可以通过环境变量machid来设置
  所以任意设置一个ID,这样再次启动内核时,内核识别不出来,就会打印出所有设备对应的机器ID。下面开始测试机器ID是否正确,进入uboot,输入:

set machid 33333
tftp 32000000 uImage
bootm 32000000

  如下图所示,由于内核不支持这个机器ID,所以打印出内核能支持的ID表:

  ID所对应的文件为arch/arm/mach-s3c24xx/Mach-smdk2440.c

  MACHINE_START为一个结构体,根据不同的机器ID找到对应的MACHINE_START,调用初始化函数。
  由于我们板子是2440,所以测试7cf(mini2440)以及16a(smdk2440)这两个机器ID,是否支持我们开发板。
  但是依旧乱码,可能是波特率设置不正确。重新设置下环境变量的波特率

set bootargs root=/dev/mtdblock3 console=ttySAC0,115200

  再次烧写启动,发现7cf(mini2440)这个ID,有串口输出正常。下面看下16a(smdk2440)为什么串口乱码,进入mach-smdk2440.c( 位arch/arm/mach-s3c24xx)找到问题出在smdk2440_map_io():

static void __init smdk2440_map_io(void)
{s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));s3c24xx_init_clocks(16934400);             //初始化时钟clocks3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));
}

修改晶振

  由于我们板子上的晶振是12Mhz,而mdk2440_map_io()里,初始化的时钟是基于16934400hz的晶振。所以将:

s3c24xx_init_clocks(16934400);             //初始化时钟clock

  改为:

s3c24xx_init_clocks(12000000);             //初始化时钟clock

  然后重新编译uImage:

make  s3c2410_defconfig             //将mach-s3c2440.c配置进内核
make  uImage
cp uImage /work/nfs_root/ uImage_new

  进入uboot,输入:

set machid 16a
nfs 32000000 192.168.1.30:/work/nfs_root/uImage_new
bootm 32000000

  启动内核打印正常。

  下一节S3C2440移植linux3.4.2内核之修改分区以及制作根文件系统
我们将修改分区和制作根文件系统。

S3C2440移植linux3.4.2内核之内核框架介绍及简单修改相关推荐

  1. linux 3.4内核初始化,S3C2440移植linux3.4.2内核之内核框架介绍及简单修改

    @[TOC] uboot启动内核分析 进入cmd_bootm.c,找到对应的bootm命令对应的do_bootm():int do_bootm(cmd_tbl_t *cmdtp, int flag, ...

  2. 一、【s3c2440移植linux-3.5】移植准备

    (一)编译内核 1.修改Makefile book@ubuntu:~$ cd linux-3.5/ diff -urN linux-3.5/Makefile linux-3.5_s3c2440/Mak ...

  3. s3c2440移植Linux内核,移植Linux-3.4.2内核到S3C2440

    一.BootLoader引导内核过程 1.Bootloader的工作 1.1.将内核读入内存 1.2.保存内核启动参数到指定位置,内核启动时去这个位置解析参数 1.3.启动内核.传入机器ID 二.内核 ...

  4. linux3.4 内核裁剪,05-S3C2440学习之内核(移植)linux3.4.2移植(2)之yffs2文件系统移植+内核裁剪+内核制作补丁...

    一.移植YFFS2文件系统 yffs文件系统更加支持nand设备 上节移植了jffs2文件系统(点击查看)到移植的内核中,这节我们将yffs2文件系统移植到刚移植好的内核中. (1)获取源码并解压 g ...

  5. S3C2440移植Linux4.19.275内核以及过程中遇到的问题

    目录 1 问题一:内核移植时MTD分区问题 2 问题二:uboot的MTDPARTS_DEFAULT定义的MTD分区,bootargs中的文件系统分区,内核的mtd_partition smdk_de ...

  6. 移植基于linux-2.6.26.5内核s3c2410触摸屏驱动移植

    移植基于linux-2.6.26.5内核s3c2410触摸屏驱动移植的过程记录下来: (1)首先打一个补丁:s3c2410_touchscreen.patch, 在内核解压的根目录下 patch -N ...

  7. imx6ull移植Linux系统第二篇——Linux内核的移植

    imx6ull移植Linux系统第二篇--Linux内核的移植 花了大概两周的时间,把Linux的移植认真学了一遍,期间踩了不少坑,花费了不少时间去解决各种奇奇怪怪的问题,最终完成了uboot.系统镜 ...

  8. STM32MP157 Linux系统移植开发篇17:Linux内核摄像头驱动移植

    本文章为<STM32MP157 Linux系统移植开发篇>系列中的一篇,笔者使用的开发平台为华清远见FS-MP1A开发板(STM32MP157开发板).stm32mp157是ARM双核,2 ...

  9. STM32MP157 Linux系统移植开发篇14:Linux内核RGB LCD驱动移植

    本文章为<STM32MP157 Linux系统移植开发篇>系列中的一篇,笔者使用的开发平台为华清远见FS-MP1A开发板(STM32MP157开发板).stm32mp157是ARM双核,2 ...

最新文章

  1. as3直接播放flv基本代码
  2. 提取某个符合条件的字符串中的中文字符 例子
  3. 构造函数中的虚拟成员调用
  4. Ubuntu 14.04下 Redis MongoDB安装及使用
  5. asp.net学习笔记·将数据库中的数据保存在EXCEL文件中
  6. 二叉树的层序遍历 使用队列和不使用队列
  7. Spin Control (上下控件)
  8. mysql创建存储时覆盖_总结到位的MySQL 的覆盖索引与回表
  9. foss测试_FOSS的业务真的是社区软件吗?
  10. POJ 2993 Emag eht htiw Em Pleh(模拟)
  11. python自学行吗-《》 python自学行吗?
  12. 积化和差公式记忆口诀
  13. 【BZOJ4200】【LOJ2134】【NOI2015】小园丁与老司机(DP,有源汇上下界最小流)
  14. 京东获取商品历史价格信息 API 返回值说明
  15. 协调世界时转换为GPS周秒(转载)
  16. python爬取bili指定up主的视频
  17. Oracle数据库实验四查询实验三(Oracle 11g)
  18. Linux 用户和用户组详解
  19. Linux下载hfs文件,linux读写mac HFS+
  20. campaign 缩写_Campaign Monitor的画布:简化电子邮件设计

热门文章

  1. Win11游戏模式怎么开启?Win11开启游戏模式的方法
  2. BZOJ4200 洛谷2304 UOJ132:[NOI2015]小园丁与老司机——题解
  3. 手写实现数据库连接池
  4. oppor11st升Android p,OPPO R11st刷机教程_OPPO R11st卡刷升级更新官方系统包
  5. cocos2d lua 环境搭建
  6. 含并行连结的网络 GoogLeNet / Inception V3 动手学深度学习v2 pytorch
  7. Android 应用的逆向和审计
  8. java如何避免恶意连续点击_浅谈一下如何避免用户多次点击造成的多次请求
  9. Flutter开发:给image设置圆角的方法
  10. 汽车电子触摸屏产品EMC设计要领