U-boot在S3C2440上的移植详解(一)

本文详细介绍了如何将u-boot移植到Mini2440开发板的过程,包括创建开发板项目、修改配置文件、硬件设备初始化、添加支持寄存器和时钟设置等内容,最终实现u-boot在开发板上的正常运行。

一、移植环境

  • 主  机:VMWare--Fedora 9
  • 开发板:Mini2440--64MB Nand,Kernel:2.6.30.4
  • 编译器:arm-linux-gcc-4.3.2.tgz
  • u-boot:u-boot-2009.08.tar.bz2

二、移植步骤

本次移植的功能特点包括:

  • 支持Nand Flash读写
  • 支持从Nor/Nand Flash启动
  • 支持CS8900或者DM9000网卡 
  • 支持Yaffs文件系统 
  • 支持USB下载(还未实现)

1. 了解u-boot主要的目录结构和启动流程,如下图。

 
    u-bootstage1代码通常放在cpu/xxxx/start.S文件中,他用汇编语言写成;
    u-bootstage2代码通常放在lib_xxxx/board.c文件中,他用C语言写成。
    各个部分的流程图如下:
 
 
 
2. 建立自己的开发板项目并测试编译。
   目前u-boot对很多CPU直接支持,可以查看board目录的一些子目录,如:board/samsung/目录下就是对三星一些ARM处理器的支持,有smdk2400、smdk2410和smdk6400,但没有2440,所以我们就在这里建立自己的开发板项目。
 
1)因2440和2410的资源差不多,主频和外设有点差别,所以我们就在board/samsung/下建立自己开发板的项目,取名叫my2440

#tar -jxvf u-boot-2009.08.tar.bz2    //解压源码
#cd u-boot-2009.08/board/samsung/    //进入目录
#mkdir my2440                        //创建my2440文件夹

 
2)因2440和2410的资源差不多,所以就以2410项目的代码作为模板,以后再修改

#cp -rf smdk2410/* my2440/   //将2410下所有的代码复制到2440下

#cd my2440                   //进入my2440目录

#mv smdk2410.c my2440.c      //将my2440下的smdk2410.c改名为my2440.c

#cd ../../../                //回到u-boot根目录
#cp include/configs/smdk2410.h include/configs/my2440.h //建立2440头文件
#gedit board/samsung/my2440/Makefile   //修改my2440下Makefile的编译项,如下:

COBJS    := my2440.o flash.o  //因在my2440下我们将smdk2410.c改名为my2440.c

3)修改u-boot跟目录下的Makefile文件。查找到smdk2410_config的地方,在他下面按照smdk2410_config的格式建立my2440_config的编译选项,另外还要指定交叉编译器

#gedit Makefile

CROSS_COMPILE ?= arm-linux-        //指定交叉编译器为arm-linux-gcc

 

smdk2410_config    :    unconfig   //2410编译选项格式
    @$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 samsung s3c24x0

 

my2440_config    :    unconfig     //2440编译选项格式
    @$(MKCONFIG) $(@:_config=) arm arm920t my2440 samsung s3c24x0

 

*说明:arm    :CPU的架构(ARCH)

       arm920t:CPU的类型

       my2440 :对应在board目录下建立新的开发板项目的目录

       samsung:新开发板项目目录的上级目录,如直接在board下建立新的开发板项目的目录,则这里就为NULL

       s3c24x0:CPU型号

*注意:编译选项格式的第二行要用Tab键开始,否则编译会出错

 

4)测试编译新建的my2440开发板项目

#make my2440_config //如果出现Configuring for my2440 board...则表示设置正确

#make //编译后在根目录下会出现u-boot.bin文件,则u-boot移植的第一步就算完成了

 

到此为止,u-boot对自己的my2440开发板还没有任何用处,以上的移植只是搭建了一个my2440开发板u-boot的框架,要使其功能实现,还要根据my2440开发板的具体资源情况来对u-boot源码进行修改。

