图 1.3 搜索的显现          图 1.4,我是豹哥

图 1.1 启动时的 App 表现           图 1.2 下拉刷新之后的显现

二、解析linker文件

  知道了section概念,这便可起始深入通晓linker文件,什么是linker文件?linker文件是按IDE规定的语法写成的用来提示链接器分配各section在嵌入式系统存储器中存放地方的文本。我们都知情嵌入式系统存储器首要分为两类:ROM(非易失性),RAM(易失性),所以相应的这一个section依照存放的存储器地方不同也分为两类性质:readonly,
readwrite。实际上linker文件的干活就是将readonly
section放进ROM,readwrite section放进RAM。
  那么到底该如何编写工程的linker文件呢?正如前方所言,linker文件也是有语法的,而且那语法是由IDE指定的,所以必须要先通晓IDE制定的语法规则,linker文件语法规则相对简单,最常用的重要字就是之类8个:

// 动词类关键字
define                // 定义各种空间范围、长度
initialize            // 设置section初始化方法
place in              // 放置section于某region中(具体地址由链接器分配)
place at              // 放置section于某绝对地址处

// 名词类关键字
symbol                // 各种空间范围、长度的标识
memory                // 整个ARM内存空间的标识
region                // 在整个ARM内存空间中划分某region空间的标识
block                 // 多个section的集合块的标识

Note:上述linker语法的详实表明请查阅IAR软件安装目录下\IAR
Systems\Embedded Workbench
xxx\arm\doc\EWARM_DevelopmentGuide.ENU.pdf文档里的The linker
configuration file一节。

  到此地我们早就得以起来喜欢地写linker文件了,是不是有点按捺不住了?来吗,只需要三步走,Let’s
do it。
  此处假如MCU物理空间为:ROM(0x0 – 0x1ffff)、RAM(0x10000000 –
0x1000ffff),豹哥要写的linker要求如下:

  • 停顿向量表必须放置于ROM先河地址0x0,且务必256字节对齐
  • STACK大小为8KB,HEAP大小为1KB,且必须8字节对齐
  • SATCK必须放置在RAM开始地址0x10000000
  • 另外section放置在不利的region里,具体空间由链接器自动分配

烧写测试时,由于新的uboot较大,能够采取nor上的旧uboot,通过DNW烧写新的uboot到nor下边.

俺们来探视他们是怎么说的。

番外一、自定义section

  有耐心看到此间的爱侣,豹哥必须得放个大招奖励一下,前面讲的都是怎么处理体系默认段,那么有没有可能在代码里自定义段呢?想象一下你有如此的急需,你需要在您的采取里开发一块1KB的可更新的数据区,你想把那些数据区指定到地址0x18000

  • 0x183ff的范围内,你需要在行使里定义4 Byte的只读config
    block常量指向那些可更新数据区首地址(这段config
    block只会被外表debugger或者bootloader更新),如何完成?

    // C文件中
    /////////////////////////////////////////////////////
    // 用@操作符指定变量myConfigBlock[4]放进自定义.myBuffer section
    const uint8_t myConfigBlock[4] @ “.myBuffer” = {0x00, 0x01, 0x02, 0x03};

    // Linker文件中
    /////////////////////////////////////////////////////
    // 自定义指定的mySection_region,并把.myBuffer放到那么些region
    define region mySection_region = mem:[from 0x0x18000 to 0x183ff];
    place at start of mySection_region { readonly section .myBuffer };

  下面做到了将代码中的常量放入自定义段?,那么怎么将代码中的函数也放进自定义段呢?继续看下来

// C文件中
/////////////////////////////////////////////////////
// 用#pragma location指定函数myFunction()放进自定义.myTask section
#pragma location = ".myTask"
void myFunction(void)
{
    __NOP();
}

// Linker文件中
/////////////////////////////////////////////////////
// 把.myTask放到mySection_region
place in mySection_region { readonly section .myTask };

  看起来大功告成了,最终还有一个注意事项,假使myConfigBlock在代码中没有被引述,IDE在链接的时候也许会忽视这一个变量(IDE认为它没用,所以优化了),那么怎么让IDE强制链接myConfigBlock呢?IAR留了个后门,在options->Linker->Input选项卡中的Keep
symbols输入框里填入你想强制链接的目的名(注意是代码中的对象名,而非linker文件中的自定义段名)即可。

