郑州作网站泉州网站建站模板

bicheng/2026/1/25 18:10:34/文章来源:
郑州作网站,泉州网站建站模板,什么网站备案比较快,seo中文含义是什么学习交流加 个人qq#xff1a; 1126137994个人微信#xff1a; liu1126137994学习交流资源分享qq群#xff1a; 962535112 今天我们的任务是修改uboot源码支持NorFlash。 上两篇关于uboot移植的文章#xff0c;我们修改了uboot源代码#xff0c;支持了串口的输出#xff… 学习交流加 个人qq 1126137994个人微信 liu1126137994学习交流资源分享qq群 962535112 今天我们的任务是修改uboot源码支持NorFlash。 上两篇关于uboot移植的文章我们修改了uboot源代码支持了串口的输出以及nand启动点击连接可以查看上两面文章的相关内容移植uboot支持串口输出移植uboot支持NAND启动 同时分享一个很好的书Linux设备驱动开发详解-宋宝华 注写到后面发现没有告诉大家用的flash芯片的型号我们用的flash芯片的型号是MX29LV160DB芯片手册大家可以自行到网上下载从中可以查看芯片的厂家ID和设备ID等信息 我们移植uboot都是一步一步调试而来所以会比较繁琐但是我觉得记录这些是一件很有意义的事虽然很麻烦但是对将来会有莫大的影响 上次移植支持NAND后串口启动界面如下 我们在source insight中搜索“Flash:”这个字符串出现在哪里在Board.c中的board_init_r函数中有这样几行代码 #if !defined(CONFIG_SYS_NO_FLASH)puts(Flash: );flash_size flash_init();if (flash_size 0) { # ifdef CONFIG_SYS_FLASH_CHECKSUMchar *s getenv(flashchecksum);print_size(flash_size, );/** Compute and print flash CRC if flashchecksum is set to y** NOTE: Maybe we should add some WATCHDOG_RESET()? XXX*/if (s (*s y)) {printf( CRC: %08X, crc32(0,(const unsigned char *) CONFIG_SYS_FLASH_BASE,flash_size));}putc(\n); # else /* !CONFIG_SYS_FLASH_CHECKSUM */print_size(flash_size, \n); # endif /* CONFIG_SYS_FLASH_CHECKSUM */} else {puts(0 KB\n\r);puts(failed);hang();} #endif课件代码是执行到了这两行 puts(failed);hang();查看hang这个函数为 void hang(void) { puts(### ERROR ### Please RESET the board ###\n); for (;?; } 很明显代码进入了一个死循环所以无法启动uboot了。 回过头看上面的board_init_r函数里的flash_size flash_init();应该是flash的一个初始化初始化后成功后才执行下面的if语句很明显我们这里没有初始化成功。进入flash_init。查看代码如下在drivers/mtd/Cfi_flash.c中 unsigned long flash_init (void) {unsigned long size 0;int i;#ifdef CONFIG_SYS_FLASH_PROTECTION/* read environment from EEPROM */char s[64];getenv_f(unlock, s, sizeof(s)); #endif/* Init: no FLASHes known */for (i 0; i CONFIG_SYS_MAX_FLASH_BANKS; i) {flash_info[i].flash_id FLASH_UNKNOWN;/* Optionally write flash configuration register */cfi_flash_set_config_reg(cfi_flash_bank_addr(i),cfi_flash_config_reg(i));if (!flash_detect_legacy(cfi_flash_bank_addr(i), i))flash_get_size(cfi_flash_bank_addr(i), i);size flash_info[i].size;if (flash_info[i].flash_id FLASH_UNKNOWN) { #ifndef CONFIG_SYS_FLASH_QUIET_TESTprintf (## Unknown flash on Bank %d - Size 0x%08lx %ld MB\n,i1, flash_info[i].size,flash_info[i].size 20); #endif /* CONFIG_SYS_FLASH_QUIET_TEST */} #ifdef CONFIG_SYS_FLASH_PROTECTIONelse if ((s ! NULL) (strcmp(s, yes) 0)) {/** Only the U-Boot image and its environment* is protected, all other sectors are* unprotected (unlocked) if flash hardware* protection is used (CONFIG_SYS_FLASH_PROTECTION)* and the environment variable unlock is* set to yes.*/if (flash_info[i].legacy_unlock) {int k;/** Disable legacy_unlock temporarily,* since flash_real_protect would* relock all other sectors again* otherwise.*/flash_info[i].legacy_unlock 0;/** Legacy unlocking (e.g. Intel J3) -* unlock only one sector. This will* unlock all sectors.*/flash_real_protect (flash_info[i], 0, 0);flash_info[i].legacy_unlock 1;/** Manually mark other sectors as* unlocked (unprotected)*/for (k 1; k flash_info[i].sector_count; k)flash_info[i].protect[k] 0;} else {/** No legancy unlocking - unlock all sectors*/flash_protect (FLAG_PROTECT_CLEAR,flash_info[i].start[0],flash_info[i].start[0] flash_info[i].size - 1,flash_info[i]);}} #endif /* CONFIG_SYS_FLASH_PROTECTION */}flash_protect_default(); #ifdef CONFIG_FLASH_CFI_MTDcfi_mtd_init(); #endifreturn (size); }里面有一个if判断语句 if (!flash_detect_legacy(cfi_flash_bank_addr(i), i))flash_get_size(cfi_flash_bank_addr(i), i);从字面意思看出flash_detect_legacy为旧的检测flashflash_get_size就应该为新的检测flash机制先看一下旧的没看出什么再看flash_get_size发现有很多debug调试信息有这么多调试信息那就应该用起来 在flash_get_size中的debug信息 debug (manufacturer is %d\n, info-vendor);debug (manufacturer id is 0x%x\n, info-manufacturer_id);debug (device id is 0x%x\n, info-device_id);debug (device id2 is 0x%x\n, info-device_id2);debug (cfi version is 0x%04x\n, info-cfi_version);搜索debug 查到 在include/common.h中有下面的代码 #define debug(fmt, args...) \debug_cond(_DEBUG, fmt, ##args)很明显应该是用的_DEBUG搜索_DEBUG有 #ifdef DEBUG #define _DEBUG 1 #else #define _DEBUG 0 #endif好那么我们就把#define _DEBUG 1给加上在Cfi_flash.c中定义如下两行 #define DEBUG 1 不确定是哪个就都定义反正也不会出错 #define _DEBUG 1重新编译uboot烧写启动看一下 打印的这句话JEDEC PROBE: ID c2 2249 0 告诉我们读到的厂家ID,设备ID我们查看datasheet发现这个读到的ID是没有错的厂家ID是c2设备ID是2249 根据打印信息在源码中搜索字符串“JEDEC PROBE:”在Cfi_flash.c中的flash_detect_legacy函数中有如下代码片段 debug(JEDEC PROBE: ID %x %x %x\n,info-manufacturer_id,info-device_id,info-device_id2);if (jedec_flash_match(info, info-start[0]))break;elseunmap_physmem((void *)info-start[0],MAP_NOCACHE);看出设备ID时如何打印的下面的jedec_flash_match还需要进行一下匹配我们去jedec_flash_match函数里看看是实现的什么内容在drivers/mtd/jeder_flash.c中 /*-----------------------------------------------------------------------* match jedec ids against table. If a match is found, fill flash_info entry*/ int jedec_flash_match(flash_info_t *info, ulong base) {int ret 0;int i;ulong mask 0xFFFF;if (info-chipwidth 1)mask 0xFF;for (i 0; i ARRAY_SIZE(jedec_table); i) {if ((jedec_table[i].mfr_id mask) (info-manufacturer_id mask) (jedec_table[i].dev_id mask) (info-device_id mask)) {fill_info(info, jedec_table[i], base);ret 1;break;}}return ret; }发现一个数组jedec_table,匹配设备的ID用的应该就是这个数组里的内容了查看数组如下 static const struct amd_flash_info jedec_table[] { #ifdef CONFIG_SYS_FLASH_LEGACY_256Kx8{.mfr_id (u16)SST_MANUFACT,.dev_id SST39LF020,.name SST 39LF020,.uaddr {[0] MTD_UADDR_0x5555_0x2AAA /* x8 */},.DevSize SIZE_256KiB,.CmdSet P_ID_AMD_STD,.NumEraseRegions 1,.regions {ERASEINFO(0x01000,64),}},。。。。。。。。。。还有很多跟上面相同的类型的内容我这里给省略了这个结构体里的内容定义了许多类型的flash每一个定义就是一个flash芯片。我们在里面自己定义我们的芯片结构项。 /* jz2440使用的是MX29LV160DB芯片 */{.mfr_id (u16)MX_MANUFACT, /*厂家ID*/.dev_id 0x2249, /*设备ID*/.name MXIC MX29LV160DB,.uaddr { /*NOR FLASH看到的解锁地址*/[0] MTD_UADDR_0x0555_0x02AA /* x16 */},.DevSize SIZE_2MiB, /* 总大小 */.CmdSet P_ID_AMD_STD,.NumEraseRegions 4, /* 擦除区域的数目 */.regions { /* 这些内容涉及芯片手册的阅读之后的文章会单独写关于硬件的操作 */ERASEINFO(16*1024, 1), ERASEINFO(8*1024, 2),ERASEINFO(32*1024, 1),ERASEINFO(64*1024, 31),}},里面涉及到 的硬件操作我会在之后的讲解NOR FLASH 驱动时讲解如何操作这个芯片里面涉及到在这里我们移植uboot只需要这样做就可以暂时不需要追根究底无底洞啊。 然后就是最开始忘记了一件事就是把board.中的board_init_r中的两行代码自己回头看上面的代码屏蔽掉 //puts(failed);//hang();然后重新编译uboot烧写启动运行 哈哈哈先庆祝一下终于启动进去了虽然还没有完善但是得一步一步来嘛 显示有错误ERROR: too many flash sectors在源码中搜索这个错误找到Cfi_flash.c中 if (sect_cnt CONFIG_SYS_MAX_FLASH_SECT) {printf(ERROR: too many flash sectors\n);break;}跳转到CONFIG_SYS_MAX_FLASH_SECT这个定义在smdk2440.h中有 #define CONFIG_SYS_MAX_FLASH_SECT (19)将19改为128吧 #define CONFIG_SYS_MAX_FLASH_SECT (128)然后再把我们之前加的Debug调试信息去掉因为我们已经不需要那些打印信息了去掉的话会看起来简洁一些去掉下面的两个宏定义 //#define DEBUG 1 //#define _DEBUG 1重新编译烧写看启动界面 这次启动界面比较简洁而且上面出现的错误也没有了 那我们现在来测试一下NORFLASH能否擦除与读写。 串口中输入protect off all先解除写保护 输入flinfo打印输出正常 输入erase 80000 8ffff 输入cp.b 30000000 80000 10000 (把内存中30000000位置的内容拷贝到flash80000地址) 到了这里出现了一些问题无法将内存的代码拷贝过来无法写flash。。。。。。。。。啊天哪感觉又得花时间去看了 放到下一篇博客吧这篇已经写了很多了 想获得各种学习资源以及交流学习的加我 qq1126137994 微信liu1126137994 可以共同交流关于嵌入式操作系统C语言C语言数据结构等技术问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/86490.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

