s5pv210-kernel-从三星官方的内核开始移植

author author     2022-08-22     712

关键词:







1、拿到三星官方移植过的内核

2、在Linux下解压一份在共享目录下,解压一份在Linux的源生目录下。一份编辑,一份编译

3、建立SI工程,添加kernel源代码

4、在Linux下先看makefile中的CROSS_COMPINE交叉编译工具链和ARCH的架构对不对

5、在arch/arm/configs这个目录下找到和我们开发板最接近的一个配置,用这个配置文件,我们在kernel根目录下,make xx_defconfig这个配置文件,得到一个将这个配置文件的内容复制到.config的这个文件,在make menuconfig,退出后,在make -j2 我的Ubuntu是2个处理器,所以可以用2线程加速编译,编译好后,在uboot下用tftp命令下载到内存中,启动一下这个内核看下情况。


5、

(1)我们启动后发现,内核无法启动,并且第一句话都没有打印出来,就是那句解压代码运行的时候打印的信息都没有打印出来,

(2)所以问题就是出在了这里,但是解压代码是不可能出现问题的,因为解压代码是和架构无关的。

(3)所以问题出在内核配置中,配置解压代码将内核解压后,将内核放在哪里了,可能是解压代码解压后将内核放的内存位置不对导致的,这个是在内核配置中可以配置的

(4)内核配置的解压地址应该和内核的链接地址一样,否则自解压后内核是无法运行的。

所以要看内核的链接地址等于多少?内核配置的解压后的内核地址是多少

(5)但是这里面有个问题,就是,我们内核链接的地址是虚拟地址,而我们解压代码解压内核的时候需要的是物理地址,所以上面说的内核配置的解压后的地址的等于,应该是等于内核链接处虚拟地址对应的物理地址。

(6)所以我们要看我们的物理地址和虚拟地址分别是多少,内核链接的时候

在head.S中,虚拟地址找到 虚拟地址是 0XC0008000 物理地址是0X20008000。所以可以知道我们内核配置的自解压地址应该是0X30008000,

(7)自解压地址在mach/Makefile.boot中可以找到,但是这个文件中没有对应的我们开发板的宏中的地址,因为我们的物理地址是根据SMDKV210这个宏找的,所以我们要在这个文件中添加一个配置,配置信息如下:

# override for SMDKV210

zreladdr-$(CONFIG_MACH_SMDKV210) := 0x30008000

params_phys-$(CONFIG_MACH_SMDKV210) := 0x30000100

这里面还有内核参数的地址,都不对,解压地址需要弄成30008000,参数地址要弄成30000100,虽然这个文件中默认配置的解压地址是20008000,内核参数地址是20000100,并且内核物理链接地址在这个kernel中配置的也是20008000,但是因为我们DDR在uboot阶段初始化配置的时候,我们的DDR是从0X30000000-0X3FFFFFFF这段空间的,所以没有2开头的物理内存来用,在下载内核的时候我们也不能将内核下载到这个20008000地址去运行,所以是不行的,多以需要改成30008000,内核链接的物理地址,和解压的物理地址都要改成30008000



1、6、老朱插播的一节课,内核中机器码的确定

1、MACHINE_START宏

(1)这个宏是用来定义一个机器码的数据结构的

(2)在每一个mach-xxx.c的文件中,最后的位置都有一个这个宏,这个宏定义了这个开发板对应的机器码对应的数据结构,这个宏带的参数一个是tpye,一个是name,如果我们将这个宏解析开后,会发现一个是将MACH_TYPE_XXX(这个XXX用tpye这个参数替代了)的机器码,和对应的开发板的名字,并且这个宏将定义的这一个结构体变量放在了一个特定的段中,将我们通过和我们uboot中传递过来的机器码来在这个段中进行机器码的匹配,匹配到了就将这个机器码对应的结构体数据结构取出来准备进行使用。

(3)经过对arch/arm/mach-s5pv210/Makefile的分析,我们发现我们用的是mach-smdkc110.c这个开发板。所以这个文件才是我们值得关注的文件,