Note:关于番外内容的更多细节请查阅IAR软件安装目录下\IAR
Systems\Embedded Workbench
xxx\arm\doc\EWARM_DevelopmentGuide.ENU.pdf文档里的Pragma
directives一节。

  至此,嵌入式开发里的linker文件豹哥便介绍完毕了,掌声在什么地方~~~

cd ../../include/configs/
cp smdk2410.h smdk2440.h

SafeArea

iOS 11 放弃了 iOS 7 之后出现的
topLayoutGuide/bottomLayoutGuide,取而代之的是safeLayoutGuide
概念。大家的UI元素都应该布局在这些区域之内,避免被各样bar(NavgationBar、ToolBar、TabBar、StatusBar)遮挡。

图片 1图片 2

图2.8 iPhone 的 SafeArea

假设咱们用了 AutoLayout,并且打开了
safeAreaLayoutGuide,布局会活动抬高那个safeLayoutGuide,你的视图不会领先这部分
SafeArea。如2.9所示,假使您需要扩张 Guide 的区域,那么可以安装
self.additionalSafeAreaInsets 来扩张区域。

图片 3图片 4

图 2.9 默认的 SafeArea 和 self.additionalSafeAreaInsets =
UIEdgeInsetsMake(64, 0, 0, 0);

  我们好,我是豹哥,猎豹的豹,犀利哥的哥。明天豹哥给我们讲的是嵌入式开发里的linker文件

添加后,就可以运用make smdk2440_config命令.

其他

还有其他的有些改成,比如图片的 Aspect Ratio 在 三星 X
上的显示也会齐轨连辔了;

刘海两边的区域都能响应不同的手势,最好不要和和气的 App 暴发顶牛。

2.3 安置section集合

  第三步便是处理放置这些section集合块了,在停放集合块此前还有initialize
manually语句,为何会有这多少个讲话?依旧得结合前边提及的startup.c文件里的init_data_bss()函数来说,这么些函数是开发者自己实现的data,bss段的先河化,所以这里需要通告IDE,你不需要再帮我做先河化工作了。

// 设置初始化方法
initialize manually { readwrite };
initialize manually { section .data};
initialize manually { section .textrw };
do not initialize   { section .noinit };

// 放置section集合块
place at start of ROM_region { block Vectors };
//place at address mem:__ICFEDIT_intvec_start__ { block Vectors };
place in ROM_region          { block ApplicationFlash };
place in RAM_region          { block ApplicationRam };
place in STACK_region        { block CSTACK };

  当然假若你指望IDE帮你活动初叶化data,bss,textrw段,那么可以用下边语句替换initialize
manually语句。

initialize by copy { readwrite, section .textrw };

  设置好开端化方法后,便是停放section集合块了,放置形式主要有两种,place
in和place
at,前者用于指定空间块放置(不点名具体地址),后者是点名具体地址放置。

  至此一个主干的linker文件便大功告成了,是不是so easy?

nand启动便实现形成了,上边的Flash: ***
failed ***
是属于uboot第二品级函数board_init_r()里的代码,表示不扶助nor
flash,不可能兑现读,写,擦除等一声令下

图片 5图片 6

  在前一节课source文件里,豹哥给我们系统地介绍了source文件,source文件是嵌入式工程里独占鳌头的input文件,那么还有没有其他门类的input文件?既然豹哥这么提问了,这答案自然是有啊。先天豹哥要讲的linker文件就属于另一种input文件。
  linker文件顾名思义就是嵌入式工程在链接阶段所要用到的文件,source文件在编译过程做到之后(此时已经是机器可识其余二进制机器码数据),需要再经过链接器从而将二进制数据有序协会起来形成最后的二进制可执行文件,该二进制文件最后会被下载进芯片内部非易失性存储器里。linker文件就是用来指示链接器怎么样协会编译生成的二进制数据。
  linker文件是跟IDE息息相关的,本文以IAR
EWARM为例介绍linker文件,其他IDE下的linker文件可触类旁通。

   
   ldr pc,=call_board_init_f                
//相对跳转,跳到SDRAM上执行

在图1.1中乍一看表现还不易,然而在图1.2中,下拉刷新之后,大家的导航栏仍旧被刘海挡住了。搜索也中枪,搜索首页没有章程撤除,“热门搜索区域”也多出去一起空荡荡。其它,“我的Tab”页部分如图1.3、图1.4所示,导航栏回不去了,右上角的两个UIBarButtonItem也有失了。其他还有许多UI上的Bug,等着我们去挨家挨户发现并修改。