化隆县公司网站建设3d建模软件免费下载

目录 一、什么是端口号? 二、TCP协议 2.1 TCP报文格式 2.2 三次握手 2.3 四次挥手 2.4 窗口流量控制 三、UDP协议 3.1 UDP报文格式 3.4 传输过程 一、什么是端口号? 我们自己的一台电脑上有时可能会同时运行多个进程软件来进行上网。那么当网络上的服务器响应我们电…

做平面设计都在那个网站找免费素材?在线crm系统

两两交换链表中的节点 leetcode24 递归 两个节点一递归 第一次即成功,泪目!! // 每两个进行一次交换 func swapPairs(head *ListNode) *ListNode {//每两个的第一个节点var pre *ListNode//递归结束条件,即当剩下的节点不满足两…

深圳网站开发哪家专业宁德做网站公司

综合运用所学的程序设计基础、数据结构、数据库原理及应用、高级语言程序设计、面向对象程序设计、软件需求分析与建模、软件设计与体系结构、软件测试等课程知识,设计开发一个较实用的应用系统。 通过该设计可以巩固并提高软件工程专业学生的软件需求分析、设计、开…

个人网站收款深圳展厅设计装修

RabbitMq简介 中间件简介 消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题实现高性能,高可用,可伸缩和最终一致性[架构] 使用较多的消息队列有 ActiveMQ(安全),RabbitMQ,ZeroMQ,Kafka(大数据),MetaMQ,RocketMQ 以下介绍消息队…

