二、【s3c2440移植u-boot-2016-11】 支持Nand Flash启动u-boot

移植U-BOOT-2016.11到JZ2440详细教程(1) 前言 学习韦东山老师的移植U-BOOT 2012.04.01已经有一段时间了,一直想着自己来移植最新的U-BOOT,看看是否真正的掌握了移植方法。并通过这个过程,学着写一些自己的博客。 至于为什么要选择2016.11版本,而不是最新的2018.09,是因为从U-BOOT 2016.11以后的版本就不再支持S3C2410单板,以目前的能力,我们要移植U-BOOT到开发板上一定是选择当前支持的单板或者... 阅读详情

(一)Nand Flash上启动u-boot

在第一个博客NOR Flash上启动u-boot的u-boot.bin是不支持用Nand Flash启动,至于为什么呢?
我这里就不啰嗦了,直接进入我们的正题,想知道有兴趣的朋友可以百度一下。

1、增加board/samsung/smdk2440/init.c文件
diff -urN u-boot-2016.11/board/samsung/smdk2440/init.c u-boot-2016.11_s3c2440/board/samsung/smdk2440/init.c  
--- u-boot-2016.11/board/samsung/smdk2440/init.c    1970-01-01 08:00:00.000000000 +0800  
+++ u-boot-2016.11_s3c2440/board/samsung/smdk2440/init.c    2018-06-15 15:29:34.456161999 +0800  
@@ -0,0 +1,142 @@  
+  
+/* NAND FLASH控制器 */  
+#define NFCONF (*((volatile unsigned long *)0x4E000000))  
+#define NFCONT (*((volatile unsigned long *)0x4E000004))  
+#define NFCMMD (*((volatile unsigned char *)0x4E000008))  
+#define NFADDR (*((volatile unsigned char *)0x4E00000C))  
+#define NFDATA (*((volatile unsigned char *)0x4E000010))  
+#define NFSTAT (*((volatile unsigned char *)0x4E000020))  
+/* GPIO */  
+#define GPHCON              (*(volatile unsigned long *)0x56000070)  
+#define GPHUP               (*(volatile unsigned long *)0x56000078)  
+/* UART registers*/  
+#define ULCON0              (*(volatile unsigned long *)0x50000000)  
+#define UCON0               (*(volatile unsigned long *)0x50000004)  
+#define UFCON0              (*(volatile unsigned long *)0x50000008)  
+#define UMCON0              (*(volatile unsigned long *)0x5000000c)  
+#define UTRSTAT0            (*(volatile unsigned long *)0x50000010)  
+#define UTXH0               (*(volatile unsigned char *)0x50000020)  
+#define URXH0               (*(volatile unsigned char *)0x50000024)  
+#define UBRDIV0             (*(volatile unsigned long *)0x50000028)  
+#define TXD0READY   (1<<2)  
+void nand_read_ll(unsigned int addr, unsigned char *buf, unsigned int len);  
+static int isBootFromNorFlash(void)  
+{  
+    volatile int *p = (volatile int *)0;  
+    int val;  
+    val = *p;  
+    *p = 0x12345678;  
+    if (*p == 0x12345678)  
+    {  
+        /* 写成功, 是nand启动 */  
+        *p = val;  
+        return 0;  
+    }  
+    else  
+    {  
+        /* NOR不能像内存一样写 */  
+        return 1;  
+    }  
+}  
+void copy_code_to_sdram(unsigned char *src, unsigned char *dest, unsigned int len)  
+{     
+    int i = 0;  
+    /* 如果是NOR启动 */  
+    if (isBootFromNorFlash())  
+    {  
+        while (i < len)  
+        {  
+            dest[i] = src[i];  
+            i++;  
+        }  
+    }  
+    else  
+    {  
+        //nand_init();  
+        nand_read_ll((unsigned int)src, dest, len);  
+    }  
+}  
+void clear_bss(void)  
+{  
+    extern int __bss_start, __bss_end;  
+    int *p = &__bss_start;  
+    for (; p < &__bss_end; p++)  
+        *p = 0;  
+}  
+void nand_init_ll(void)  
+{  
+#define TACLS   0  
+#define TWRPH0  1  
+#define TWRPH1  0  
+    /* 设置时序 */  
+    NFCONF = (TACLS<<12)|(TWRPH0<<8)|(TWRPH1<<4);  
+    /* 使能NAND Flash控制器, 初始化ECC, 禁止片选 */  
+    NFCONT = (1<<4)|(1<<1)|(1<<0);    
+}  
+static void nand_select(void)  
+{  
+    NFCONT &= ~(1<<1);   
+}  
+static void nand_deselect(void)  
+{  
+    NFCONT |= (1<<1);     
+}  
+static void nand_cmd(unsigned char cmd)  
+{  
+    volatile int i;  
+    NFCMMD = cmd;  
+    for (i = 0; i < 10; i++);  
+}  
+static void nand_addr(unsigned int addr)  
+{  
+    unsigned int col  = addr % 2048;  
+    unsigned int page = addr / 2048;  
+    volatile int i;  
+    NFADDR = col & 0xff;  
+    for (i = 0; i < 10; i++);  
+    NFADDR = (col >> 8) & 0xff;  
+    for (i = 0; i < 10; i++);  
+    NFADDR  = page & 0xff;  
+    for (i = 0; i < 10; i++);  
+    NFADDR  = (page >> 8) & 0xff;  
+    for (i = 0; i < 10; i++);  
+    NFADDR  = (page >> 16) & 0xff;  
+    for (i = 0; i < 10; i++);     
+}  
+static void nand_wait_ready(void)  
+{  
+    while (!(NFSTAT & 1));  
+}  
+static unsigned char nand_data(void)  
+{  
+    return NFDATA;  
+}  
+void nand_read_ll(unsigned int addr, unsigned char *buf, unsigned int len)  
+{  
+    int col = addr % 2048;  
+    int i =
移植U-BOOT-2016.11到JZ2440详细教程(4) 让U-BOOT支持从NAND FLASH启动 在移植之前,我们首先要知道ARM开发板从NAND和NOR FLASH启动有什么区别。 关于这块内容的介绍,推荐看一下这个博主的文章,讲的还是蛮具体的,链接: [https://www.cnblogs.com/aaronLinux/p/5540606.html]. 这边我们只需要知道如果要从NAND FLASH启动,那么我们在对代码重定位之前的程序不能大... 阅读详情

相关推荐

u-boot-2016.11移植uboot-spl.bin

一、时钟初始化 1、修改clock.h cd arch/arm/mach-s5pv210/include/mach/vim clock.h /* add by Sourcelink */ struct s5pv210_clock { unsigned int apll_lock; unsigned char res1[0x04]; un

Sourcelink 2478

在2440的uboot和内核中添加nandflash硬件ECC

平台                        :             tq2440开发板,fl2440开发板 bootload                :             u-boot-2010.09 转载声明: http://blog.csdn.net/sonbai/article/details/8737129 借鉴: http://blog.csdn.net

fulinux的博客 5982

移植的S3C2440可用的uboot,支持JZ2440

移植的S3C2440可用的uboot-2012.04.01,支持JZ2440。支持nand、nor启动,支持网络下载等。

腾讯、飞书等在线表格自动化编辑--python

在线文档自动化处理数据

qq_32828053的博客 2万+

【转载】参数估计(Parameter Estimation):频率学派(最大似然估计MLE、最大后验估计MAP)与贝叶斯学派(贝叶斯估计BPE)

基础 频率学派与贝叶斯学派 http://www.douban.com/group/topic/16719644/ http://www.zhihu.com/question/20587681 最大似然估计(Maximum likelihood estimation,MLE) http://baike.baidu.com/view/1918804.htm http://baike.baidu.co

影 的专栏 3413

nRF52840 低功耗蓝牙开发指南:从硬件架构到物联网应用实战

本文深入解析nRF52840低功耗蓝牙芯片的硬件架构与开发实践,涵盖从开发环境搭建到BLE协议栈开发的详细指南。通过实战案例分享低功耗优化技巧,帮助开发者高效实现物联网应用,特别适合智能家居和工业场景。

d3e4f的博客 417

tiny4412用 usb 连接计算机显示sec s5pc210 test b/d 解决方法

当我用USB线连接tiny4412的microUSB端口的时候,出现了驱动没有正常安装,显示“sec s5pc210 test b/d” 出现这种问题的原因有: 1、没有安装到正确的USB驱动; 2、SD卡没有插好 我出现问题的原因属于第二种,插入SD卡后,上电后,LCD屏亮了,但没有任何显示   解决方法是:     更换一张SD卡,重新插入开发板卡槽,上电开

karaskass的博客 3231

BetaFlight开源飞控源码分析

BetaFlight是穿越机领域比较成熟的开源飞控,本篇文章主要分析一下源代码以及如何使用这个开源代码

weixin_43811044的博客 1万+

自动化Ai Agent全流程实现【设计+代码】

本文探讨了人工智能代理(AI代理)如何通过自动化复杂的业务流程来帮助企业提高效率和降低成本。AI代理具有适应性、智力、自主性和可扩展性等特点,能够处理非结构化信息、在定义参数范围内做出判断、协调多个系统或利益相关者,以及处理变量输入和异常。文章详细介绍了AI代理在文件处理、客户服务、人才招聘和财务运作等领域的应用,并提供了一个逐步实现发票处理自动化的案例。此外,文章还强调了实施AI代理自动化的优势,包括效率提升、成本降低、准确性和可扩展性的改进,并提出了实施最佳实践,如从高影响力流程开始、设计人机交互、优先

FeelTouch Labs 896

AUTOSAR进阶图解==>AUTOSAR_SWS_ECUStateManager

AUTOSAR ECU State Manager 摘要 AUTOSAR ECU状态管理器(EcuM)是Classic Platform 4.4.0规范中的核心模块,负责管理ECU的整个生命周期,包括启动、运行、关机和睡眠等状态转换。EcuM通过协调各基础软件模块的初始化过程,确保系统可靠运行。 主要功能包括: 启动管理 - 控制从硬件初始化到应用运行的完整启动序列 状态转换 - 管理RUN/POST_RUN/SHUTDOWN等状态切换 唤醒验证 - 区分真实与虚假唤醒事件 关机序列 - 确保安全关机保存关

一名留德华的,康德的信徒的,专注于汽车电子领域的博客 2472

Spring AI Alibaba实战训练营-20 基于注解驱动的MCP快速开发入门指南

本文详细讲解如何使用SpringAiAlibaba快速开发基于注解驱动的MCP应用。文章详细介绍了MCP协议并且重点介绍了Spring AI通过注解驱动的开发方式简化MCP服务开发。具体包括服务端和客户端的注解使用、城市最新时间查询MCP项目结构概览(服务端和客户端模块)以及环境配置要求。

program哲学 295

VOS3000 V2.1.7.03.exe

VOS3000 V2.1.7.03.exe

vasp6.4.2安装包

新版vasp安装包,按需下载

AD BOM表自制模板

自制 Altium Designer10 BOM模板,中文标题不用,界面简洁,适合中文习惯,序号-名称-规格型号-器件值-封装-数量-备注

大教堂和集市(The Cathedral and the Bazaar)

大教堂和集市(The Cathedral and the Bazaar)中英文对照,Eric Steven Raymond,洛基开放文化实验室中译本 v1.1

上一篇: 一、【s3c2440移植u-boot-2016-11】拷贝代码并在NOR Flash上启动u-boot
下一篇: 三、【s3c2440移植u-boot-2016-11】 识别Nor Flash
David_linux
博客等级 码龄9年 16粉丝 13原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值