arch/arm/config.mk:75:LDFLAGS_u-boot += -pie             // LDFLAGS: arm-linux-ld的参数

来自Session 201的建议

① xib 里适配 Motorola X 的话,可以开启 UseSafeAreaLayoutGuides(但这需要在
iOS 9 之后才能用,需要看您的 App 最低匡助的本子)。

图片 7

图3.1 xib 属性

② 即便用的类别 SearchViewController,发现没有绿色蒙层了,可以这样试试。

图片 8

图3.2 iOS 11 UISearchViewController适配

因而得以这样改,是因为 iOS 11 的 NavigationBar 和 SearchViewController
集成在联合了。

③ 横屏下的 UITableView,SenctionHeader 的背景颜色不是安装的充裕颜色。

图片 9

图3.3 iOS 11 横屏 Tableview 的功力情势

这多少个题指标案由是:横屏下的 UITableView,Cell 都是和屏幕一样宽,但是Cell 的 ContentView 会被 inset 到 SafeArea 区域。
釜底抽薪办法是:可以通过调整 Tableview 的默认行为,改变 contentView
的习性(如上图 inset To SafeArea)来让 contentview
顶到边缘,弊端是会转移总体 cell 的始末呈现,而且 contentView 的
layoutMargin 依旧如故相对于 SafeArea 的。
至上方案是:改变 UITableViewHeaderFooterView.backgroundView 的
backgroundColor。

图片 10图片 11

图3.4 iOS 11 修改前后的体裁比较

2.2 定义section集合

  第二步是自定义section集合块,细心的爱侣可以看到左边花括号里带有的都是上一节介绍的类别默认section,我们会把拥有相同属性的section集合成到一个block里,方便下一步的放置工作。

// 定义堆栈块及其属性
define block CSTACK    with alignment = 8, size = __ICFEDIT_size_cstack__   { };
define block HEAP      with alignment = 8, size = __ICFEDIT_size_heap__     { };

// 定义section集合块
define block Vectors with alignment=256 { readonly section .intvec };
define block CodeRelocate               { section .textrw_init };
define block CodeRelocateRam            { section .textrw };
define block ApplicationFlash           { readonly, block CodeRelocate };
define block ApplicationRam             { readwrite, block CodeRelocateRam, block HEAP };

  有意中人可能会疑窦,为什么要定义CodeRelocate、CodeRelocateRam这六个block?按道理说这六个block对应的section能够分别放进ApplicationFlash和ApplicationRam,这干什么多此一举?仔细翻阅过豹哥前一篇著作source文件详解的仇敌一定就知道答案了,在这篇小说里介绍的startup.c文件里有一个叫init_data_bss()的函数,这么些函数会成功开端化CodeRelocateRam块的效率,它找寻的就是CodeRelocate段名字,这个名字比系统默认的textrw名字看起来更清晰易懂。

libsmdk2440.o是将smdk2440单板目录下的享有*.c,*S文件编译后,连接成一个库文件.

布局

注意图2.2绿色部分,你会发觉那个都算在了展现内容的区域。所以咱们在统筹的时候,要避免内容被圆角、刘海给挡住。Like
this:

图片 12

图 2.3 CGRectMake(0,0,100,100)

红米 X 的坐标体系以及能展现内容的区域如下图所示:

图片 13

图 2.4 摩托罗拉 X 的突显区域

2.1 定义物理空间

  第一步我们先定义3块互不重叠的长空ROM_region、RAM_region、STACK_region,其中ROM_region对应的是动真格的的ROM空间,RAM_region和STACK_region组合成真实的RAM空间。

// 定义物理空间边界
define symbol __ICFEDIT_region_ROM_start__ = 0x00000000;
define symbol __ICFEDIT_region_ROM_end__   = __ICFEDIT_region_ROM_start__ + (128*1024 - 1);
define symbol __ICFEDIT_region_RAM_start__ = 0x10000000;
define symbol __ICFEDIT_region_RAM_end__   = __ICFEDIT_region_RAM_start__ + (64*1024 - 1);
define symbol __ICFEDIT_intvec_start__     = __ICFEDIT_region_ROM_start__;