在哪里建网站好兰州手机网站制作公司哪家好

ios培训------我的c语言笔记&#xff0c;期待与您交流! #include <stdio.h> /*break:1.使用场合1> switch语句&#xff1a;退出整个switch语句2> 循环结构&#xff1a;退出整个循环语句* while* do while* for2.注意点只对最近的循环结构有效 continue&#xff1a;…

百度站长平台有哪些功能知名网络软文推广平台

一、Linux和Windows的一些区别 1、Linux严格区分大小写——【Windows创建文件夹时不区分大小写】 2、Linux中所有内容都以文件形式存储&#xff0c;包括硬件 3、Linux不靠拓展名区分文件类型&#xff0c;而是可以通过读取文件开头的一些字节来区分。 但是在实际使用中一般要…

泉州网站模板建站3000部末年禁止无需下载

原想简单笼统介绍一下scala&#xff0c;后感觉这么做意思不大&#xff0c;网友看了和没看一样&#xff0c;还是应该稍微详细具体一点&#xff0c;故而把系列编号由(上)(中)(下)&#xff0c;改为(上)(2)(3)(4)(5)....,(上)就是(1)吧&#xff0c;以下内容部分节选于我们即将出版的…

企业网站建设 制作做局域网网站教程

文章目录 前言一、创建hdfs-demo项目1. 在idea上创建maven项目2. 导入hadoop相关依赖 二、常用 HDFS Java API1. 简介2. 获取文件系统实例3. 创建目录4. 创建文件4.1 创建文件并写入数据4.2 创建新空白文件 5. 查看文件内容6. 查看目录下的文件或目录信息6.1 查看指定目录下的文…