3. 根据u-boot启动流程图的步骤来分析或者修改添加u-boot源码,使之适合my2440开发板(注:修改或添加的地方都用红色表示)。

1)my2440开发板u-boot的stage1入口点分析。
一般在嵌入式系统软件开发中,在所有源码文件编译完成之后,链接器要读取一个链接分配文件,在该文件中定义了程序的入口点,代码段、数据段等分配情况等。那么我们的my2440开发板u-boot的这个链接文件就是cpu/arm920t/u-boot.lds,打开该文件部分代码如下:

 

知道了程序的入口点是_start,那么我们就打开my2440开发板u-boot第一个要运行的程序cpu/arm920t/start.S(即u-boot的stage1部分),查找到_start的位置如下:

 

从这个汇编代码可以看到程序又跳转到start_code处开始执行,那么再查找到start_code处的代码如下:

/*
 * the actual start code
 */


start_code:
    
/*
     * set the cpu to SVC32 mode
     */

    mrs    r0,cpsr
    bic    r0,r0,#0x1f
    orr    r0,r0,#0xd3
    msr    cpsr,r0

    bl coloured_LED_init  //此处两行是对AT91RM9200DK开发板上的LED进行初始化的
    bl red_LED_on

 

由此可以看到,start_code处才是u-boot启动代码的真正开始处。以上就是u-boot的stage1入口的过程。

2)my2440开发板u-boot的stage1阶段的硬件设备初始化。
由于在u-boot启动代码处有两行是AT91RM9200DK的LED初始代码,但我们my2440上的LED资源与该开发板的不一致,所以我们要删除或屏蔽该处代码,再加上my2440的LED驱动代码(注:添加my2440 LED功能只是用于表示u-boot运行的状态,给调试带来方便,可将该段代码放到任何你想调试的地方),代码如下:

    /*bl coloured_LED_init  //这两行是AT91RM9200DK开发板的LED初始化,注释掉
    bl red_LED_on*/

 

#if defined(CONFIG_S3C2440)  //区别与其他开发板

//根据mini2440原理图可知LED分别由S3C2440的PB5、6、7、8口来控制,以下是PB端口寄存器基地址(查2440的DataSheet得知)
#define GPBCON 0x56000010

#define GPBDAT 0x56000014
#define GPBUP  0x56000018    

    //以下对寄存器的操作参照S3C2440的DataSheet进行操作
    ldr r0, =GPBUP
    ldr r1, =0x7FF    //即:二进制11111111111,关闭PB口上拉
    str r1, [r0]

    ldr r0, =GPBCON   //配置PB5、6、7、8为输出口,对应PBCON寄存器的第10-17位
    ldr r1, =0x154FD  //即:二进制010101010011111101
    str r1, [r0]

    ldr r0, =GPBDAT
    ldr r1, =0x1C0    //即:二进制111000000,PB5设为低电平,6、7、8为高电平
    str r1, [r0]
 

#endif

//此段代码使u-boot启动后,点亮开发板上的LED1,LED2、LED3、LED4不亮

 

include/configs/my2440.h头文件中添加CONFIG_S3C2440宏

3)在u-boot中添加对S3C2440一些寄存器的支持、添加中断禁止部分和时钟设置部分
由于2410和2440的寄存器及地址大部分是一致的,所以这里就直接在2410的基础上再加上对2440的支持即可,代码如下:

 

S3C2440的时钟部分除了在start.S中添加外,还要分别在board/samsung/my2440/my2440.c和cpu/arm920t/s3c24x0/speed.c中修改或添加部分代码,如下:

#gedit board/samsung/my2440/my2440.c //设置主频和USB时钟频率参数与start.S中的一致

#define FCLK_SPEED 2       //设置默认等于2,即下面红色代码部分有效