2、硬件驱动的加载和初始化函数执行

(4)这个宏中定义的那个结构体变量中,.init_machine = smdkc110_machine_init这个很重要,这个函数就是将来我们内核启动的时候,加载硬件驱动时的初始化函数,如果一旦找到了对应的机器码对应的结构体变量,就会把这个结构体变量拿出来使用,这个变量中的这个.init_machine = smdkc110_machine_init成员,在使用的时候,就会对硬件驱动加载。所以这个函数非常的重要。


分析:由于我们在这个文件machine-smdkc110.c中用那个宏定义了一个结构体变量,放在了特定段中,包含了开发板的机器码。开发板的名字。开发板对应的硬件驱动加载初始化函数的函数指针,这个函数是我们内核启动时初始化所有硬件,内核初始化硬件时打印的相关信息也是从这里打印出来的。

在我们的start_kernel这函数中,将uboot的bootargs参数分割成一个一个的项目,然后又将uboot中传过来的机器码在自己的那个特定段中进行匹配所对应的那个数据结构,这个循环匹配是最终搜索是在.S文件中用__loop去寻找的,并且返回了一个这个类型的结构体指针给一个结构体指针,在后来这个结构体中的那个关于初始化硬件,硬件驱动加载的那个函数就被调用了。所以对硬件驱动进行了加载。所以我们才能在内核启动的时候看到那么多的硬件信息




1、7、之前我们启动内核的时候,内核会重新启动,解决内核启动时的错误

1、认识内核启动OOPS

(1)内核启动时的致命信息就叫OOPS,内核死的原因就在这附近

(2)经过分析这两个错误信息提供了有效信息

PC is at dev_driver_string+0xc/0x44

LR is at max8698_pmic_probe+0x150/0x32c

(3)因为我们的x210开发板,没有这个max8698电源管理IC,而我们的内核中却配置了这个电源IC的驱动,所以会找不到硬件,所以会错误,我们只要在内核配置信息中,将这个配置信息去掉就行,利用make menuconfig,用/搜索max8698,将这项配置取消就行。












本文出自 “whylinux” 博客,请务必保留此出处http://whylinux.blog.51cto.com/10900429/1898803

从官方未修改的源代码编译 android 内核会导致损坏的结果

...ult【发布时间】:2021-03-2005:20:14【问题描述】:我已经从三星开源网站下载了我的三星GalaxyTabA2018(SM-T590)的内核源代码。我正在尝试使用存档中内核给出的指令编译未修改的源代码,但是生成的内核 查看详情

32163165(代码片段)

《2.uboot和系统移植-第17部分-2.17.内核的移植1-从三星官方内核开始移植》 欢迎访问《朱老师物联网大讲堂》官方网站 www.zhulaoshi.org 以获取本课程更多信息第一部分、章节目录2.17.1.内核移植初体验2.17.2.初步移植以看到启动... 查看详情

解决三星官方移植的内核默认是没有打开支持v4lusbdevices

   在linux比较新的kernel,都标配了各类摄像头的驱动支持,不用我们自己移植驱动,只需通过makemenuconfig配置内核支持我们所需的摄像头类型即可。以下是在三星官方内核中配置V4L类型摄像头的方法。   三... 查看详情

s5pv210|微处理器启动流程(代码片段)

...后转入BL1进行执行。BL1执行完成后,开始执行BL2,BL2加载内核,把OS在SDRAM中运行起来。S5PV210的启动顺序①iROM可以进行初 查看详情

platform总线驱动代码分析

/************************************************************************/Linux内核版本:2.6.35.7运行平台:三星s5pv210/************************************************************************/ 1、本例中通过使用Linux 查看详情

2内核的配置和移植(代码片段)

...用2.6.35.7版本的内核。这个版本的内核有三种:第一种是kernel.org上的官方版本,第二种是三星移植过的,第三种是九鼎X210的移植版本。我们讲课时使用第三种内核来讲解,后面的移植实验使用第二种内核来移植。源码在开发板... 查看详情

转:三星电子ceo:一切决策都要从认清自己开始