// 定义堆栈长度
define symbol __ICFEDIT_size_cstack__      = (8*1024);
define symbol __ICFEDIT_size_heap__        = (1*1024);

// 定义各region具体空间范围
define memory mem with size = 4G;
define region ROM_region    = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__];
define region STACK_region  = mem:[from __ICFEDIT_region_RAM_start__ to  __ICFEDIT_region_RAM_start__ + __ICFEDIT_size_cstack__ - 1];
define region RAM_region    = mem:[from __ICFEDIT_region_RAM_start__ + __ICFEDIT_size_cstack__  to __ICFEDIT_region_RAM_end__];

图片 14

小米 X
刘海机于二月13日发布,给科技小春晚带来一波高潮。作为开发人士却多出来一份忧虑,三星X 怎么适配?我们 App 的头部会不会也长一刘海出来?Tabbar
会不会被圆角?先来看一下美团 App 的变现:

一、 嵌入式系统中的section

  在讲linker文件从前,豹哥必须先跟我们清理一个嵌入式系统中很重点的定义-section。那么如何是section?大家写的C或者汇编source文件里都是各个应用代码,这么些代码按职能可以分为很多类型,比如常量、变量、函数、堆栈等,而同一类此外代码的聚合便是一个section,链接器在链接时社团数量的中坚单元便是section。那么一个压倒一切的嵌入式系统中到底有多少种section呢?下边列出了IAR里默认的拥有section,那么些常见section在继承介绍linker文件里会被提到。

//常见Section
.bss                 // Holds zero-initialized static and global variables.
CSTACK               // Holds the stack used by C or C++ programs.
.data                // Holds static and global initialized variables.
.data_init           // Holds initial values for .data sections when the linker directive initialize is used.
HEAP                 // Holds the heap used for dynamically allocated data.
.intvec              // Holds the reset vector table
.noinit              // Holds __no_init static and global variables.
.rodata              // Holds constant data.
.text                // Holds the program code.
.textrw              // Holds __ramfunc declared program code.
.textrw_init         // Holds initializers for the .textrw declared section.

//较冷僻Section
.exc.text            // Holds exception-related code.
__iar_tls.$$DATA     // Holds initial values for TLS variables.
.iar.dynexit         // Holds the atexit table.
.init_array          // Holds a table of dynamic initialization functions.
IRQ_STACK            // Holds the stack for interrupt requests, IRQ, and exceptions.
.preinit_array       // Holds a table of dynamic initialization functions.
.prepreinit_array    // Holds a table of dynamic initialization functions.
Veneer$$CMSE         // Holds secure gateway veneers.

//更冷僻Section
.debug               // Contains debug information in the DWARF format
.iar.debug           // Contains supplemental debug information in an IAR format
.comment             // Contains the tools and command lines used for building the file
.rel or .rela        // Contains ELF relocation information
.symtab              // Contains the symbol table for a file
.strtab              // Contains the names of the symbol in the symbol table
.shstrtab            // Contains the names of the sections.

Note:上述section的详细分解请查阅IAR软件设置目录下\IAR
Systems\Embedded Workbench
xxx\arm\doc\EWARM_DevelopmentGuide.ENU.pdf文档里的Section
reference一节。

累加以下带粉红色的字段:

屏幕底边

因为从没了 Home 键,摩托罗拉 X 的平底是预留给系统效能的一个区域 – Home
Indicator,这部分的莫大是34pt。

图片 15

图 2.6 iPhone X 的 Home Indicator 区域

“固然您的平底是 TabBar,那么 Home Indicator 背景会来自于 TabBar
背景的延伸,假若大家是一个 feed 流的页面,那么底部会来得 feed
流的有的。”

趣味是一旦有 TabBar,那么这些区域会延展你的
barTintColor;没有的话,就显示透明的(参照
Setting)。之所以这样设计,是为了让 indicator
清晰可见,告诉用户你可以滑动这有的区域。所以苹果不提议我们的 UI
元素过于接近这一部分区域。

图片 16

图 2.7 有 TabBar 的 Home Indicator 区

      
ldr r1,_TEXT_BASE          //_TEXT_BASE : 0x33f00000

Status Bar

中兴 X 上的 StatusBar 中度比此前的 黑莓高一些,也就是说,我们假诺写死20pt中度的 frame
布局,都要大面积修(tu)改(xue)。在 One plus X 上,通过打印
[[UIApplication sharedApplication] statusBarFrame]
可以看到,低度是44pt。