#if FCLK_SPEED==0          /* Fout = 203MHz, Fin = 12MHz for Audio */
#define M_MDIV    0xC3
#define M_PDIV    0x4
#define M_SDIV    0x1
#elif FCLK_SPEED==1        /* Fout = 202.8MHz */
#define M_MDIV    0xA1
#define M_PDIV    0x3
#define M_SDIV    0x1
#elif FCLK_SPEED==2        /* Fout = 405MHz */
#define M_MDIV    0x7F     //这三个值根据S3C2440芯片手册“PLL VALUE SELECTION TABLE”部分进行设置
#define M_PDIV    0x2
#define M_SDIV    0x1

#endif

#define USB_CLOCK 2        //设置默认等于2,即下面红色代码部分有效

#if USB_CLOCK==0
#define U_M_MDIV    0xA1
#define U_M_PDIV    0x3
#define U_M_SDIV    0x1
#elif USB_CLOCK==1
#define U_M_MDIV    0x48
#define U_M_PDIV    0x3
#define U_M_SDIV    0x2
#elif USB_CLOCK==2         /* Fout = 48MHz */
#define U_M_MDIV    0x38   //这三个值根据S3C2440芯片手册“PLL VALUE SELECTION TABLE”部分进行设置
#define U_M_PDIV    0x2
#define U_M_SDIV    0x2

#endif

#gedit cpu/arm920t/start.S

#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410|| defined(CONFIG_S3C2440)
    /* turn off the watchdog */

if defined(CONFIG_S3C2400)
# define pWTCON     0x15300000
# define INTMSK     0x14400008    /* Interupt-Controller base addresses */
# define CLKDIVN    0x14800014    /* clock divisor register */
#else  //下面2410和2440的寄存器地址是一致的
# define pWTCON     0x53000000
# define INTMSK     0x4A000008    /* Interupt-Controller base addresses */
# define INTSUBMSK  0x4A00001C
# define CLKDIVN    0x4C000014    /* clock divisor register */
endif

    ldr  r0, =pWTCON
    mov  r1, #0x0
    str  r1, [r0]

    /*
     * mask all IRQs by setting all bits in the INTMR - default
     */
    mov  r1, #0xffffffff
    ldr  r0, =INTMSK
    str  r1, [r0]
if defined(CONFIG_S3C2410)
    ldr  r1, =0x3ff
    ldr  r0, =INTSUBMSK
    str  r1, [r0]
endif
if defined(CONFIG_S3C2440)//添加s3c2440的中断禁止部分
    ldr  r1, =0x7fff        //根据2440芯片手册,INTSUBMSK寄存器有15位可用   

    ldr  r0, =INTSUBMSK
    str  r1, [r0]
endif

if defined(CONFIG_S3C2440)   //添加s3c2440的时钟部分# endif
#endif    /* CONFIG_S3C2400 || CONFIG_S3C2410 || CONFIG_S3C2440 */

#define MPLLCON   0x4C000004   //系统主频配置寄存器基地址

#define UPLLCON   0x4C000008   //USB时钟频率配置寄存器基地址 
    ldr  r0, =CLKDIVN          //设置分频系数FCLK:HCLK:PCLK = 1:4:8
    mov  r1
, #
5
    str  r1
, [r0]

 

    ldr  r0, =MPLLCON  //设置系统主频为405MHz 

    ldr  r1, =0x7F021  //这个值参考芯片手册“PLL VALUE SELECTION TABLE”部分

    str  r1, [r0]

 

    ldr  r0, =UPLLCON  //设置USB时钟频率为48MHz 

    ldr  r1, =0x38022  //这个值参考芯片手册“PLL VALUE SELECTION TABLE”部分

    str  r1, [r0]

# else //其他开发板的时钟部分,这里就不用管了,我们现在是做2440的

    /* FCLK:HCLK:PCLK = 1:2:*/
    /* default FCLK is 120 MHz ! */
  

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

 

 

 