个人理解:面对不确定性局面的考验;面对未来,没有人可以未卜先知人生是需要不断做出决策的过程彻底分析当前的情况,做任何决策都要冷静,并且要基于自身环境只有对自己的实际情况先做出冷静判断&#... 查看详情

9.s5pv210的时钟系统

...内部的时钟划分为3大块,叫做3个域。(2)MSYS:CPU(Cortex-A8内核)、DRAM控制器(DMC0和DMC1)、IRAM&IROM······(3)DSYS:都是和视频显示、编解码等有 查看详情

从官方目录开始 magnolia 的项目原型

】从官方目录开始magnolia的项目原型【英文标题】:Startmagnolia\'sprojectarchetypefromofficialcatalog【发布时间】:2018-03-1408:15:04【问题描述】:场景1我正在按照officialdocumentation中描述的步骤进行操作,以便我从publiccatalog中选择了magnolia... 查看详情

如何在三星 Galaxy 平板电脑上开始远程调试?

】如何在三星Galaxy平板电脑上开始远程调试?【英文标题】:HowcanIstartremotedebuggingonasamsunggalaxytablet?【发布时间】:2014-06-0216:31:14【问题描述】:我有一个网络应用程序,需要针对平板电脑上的Chrome进行调整。我有一个三星GalaxyT... 查看详情

第二章开始内核开发

...那样。这儿有一些周转办法,但是他们是不完美的也没有官方支持。幸运的是,自从VisualStudio2012和WindowsDriverKit8之后,微软开始官方地使用VisualStudio构建驱动,不用再需要使用一个分离的编译器和构建工具。  为了能够开发驱... 查看详情

三星note3n900刷机包4.4.2zsudne3官方原汁原味稳定流畅

  ROM介绍  此ROM基于最新的4.4.2ZSUDNE3制作,加入一些必要功能,其它性能基本与官方无差距,各方面感觉都非常不错了。此ROM本人自用,所以制作风格有点个人倾向。不论什么建议或者问题欢迎大家前来反馈  ROM简单介绍... 查看详情

s5pv210-arm裸机-启动过程

...SD卡为启动介质,则先从SD卡启动介质中,读取16KB,BL1(官方说是可变的,但代码中是不可变的)到96KB的SRAM中运行。到此为止就是steppingstone技术。BL1是我们写的,是我事先写好放在外部的SD卡nand 查看详情

从内核模块中查找异常向量表的物理地址

...述】:我有一个Android设备-内核版本为2.6.35.14(armcortexa9)的三星Galaxys2我试图找到异常向量表的物理地址。我知道它位于0xffff0000虚拟地址。(我可以通过内核模块打印它 查看详情

s5pv210-arm-裸机-i2c

I2C协议,是同步的,串行通信方式。有两个线,一根SCLOCK时钟线,一根SDA数据线,时钟是右SOC提供的,SOC和外设用I2C通信时,使用的是一个时钟,数据线是两者传输信息用的。一般在通信的过程中,分为主设备和从设备,如果主... 查看详情

s5pv210-arm裸机-异常中的中断实现过程

...,CPU内部给了一个发生异常时的异常向量的基地址,查阅官方资料知道,这个基地址为0XD0037400,所以我们需 查看详情

三星exynos4412是arm内核吗

是ARM架构三星Exynos4412与此前双核时代的Exynos4212/4210并无区别,但其最大的改进除了新增两个Cortex-A9处理核心之外,还采用了与Exynos4212一样的32nm高-K金属栅极(HK/MG)低功耗制程工艺,单核心最高主频可达1.4GHz,并且支持双通道LPDDR2... 查看详情

嵌入式linux从入门到精通之第十五节:嵌入式系统简介

嵌入式系统的层级结构如下图所示:开发环境这里以三星s5pv210为开发环境:系统资源s5pv210是三星公司推出的32位RISC微处理器,其CPU采用的是ARMCortex-A8内核,基于ARMv7架构丰富的片内资源,为手持设备和其它移动领域应用,提供了... 查看详情