图片 17

图 2.5 红米 X 的景色栏低度

“假诺你的 App 是隐藏 StatusBar 的,提议重新考虑。黑莓 X
为用户在笔直空间上提供了更多展示余地,且情状栏中也饱含了用户需要知道的音信,除非能经过隐藏状态栏带给用户额外的价值,否则苹果提议大家将气象栏还给用户。”

除此以外还有某些,用户在采纳 金立 X 打电话的时候,StatusBar
的可观也不会发生变化了。

把start.S, init.c(实现重从来),
lowlevel.S(实现起初化SDRAM)等公事放在最前方

针对可能现身的题材,苹果在 developer.apple.com 上付出了部分指出。其中一个是 HIG
(Human Interface
Guideline)
。此外WWDC 会议官方 App
的作者,也付出了适配时的一对经验

7.4改动链接脚本

刘海打理初体验


大家来看下起初说的不得了刷新之后首页顶上去的问题怎么处理。经过排查,这么些题材属于“状态栏变高体系”,解决方案就是把稳定的20pt低度改成 [[UIApplication
sharedApplication] statusBarFrame].size.height]

② 搜索页面输入框的职位爆发了偏移,这是因为 iOS 11
的导航栏的视图层级结构暴发了变动,和 一加 X 的并无直接关系。iOS 11
导航栏的视图层级关系如下:

图片 18图片 19

图4.1 iOS 11 之后的 NavigationBar     图4.2 iOS 11 之前的 NavigationBar

适配情势是:取到那个 _UIButtonBarStackView
的职务和尺寸信息,然后更改 PFBNavigationBarContainerView 的 X 坐标。

③ “我的Tab” 页面多出去一起绿色的区域,经过排查发现那个是 Tableview
的背景观。也就是说其实是 Tableview 向下偏移了。

图片 20

图4.3 iOS11 下“我的Tab” 页面 Tableview 暴发偏移

出现那些的案由是:iOS 11 之后 scrollview 多出来一个
adjustedContentInset 区域。

图片 21

图 4.4 iOS 11下 ScrollView 的新属性

通过打印那一个值,咱们发现正好和 contentoffset.y 相符合。

图片 22

图 4.5 这些新属性在 金立 X 上的值

这干什么会爆发偏移?这些偏移的值又是怎么规定的?实际上是当 Tableview 的
frame 超出了 safeArea 范围之后,系统会调动内容的岗位。系统通过安装
adjustedContentInset 为 safeAreaInset 的值让 Tableview 偏移

图片 23

图 4.6 iPhone X 上 safeAreaInset 的值

留意一下以此 adjustedContentInset 是 readOnly
的性质。大家能够透过安装 Tableview.contentInsetAdjustmentBehavior=UIScrollViewContentInsetAdjustmentNever 来纠正那些地方。当然还足以透过安装
tableview.contentOffset 来抵消那一个值,但要么引进第一种。

④ “我的Tab”
导航栏上,左边这么些按钮全都爆发了偏移,导致不能点击。这些题材也是在新的导航栏结构视图下会并发,原因是新的导航栏结构用了
AutoLayout 布局,大家以此并不是用常规的 UIBarButtonItem
情势实现的,而是一个 UIBarButtonItem ,他的 customView 包含了四个Button,这个 Button 都是 frame 布局,从而导致了在 AutoLayout
下的布局问题。

常规的解决形式是:修改成一个一个添加 UIBarButtonItem 和
UIBarButtonSystemItemFixedSpace。不过这么引出来此外一个题目,iOS 11
从前这种设置负宽度的 fixedspace 来调整间距的 trick
情势已经失效了!详情见https://forums.developer.apple.com/thread/80075

大家这边的法门是:依旧用那种一个 CustomView 里含有多个 CustomButton
的不二法门,然后分别增长约束。CustomView 只需要添加宽高,包含的 Button 加上
left、top 和 size。

图片 24

图 4.7 加约束修正后样式

以下是尝试修复这一部分问题的代码:

// offset 问题
if (@available(iOS 11.0, *)) {
        self.contentViewController.tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
    }