#gedit cpu/arm920t/s3c24x0/speed.c //根据设置的分频系数FCLK:HCLK:PCLK = 1:4:8修改获取时钟频率的函数

static ulong get_PLLCLK(int pllreg)
{
    S3C24X0_CLOCK_POWER * const clk_power =S3C24X0_GetBase_CLOCK_POWER();
    ulong r, m, p, s;

    if (pllreg == MPLL)
    r = clk_power->MPLLCON;
    else if (pllreg == UPLL)
    r = clk_power->UPLLCON;
    else
    hang();

    m = ((& 0xFF000) >> 12) + 8;
    p = ((& 0x003F0) >> 4) + 2;
    s = r & 0x3;

#if defined(CONFIG_S3C2440)
    if(pllreg == MPLL)
    {   //参考S3C2440芯片手册上的公式:PLL=(2 * m * Fin)/(p * 2s)
        return((CONFIG_SYS_CLK_FREQ * m * 2) / (<< s));
    }
#endif

    return((CONFIG_SYS_CLK_FREQ * m) / (<< s));
}

/* return HCLK frequency */
ulong get_HCLK(void)
{
    S3C24X0_CLOCK_POWER * const clk_power =S3C24X0_GetBase_CLOCK_POWER();

#if defined(CONFIG_S3C2440)

    return(get_FCLK()/4);
#endif

    return((clk_power->CLKDIVN & 0x2) ? get_FCLK()/: get_FCLK());
}

 

好了!修改完毕后我们再重新编译u-boot,然后再下载到RAM中运行测试。结果终端有输出信息并且出现类似Shell的命令行,这说明这一部分移植完成。示意图如下: 


#gedit include/configs/my2440.h

#define CONFIG_ARM920T        1    /* This is an ARM920T Core     */
#define CONFIG_S3C2410        1    /* in a SAMSUNG S3C2410 SoC    */
#define CONFIG_SMDK2410       1    /* on a SAMSUNG SMDK2410 Board */
#define CONFIG_S3C2440        1    /* in a SAMSUNG S3C2440 SoC    */

 

现在编译u-boot,在根目录下会生成一个u-boot.bin文件。然后我们利用mini2440原有的supervivi把u-boot.bin下载到RAM中运行测试(注意:我们使用supervivi进行下载时已经对CPU、RAM进行了初始化,所以我们在u-boot中要屏蔽掉对CPU、RAM的初始化),如下:

/*#ifndef CONFIG_SKIP_LOWLEVEL_INIT //在start.S文件中屏蔽u-boot对CPU、RAM的初始化
   bl cpu_init_crit
#endif*/

#make my2440_config

#make

 

下载运行后可以看到开发板上的LED灯第一了亮了,其他三个熄灭,测试结果符合上面的要求。终端运行结果如下:

#gedit cpu/arm920t/start.S

.globl _start
_start: b       start_code    //将程序的执行跳转到start_code处

#gedit cpu/arm920t/u-boot.lds

OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)    
//定义生成文件的目标平台是arm
ENTRY(_start)       
//定义程序的入口点是_start

SECTIONS
{
    
//其他一些代码段、数据段等分配
    . = 0x00000000;

    . = ALIGN(4);
    .text :
    {
        cpu/arm920t/start.o    (.text)
        *(.text)
    }
    ..................
    ..................
}