官方网站建设的目的阿里云域名查询系统

新建一个文件夹&#xff0c;再在新建的文件夹里写html文件&#xff0c;再用快捷键&#xff1a;altb打开即可。

网站群建设 效果网页界面模板设计

界面很简单&#xff0c;虽然是英文&#xff0c;但基本也能看懂&#xff0c;参数调一调&#xff0c;随机生成不重复的8K高清图片。 这种图片可能对普通人感觉很奇怪&#xff0c;有什么用呢&#xff1f;会C4D建模渲染的同学应该会明白&#xff0c;特别是建一些科技类的场景背景&a…

免费wap自助建站系统网站建设语言

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼题目要求是你输入a->b->c->d&#xff0c;然后存在内存里&#xff0c;然后改变在内存里的存储&#xff0c;改成存d->c->b->a&#xff0c;然后输出还是abcd&#xff0c;能不能就是用一个数组也存一份输入的&#x…

国外做图标网站qq电脑版网页登录入口

解决Java调用Python代码返回中文乱码问题 一、乱码原因分析 在Java调用Python代码执行时遇到乱码&#xff0c;我们的第一反应可能是检查文件编码设置是否一致。但在本例中&#xff0c;无论是Java还是Python&#xff0c;编码格式均已设为“UTF-8”&#xff0c;因此排除了编码不…

厦门网站建设方案维护网站开发技术服务合同

[css] 如果css文件过大时&#xff0c;如何异步加载它&#xff1f; 分割成多个CSS文件进行Gzip压缩link preload个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

织梦网站图片怎么修改不了cms网站下载

理论部分&#xff1a; 编写思路&#xff1a; GPIO 的地位跟其他模块&#xff0c;比如 I2C 、 UART 的地方是一样的&#xff0c;要使用某个引脚&#xff0c;需要先把引脚配置为 GPIO 功能&#xff0c;这要使用 Pinctrl 子系统&#xff0c;只需要在设备 树里指定就可以。在…

php模板网站企业网站经典案例

习惯性刷CSDN&#xff0c;发现了这么个主题&#xff0c;有意思。在我的字典里&#xff0c;“养生”这个条目已经被我删了。看过了太多的伪科学、贩卖焦虑、带货、自以为是&#xff0c;干脆眼不见为净。但程序员人均亚健康这句话真未必是个玩笑&#xff0c;所以还是凑个热闹聊上…

网站服务器速度对seo有什么影响闵行网站建设公司

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 前言 本文分享VTK样例GreedyTerrainDecimation,并解析接口vtkGreedyTerrainDecimation,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ…

网站备案名称的影响wordpress 删除边栏

事实上&#xff0c;红帽认证含金量在全球范围内都得到了广泛的认可和重视。许多企业和组织都将红帽认证作为招聘和选拔人才的重要标准之一。持有红帽认证的个人往往能够获得更好的职业机会和更高的薪资水平。此外&#xff0c;红帽认证还被许多政府机构、行业协会和教育机构所认…

制作网站制作网站建设的网站制作课程介绍

键盘和鼠标是与计算机交互的重要外围设备。有些人可能会争辩说,你只需要这些设备中的一个,但事实上,只使用其中一个设备的电脑可能非常困难。但是,如果你的鼠标或笔记本电脑的触控板突然停止工作,而你无法修复它或无法使用备用鼠标,该怎么办? 在这种情况下,你可以使用…

网站注册短信验证怎么做WordPress主题后门检测

优质回答 回答者&#xff1a;temps1991Java里try catch的简单用法&#xff1a;1、trycatch程序的流程是&#xff1a;运行到try块中&#xff0c;如果有异常抛出&#xff0c;则转到catch块去处理。然后执行catch块后面的语句扩展部分&#xff1a;1、trycatchfinally程序的流程是&…

网站建设的总体设计建网站哪家好行业现状

随着5G技术的快速发展&#xff0c;毫米波通信作为其中的一项重要技术&#xff0c;在高速数据传输、低延迟通信和大规模连接等方面具有显著的优势。本文将探讨5G毫米波通信中的关键技术&#xff0c;包括毫米波频段的选择、信号处理技术和MIMO技术等。 一、毫米波频段的选择 毫米…