// UIBarButtonItem 问题
if (@available(iOS 11.0, *)) {
        [messageButtonsContainerView mas_makeConstraints:^(MASConstraintMaker *make) {
            make.size.mas_equalTo(CGSizeMake(themeButton.width + settingButton.width + messageButton.width, 44));
        }];
        [themeButton mas_makeConstraints:^(MASConstraintMaker *make) {
            make.top.equalTo(messageButtonsContainerView);
            make.left.equalTo(messageButtonsContainerView);
            make.size.mas_offset(CGSizeMake(44, 44));
        }];
        [settingButton mas_makeConstraints:^(MASConstraintMaker *make) {
            make.top.equalTo(messageButtonsContainerView);
            make.left.equalTo(themeButton.mas_right);
            make.size.mas_offset(CGSizeMake(44, 44));
        }];
        [messageButton mas_makeConstraints:^(MASConstraintMaker *make) {
            make.top.equalTo(messageButtonsContainerView);
            make.left.equalTo(settingButton.mas_right).offset(-10);
            make.size.mas_offset(CGSizeMake(44, 44));
        }];
    }

    UIBarButtonItem *rightBarItem = [[UIBarButtonItem alloc] initWithCustomView:messageButtonsContainerView];
    self.navigationItem.rightBarButtonItems = @[rightBarItem];

 

HIG部分

首先看一下顺序机型尺寸的变型。

图片 25

图 2.1 各版本 iPhone 的尺寸

下图是 vivo X 相比其他机型的更动部分。OPPO X 和 Nokia 8
的增长率一致,在笔直方向上多了145pt,那就表示首页可以显示更多的内容,多出去的这20%的垂直空间,也许可以挂上更高价值的运营位。

图片 26

图2.2 HTC X 和其他装备的尺码相比

(该命令便会调用include/configs/smdk2440.h和board/samsung/smdk2440里的文书来布局uboot)

总结

眼前意识这多少个题指标条件是 Xcode 9
GM版本(9A235)的模拟器。归纳起来是三类问题:

  1. StatusBar 变高而且相对布局。
  2. 导航栏的视图层级结构暴发变化而致使 UI(titleView、UIBarButtonItem)
    问题。(One plus 6s iOS 11 上依然是旧的布局,是因为现在 AppStore
    上的包依然是用 iOS 10 的 SDK 打出去的)。
  3. safeAreaInset 导致 Scrollview 偏移。

至于 Tabbar
,因为我们用的是系统的,所以近期并不曾发现什么意外的地方。希望大家踩的那些坑可以让各位在适配的历程中少走一些弯路!

 

源:https://tech.meituan.com/iPhoneX%E5%88%98%E6%B5%B7%E6%89%93%E7%90%86%E6%8C%87%E5%8C%97.html

      
ldr r2,_bss_start_ofs       // _bss_start_ofs:  __bss_start –
_start   (有效代码大小)

图片 27图片 28

       /*重定位                         
*/

图 1.3 搜索的表现          图 1.4 “我的Tab”表现

添加以下带肉色的字段:

1.先是在uboot里新建单板2440

 图片 29

7.接下来便修改uboot,实现NAND启动

如上图所示,我们向来来遮掩CONFIG_CMD_NAND宏即可,因为该宏下的#ifdef,都是与2410相关的

 

/* void relocate_code (addr_sp, gd, addr_moni)*/
.globl      relocate_code
relocate_code:

       mov r4, r0      /* save addr_sp */       
       mov    sp, r4
       mov r0, r1      /* save addr of gd */
       mov r1, r2      /* save addr of destination */
       bl   board_init_r        //进入uboot第二阶段代码

出于我们一直不配备CONFIG_S3C2440宏,所以uboot获取HCLK时钟设置波特率时,用的是CONFIG_S3C2410宏的法门