标题SpringBoot智能在线预约挂号系统研究AI更换标题第1章引言介绍智能在线预约挂号系统的研究背景、意义、国内外研究现状及论文创新点。1.1研究背景与意义阐述智能在线预约挂号系统对提升医疗服务效率的重要性。1.2国内外研究现状分析国内外智能在线预约挂号系统的研究与应用情况。1.3研究方法及创新点概述本文采用的技术路线、研究方法及主要创新点。第2章相关理论总结智能在线预约挂号系统相关理论,包括系统架构、开发技术等。2.1系统架构设计理论介绍系统架构设计的基本原则和常用方法。2.2SpringBoot开发框架理论阐述SpringBoot框架的特点、优势及其在系统开发中的应用。2.3数据库设计与管理理论介绍数据库设计原则、数据模型及数据库管理系统。2.4网络安全与数据保护理论讨论网络安全威胁、数据保护技术及其在系统中的应用。第3章SpringBoot智能在线预约挂号系统设计详细介绍系统的设计方案,包括功能模块划分、数据库设计等。3.1系统功能模块设计划分系统功能模块,如用户管理、挂号管理、医生排班等。3.2数据库设计与实现设计数据库表结构,确定字段类型、主键及外键关系。3.3用户界面设计设计用户友好的界面,提升用户体验。3.4系统安全设计阐述系统安全策略,包括用户认证、数据加密等。第4章系统实现与测试介绍系统的实现过程,包括编码、测试及优化等。4.1系统编码实现采用SpringBoot框架进行系统编码实现。4.2系统测试方法介绍系统测试的方法、步骤及测试用例设计。4.3系统性能测试与分析对系统进行性能测试,分析测试结果并提出优化建议。4.4系统优化与改进根据测试结果对系统进行优化和改进,提升系统性能。第5章研究结果呈现系统实现后的效果,包括功能实现、性能提升等。5.1系统功能实现效果展示系统各功能模块的实现效果,如挂号成功界面等。5.2系统性能提升效果对比优化前后的系统性能
在金融行业中,对信用风险的判断是核心环节之,其结果对机构的信贷政策和风险控制策略有直接影响。本文将围绕如何借助机器学习方法,尤其是Sklearn工具包,建立用于判断信用状况的预测系统。文中将涵盖逻辑回归、支持向量机等常见方法,并通过实际操作流程进行说明。 、机器学习基本概念 机器学习属于人工智能的子领域,其基本理念是通过数据自动学习规律,而非依赖人工设定规则。在信贷分析中,该技术可用于挖掘历史数据中的潜在规律,进而对未来的信用表现进行预测。 二、Sklearn工具包概述 Sklearn(Scikit-learn)是Python语言中广泛使用的机器学习模块,提供多种数据处理和建模功能。它简化了数据清洗、特征提取、模型构建、验证与优化等流程,是数据科学项目中的常用工具。 三、逻辑回归模型 逻辑回归是种常用于分类任务的线性模型,特别适用于二类问题。在信用评估中,该模型可用于判断借款人是否可能违约。其通过逻辑函数将输出映射为0到1之间的概率值,从而表示违约的可能性。 四、支持向量机模型 支持向量机是种用于监督学习的算法,适用于数据维度高、样本量小的情况。在信用分析中,该方法能够通过寻找最佳分割面,区分违约与非违约客户。通过选用不同核函数,可应对复杂的非线性关系,提升预测精度。 五、数据预处理步骤 在建模前,需对原始数据进行清理与转换,包括处理缺失值、识别异常点、标准化数值、筛选有效特征等。对于信用评分,常见的输入变量包括收入水平、负债比例、信用历史记录、职业稳定性等。预处理有助于减少噪声干扰,增强模型的适应性。 六、模型构建与验证 借助Sklearn,可以将数据集划分为训练集和测试集,并通过交叉验证调整参数以提升模型性能。常用评估指标包括准确率、召回率、F1值以及AUC-ROC曲线。在处理不平衡数据时,更应关注模型的召回率与特异性。 七、集成学习方法 为提升模型预测能力,可采用集成策略,如结合多个模型的预测结果。这有助于降低单模型的偏差与方差,增强整体预测的稳定性与准确性。 综上,基于机器学习的信用评估系统可通过Sklearn中的多种算法,结合合理的数据处理与模型优化,实现对借款人信用状况的精准判断。在实际应用中,需持续调整模型以适应市场变化,保障预测结果的长期有效性。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值