接下来将smdk2440下的smdk2410.c改为smdk2440.c,以及修改更改好的Makefile 

       
{

然后将smdk2440.h的CONFIG_S3C2410宏 改为:
CONFIG_S3C2440宏

动用JTAG调试时,发现向0x30000000地点上写值出错

       bl   
board_init_f

      
bic   sp, sp, #7                                                   /*
8-byte alignment for ABI compliance */

 并修改board\samsung\smdk2440\Smdk2440.c里的board_early_init_f()函数,屏蔽对MPLLDIVN,
LOCKTIME寄存器的装置(该函数被start.S->board_init_f()调用,这么些寄存器在眼前已被装置)

      
ldr   sp, =(CONFIG_SYS_INIT_SP_ADDR)         
//等于0x30000f80

 

      
mov r0,#0                         //r0->src

上面的_TEXT_BASE,在start.S靠前处定义:

3.修改uboot系统时钟

 

鉴于nand启动时,2440未起初化从前唯有前4K可读写,所以将重一向代码放在start.S的cpu_init_crit(初始化SDRAM)段后面

从上图可以见见,只有定义了CONFIG_S3C2410宏,才能博取该结构体,而我辈6.1小节里,使用的是CONFIG_S3C2440宏。

 

       /*
        * reserve memory for U-Boot code, data & bss
        * round down to next 4 kB limit
        */

       //addr -= gd->mon_len;                     //屏蔽该行
       //addr &= ~(4096 - 1);                     //屏蔽该行

     addr=CONFIG_SYS_TEXT_BASE;           //0x33f00000,添加该行     

从而修改board_init_f()函数的第113行:

usb 1 30000000                             //先下载到SDRAM上

nand erase 0  0x80000                      //擦除512kb,必须大于新的uboot

nand write 30000000   0  0x80000           //将SDRAM上的新uboot写入nand中

使用grep
“\-pie” * -nR
找到:

 图片 30

make时,发现以下多少个error:

烧写完成后,重启,通过JTAG调试的读地址命令,
判断是否与新uboot文件一律

 图片 31

改为:

将board\samsung\smdk2440\lowlevel_init.S里SMRDATA符号下:

               
*(.text)

               
__image_copy_start = .;

仿照

7.3修改board_init_f()函数(位于arch/arm/lib/board.c)

改为:

步骤:

      
bl copy_code_to_sdram  
  //复制代码到SDRAM连接地址dest上(参考自制uboot章节)

board_init_r地点处的代码,改为如下所示:

4)重定位写在前边了,所以我们还要删除start.S前面的relocate_code重定位段,清除BSS段

SMRDATA:
    .word (0+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+(B4_BWSCON<<16)+(B5_BWSCON<<20)+(B6_BWSCON<<24)+(B7_BWSCON<<28))
    .word ((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC))
    .word ((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC))
    .word ((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC))
    .word ((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC))
    .word ((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC))
    .word ((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC))
    .word ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN))
    .word ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN))
    .word ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT)
    .word 0x32
    .word 0x30
    .word 0x30

其中nand是一个s3c2410_nand结构体:

smdk2440                     arm        
arm920t     –                   samsung        s3c24x0

7.1去掉
“-pie”选项

1.2 将2410的头文件拷贝成2440:

smdk2410                     arm        
arm920t     –                   samsung        s3c24x0

添加:

       ldr  
r0,=0x00000000

 图片 32

 图片 33

        .text
:

7.2参阅以前自制uboot使用的start.S,
init.c来修改uboot代码

#endif

  • 上章分析了uboot启动流程后,接下去便来安排新的单板,实现nor、nand启动

6.1进入arch\arm\cpu\arm920t\s3c24x0\Speed.c下的get_HCLK
()函数:

 

      ldr   r0, =CLKDIVN
      mov r1, #3
      str   r1, [r0] 

从而屏蔽arch/arm/config.mk文件的”LDFLAGS_u-boot += -pie”这行即可


 图片 34

 

意识无乱码了,表示nor启动成功,其中Flash:
*** failed
***表示不援助norflash,因为大家只兑现了重一直,并不曾对nor实现写擦除等一声令下。

#define S3C2440_MPLL_400MHZ     ((0x5c<<12)|(0x01<<4)|(0x01))   //设置FCLK=400MHZ
#define MPLLCON                          0x4C000004            //设置FCLK频率

       ldr r0,=0x4C000014
       mov r1,#5                  /*FCLK:HCLK:PCLK=1:4:8  (400M:100M:50M)*/
       str r1,[r0]       

       mrc  p15, 0, r1, c1, c0                 /* 读出控制寄存器 */  
       orr   r1, r1, #0xc0000000              /* 设置为“asynchronous bus mode” */
       mcr    p15, 0, r1, c1, c0, 0             /* 写入控制寄存器 */     

       ldr r0,=MPLLCON
       ldr r1,=S3C2440_MPLL_400MHZ      
       str r1,[r0]

     . =
ALIGN(4);

6.2编译测试

烧写后,如下图所示:

 

2.新建后,还需要修改boards.cfg,使uboot扶助2440单板:

新的uboot链接地址位于0,且在arm-linux-ld时加了“-pie”选项,
使得u-boot.bin里多了”*(.rel*)”,
“*(.dynsym)”,从而程序很是大,不便民从NAND启动(重从来以前的启航代码应该少于4K).

 

3)屏蔽include/configs/smdk2440.h下的CONFIG_CMD_NAND宏定义

在start.S里,uboot只设置了CLKDIVN寄存器

 

双重烧写进norflash,打印如下图所示:

       bl   
cpu_init_crit

 图片 35

该结构体如下所示:

cd board/samsung/
cp smdk2410 smdk2440 -rf                //拷贝文件夹,

5.接下来便修改bank寄存器

call_board_init_f:

而2440的系列时钟需要设置五个寄存器:MPLLDIVN(设置FCLK频率)、CLKDIVN(设置分频比例),且还要设为异步格局

搜索CONFIG_S3C2410宏,找到位于smdk2440.h:

 

8.然后通过旧的uboot,将新的uboot烧写到nand

vi arch/arm/cpu/u-boot.lds

如上图所示,需要去掉CONFIG_NAND_S3C2410宏定义才行

      
bl clear_bss                        
//清除bss段(参考自制uboot章节)

是因为它座落靠前处,保证了_TEXT_BASE存在前4k空间里,若直接使用ldr
r1,=CONFIG_SYS_TEXT_BASE,编译器可能会将这么些宏定义放在SDRAM上,则会出错

               
CPUDIR/start.o (.text)             
//CPUDIR为arch/arm/cpu/arm920t目录

6.3之所以就一贯去掉该公文,不让编译器编译即可,步骤如下所示:

1.1将2410的单板文件夹拷贝成2440:

 图片 36

3)修改arch/arm/cpu/arm920t/start.S,更改重定位代码

 图片 37

4.烧写到NOR上,测试

 

由此接下去修改代码,并收回”-pie”选项.

未完待续,下章便来学学,让uboot补助nor
flash、nand flash.

#ifndef
CONFIG_SKIP_LOWLEVEL_INIT

1)将从前写uboot里的init.c放入board/samsung/smdk2440目录,
并检查是否有同名函数名,若函数只在同文件使用,则添加static.并修改Makefile

1)直白进入s3c2410_nand.c的目录,打开Makefile:

 图片 38

2)修改include/configs/smdk2440.h文件

 图片 39

 
 

 

且下边的s3c2410_nand结构体和s3c2440_nand结构体的出入也很大,修改s3c2410_nand.c会很费力

将CONFIG_SYS_TEXT_BASE宏改为0x33f00000,也就是uboot重一向后的岗位,
这里留了1MB空间供给uboot重一向(在反汇编中看到,代码真正总大小为700多KB(包括了bss段))

usb 1 30000000            //使用usb下载到SDRAM上,1表示一直下载,直到完成
                         //然后打开DNW,传输新的uboot.bin给usb

protect off all           //关闭nor的写保护

erase  0   +7FFFF      //擦除nor上的 0~7FFFF地址内容, +7FFF=擦除长度=512kb,要大于新的uboot.bin才行

cp.b  30000000  0  80000         //将SDRAM上的新的uboot.bin,拷贝到nor上

2)搜索CONFIG_NAND_S3C2410宏,位于include/configs/smdk2440.h:

 图片 40

 图片 41

6.双重编译烧写uboot,发现串口已有数量,然而乱码:

 

所以将:

SMRDATA:
       .long 0x22011110;    //BWSCON
       .long 0x00000700;    //BANKCON0
       .long 0x00000700;    //BANKCON1
       .long 0x00000700;    //BANKCON2
       .long 0x00000700;    //BANKCON3 
       .long 0x00000700;    //BANKCON4
       .long 0x00000700;    //BANKCON5
       .long 0x00018005;    //BANKCON6
       .long 0x00018005;    //BANKCON7
       .long 0x008C04F4;    //REFRESH
       .long 0x000000B1;    //BANKSIZE
       .long 0x00000030;    //MRSRB6
       .long 0x00000030;    //MRSRB7

             
  board/samsung/smdk2440/libsmdk2440.o
(.text)  

进入drivers/mtd/nand/s3c2410_nand.c 的72行:

       
}

本节丰硕的uboot重一向是直接以基地址0x33F00000起头的,
在上一章分析出,board_init_f()函数划分uboot重一向所在区域时,是经过动态划分的.

相关文章