搜索
bottom↓
回复: 41

stm32 uclinux遇到的问题,ST官方发布的an3012包中的“kernel_boot_loader.hex”有源

[复制链接]

出0入0汤圆

发表于 2010-12-28 01:15:12 | 显示全部楼层 |阅读模式
最近自己画了一块板子,配制是:
AM29LV641D NOR flash 8M Byte
IS61LV51216    SRAM  1M Byte
外部存储器的地址线和片选信号线都是按官方电路图接的,只是用的nor flash型号不同,自己移植了官方提供的例程后支持了自己板子上的AM29LV641D的8M flash,可以正常下载而且能将程序放到外部的flash和SRAM中运行?我按官方uclinux on stm32文档步骤操作,将镜像下载到外部NOR flash中但uclinux起动不了,一条打印信息都没有。我对uclinux内核起动的汇编文件单独调试,STM32 CPU ID检测能通过,但是平台检测就不通过了 这段汇编如下:
/*
* Lookup machine architecture in the linker-build list of architectures.
* Note that we can't use the absolute addresses for the __arch_info
* lists since we aren't running with the MMU on (and therefore, we are
* not in the correct address space).  We have to calculate the offset.
*
*  r1 = machine architecture number
* Returns:
*  r3, r4, r6 corrupted
*  r5 = mach_info pointer in physical address space
*/
__lookup_machine_type:
        adr        r3, 3b
        ldmia        r3, {r4, r5, r6}
        sub        r3, r3, r4                        @ get offset between virt&phys
        add        r5, r5, r3                        @ convert virt addresses to
        add        r6, r6, r3                        @ physical address space
1:        ldr        r3, [r5, #MACHINFO_TYPE]        @ get machine type
        teq        r3, r1                        @ matches loader number?(我屏蔽了这句之后,一会儿就发生硬异常了)
        beq        2f                        @ found
        add        r5, r5, #SIZEOF_MACHINE_DESC        @ next machine_desc
        cmp        r5, r6
        blo        1b
        mov        r5, #0                @ unknown machine 我的板子执行了这句
2:        mov        pc, lr
ENDPROC(__lookup_machine_type)

r5=0了之后就跳到了 __error_a  /* __error_a是一个死循环 */

我想可能是flash型号不同缘故,所以想看ST官方发布的uclinux on stm32的an3012包中的“kernel_boot_loader.hex”的源码,看看它是怎么引导内核的,但“kernel_boot_loader.hex”的源码找不到地方下载。我有个想法就是移植uboot,ST发布的uclinux方案是在NOR flash上运行的内核不需要自解压也不需要拷贝到内存当中运行,这样不是不省去了很多麻烦。不知可不可行。有没有人做过呢?这是我QQ 461207084。


支持自己的板子上的NOR flash下载,并且可以在NOR中运行程序,但不能起动uclinux (原文件名:sdf.JPG)


下载官方的kernel_boot_loader.hex或Tiny_kernel_boot_loader.hex的官方开发板上的flash (原文件名:guan.JPG)


keil中也制作了自己板子flash算法,可正常下载运行程序。 (原文件名:k.JPG)

这是ST官方发布的uclinux开发包,但在我的板子上运行不起来ourdev_607549Z0NA4G.rar(文件大小:2.82M) (原文件名:an3012.rar)

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2010-12-28 01:16:57 | 显示全部楼层
上面那段汇编是uclinux内核起动代码,是对开发板平台检测部份,在打了ST发布的补丁后的uclinux源码包中\uClinux-dist\linux-2.6.x\arch\arm\kernel\目录下的head-common.S和head-nommu.S下可以找到

出0入0汤圆

发表于 2010-12-28 10:12:53 | 显示全部楼层
关注。以后也想上uclinux。

顺便问一下1MB的RAM,在跑UCLINUX后能剩下多少?


STM32能再扩RAM到2MB以上么?

出0入0汤圆

发表于 2010-12-28 10:25:30 | 显示全部楼层
强帖留名

出0入0汤圆

发表于 2010-12-28 10:32:38 | 显示全部楼层
同关注

出0入0汤圆

 楼主| 发表于 2010-12-28 14:23:56 | 显示全部楼层
回复二楼,STM32能再扩RAM到2MB以上么?
STM32 cortex m3内核采用哈佛结构的ARMv7体系结构,主频72M,可以超频到128M(运行UCOS测试过,很稳定,S3C44b0才66MHZ),且片外有丰富的外设,这些都是一般ARM7不能比的,但不支持SDRAM是它最大的缺点。
STM32的FSMC总线每个Bank地址线是A[25:0]共26位,数据线是16位,就是说每个bank最多可以外扩128M Byte的RAM,只是没有那么大的SRAM芯片而己,现在1M的SRAM就要80元,512K的只要十几元。
想外扩2M RAM以上有两种方法:
1.可以用74系列数字芯片3-8线译码器将8片512K 的SRAM级连成4M就行。
2.当前SDRAM比较便宜,32M Byte也就20块钱不到。可以用CPLD+SDRAM转换SDRAM接口,使FSMC总线支持SDRAM。
目前我的板子上就是采用这种方法FSMC+CPLD+SDRAM。板子上SDRAM是32M Byte的,FSMC可以通过CPLD正常读写SDRAM,当前测试uclinux最小系统起动,没有用上SDRAM而己,准备成功后再将32M加上去给uclinux用,到时就可以为所欲为了,呵呵。现在uclinux最小系统都起动不了郁闷当中……

板子上用的CPLD是144脚的EPM570 (原文件名:cpld.JPG)

出0入0汤圆

 楼主| 发表于 2010-12-28 15:41:13 | 显示全部楼层
回复【2楼】wu0232
-----------------------------------------------------------------------

1.可以用74系列数字芯片3-8线译码器将8片512K 的SRAM级连成4M就行。
2.当前SDRAM比较便宜,32M Byte也就20块钱不到。可以用CPLD+SDRAM转换SDRAM接口,使FSMC总线支持SDRAM。

出0入0汤圆

发表于 2010-12-28 15:51:11 | 显示全部楼层
谢谢兄弟这么详细的讲解。

原来兄弟是用CPLD+SDRAM

那用2MB以上的PSRAM行不行?貌似接口和SRAM一样的。

出0入0汤圆

发表于 2010-12-28 15:56:25 | 显示全部楼层
另外,突然想起,CPLD+SDRAM,其实和有种“单片机显卡”类似,也是CPLD+SDRAM ?

出0入0汤圆

 楼主| 发表于 2010-12-28 18:49:10 | 显示全部楼层
回复【7楼】wu0232
谢谢兄弟这么详细的讲解。
原来兄弟是用cpld+sdram
那用2mb以上的psram行不行?貌似接口和sram一样的。
-----------------------------------------------------------------------

PSRAM内部结构和SDRAM相似,芯片接口和SRAM相似,但容量和速度都比不上SDRAM,不管用什么RAM都要对FSMC总线进行相应的初始化才行。这都要找到kernel boot loader.hex的源码才行。除非你用ST官网开发板上的相同型号的器件。

出0入0汤圆

发表于 2010-12-29 20:40:51 | 显示全部楼层
官方的kernel_boot_loader源码没有公开,
可以自己写一个,或者用M29W128系列NOR FLASH

出0入0汤圆

 楼主| 发表于 2010-12-29 23:29:19 | 显示全部楼层
回复【10楼】xi_liang
官方的kernel_boot_loader源码没有公开,
可以自己写一个,或者用m29w128系列nor flash
-----------------------------------------------------------------------
众所周知 boot loader把执行权交给linux时通过CPU寄存器给linux传递了参数,你知道ST官网的kernel_boot_loader传了什么给内核么?
我在\linux-2.6.x\arch\arm\tools下找到了机器码,
stm3210e_eval                ARCH_STM3210E_EVAL        STM3210E_EVAL                2189
    通过自己在Keil下写的一个假的boot loader把机器码给它传过去,结果平台检测通过,但串口还是没有打印信息,且运行不到1秒钟出现总线访问异常。

出0入0汤圆

 楼主| 发表于 2010-12-30 19:34:47 | 显示全部楼层
stm32 on uclinux今天刚刚调出来了,uclinux可以在外部NOR flash起动。之前系统一直起动不了是因为我板子上用了CPLD,我板子上FSMC总线是通过了CPLD才访问外部存储器的,ST官方开发板对FSMC总线初始化只用了A[21:0],而我考虑到以后的扩展,把A[25:0]也都用进去了,所以A[25:22]这几根多余的信号线导致CPLD内部逻辑误动作,使FSMC总线访问外部存储器错误,这样一来,实际上SRAM一直都没用上,导致系统起动不了。我之前测试外部SRAM时也是把所有的FSMC地址线都都初始化了,那样当然可以正常访问SRAM啦,所以问题一直没发现,现在我屏蔽掉A[25:22]这几根多余信号线,系统正常起动了。

    可以不用和官方同型号的NOR flash,不过要自己做flash烧写工具,把自己写的代码下载芯片里对NOR flash进行烧写后,还要再把ST官方的boot loader下到芯片里去引导linux内核,好麻烦啊,没有uboot爽。

uclinux在外部NOR flash中运行,只能试用几个简单的命令。 (原文件名:现象.JPG)

出0入0汤圆

发表于 2010-12-30 22:32:34 | 显示全部楼层
恭喜啊。

1MB的SRAM,能剩下多少?

出0入0汤圆

 楼主| 发表于 2010-12-30 23:23:08 | 显示全部楼层
回复【13楼】wu0232
-----------------------------------------------------------------------

platform Initialisation finished jumping to kernel.
Linux version 2.6.26-uc0 (stm32@localhost.localdomain) (gcc version 4.3.3 (Sourcery G++ Lite 2009q1-163) ) #1 Wed Sep 2 09:58:32 UTC 2009
CPU: ARMv7-M Processor [411fc231] revision 1 (ARMv?(11)M)
Machine: STM3210E-EVAL
SRAM Config: bank[0] @ 0x68000000 (size: 1024KB) - bank[1] @ 0x20000000 (size: 64KB).
Built 1 zonelists in Zone order, mobility grouping off.  Total pages: 254
Kernel command line: noinitrd root=mtd1 ro rootfstype=jffs2 init=/linuxrc console=ttyS0
PID hash table entries: 16 (order: 4, 64 bytes)
console [ttyS0] enabled
Dentry cache hash table entries: 1024 (order: 0, 4096 bytes)
Inode-cache hash table entries: 1024 (order: 0, 4096 bytes)
Memory: 1MB 0MB = 1MB total
Memory: 980KB available (436K code, 55K data, 8K init)  //内存共980K可用,代码436K,数据55K,8K用于初始化
Mount-cache hash table entries: 512
JFFS2 version 2.2. 漏 2001-2006 Red Hat, Inc.
simple-gpio: now handling 16 GPIOs: 0 - 15
ttyS0 at MMIO 0x40013800 (irq = 37) is a STM32 USART1 Port
Probed and found the STM3210E-EVAL NOR flash chip
Creating 4 MTD partitions on "M29W128F NOR FLASH":
0x00000000-0x00100000 : "Kernel raw data"
0x00100000-0x00160000 : "rootfs"
0x00160000-0x00190000 : "rawdata"
0x00190000-0x001c0000 : "cramfs_partition"
rtc-stm3210e_eval rtc-stm3210e_eval.0: rtc core: registered rtc-stm3210e_eval as rtc0
rtc-stm3210e_eval rtc-stm3210e_eval.0: setting system clock to 1970-01-01 00:30:58 UTC (1858)
VFS: Mounted root (jffs2 filesystem) readonly.
Freeing init memory: 8K        //初始化完又释放8K
Mounting proc fs
Mounting sysfs
Welcome to

       ____ _  _

      /  __| ||_|

_   _| |  | | _ ___   _   _ _    _

| | | | |  | || |  _ \| | | |\ \/ /

| |_| | |__| || | | | | |_| |/    \

| ___ \____|_||_|_| |_|\____|\_/\_/

| |

|_|

For further information check:

http://www.uclinux.org/

http://www.st.com/stm32

/ #

出0入0汤圆

发表于 2010-12-31 08:50:09 | 显示全部楼层
不是很明白LINUX,多问问

可用内存还有980KB?不会这么多吧?

出0入0汤圆

发表于 2011-1-1 21:32:08 | 显示全部楼层
436K code,uclinux是在sram里运行的吗?
能否配置使用XIP的?

出0入0汤圆

发表于 2011-1-5 14:14:05 | 显示全部楼层
mark

出0入0汤圆

 楼主| 发表于 2011-2-23 21:16:57 | 显示全部楼层
https://my.st.com/public/STe2ecommunities/mcu/Lists/ARM%20CortexM3%20STM32/Flat.aspx?RootFolder=%2Fpublic%2FSTe2ecommunities%2Fmcu%2FLists%2FARM%20CortexM3%20STM32%2FStm32%20Uclinux%20bootloader&FolderCTID=0x01200200770978C69A1141439FE559EB459D758000626BE2B829C32145B9EB5739142DC17E&currentviews=740#{54F2BE06-5BA9-4619-B40F-DB0B14C2ABE6}
https://my.st.com/public/STe2ecommunities/mcu/Lists/ARM%20CortexM3%20STM32/Flat.aspx?RootFolder=%2Fpublic%2FSTe2ecommunities%2Fmcu%2FLists%2FARM%20CortexM3%20STM32%2FSource%20code%20for%20the%20uCLinux%20bootloaders&FolderCTID=0x01200200770978C69A1141439FE559EB459D758000626BE2B829C32145B9EB5739142DC17E&currentviews=184

出0入0汤圆

发表于 2011-7-21 23:08:52 | 显示全部楼层
1M 的SRAM好贵啊。。。

出0入0汤圆

发表于 2011-7-21 23:10:30 | 显示全部楼层
1M 的SRAM好贵啊。。。

出0入0汤圆

发表于 2011-7-24 20:46:02 | 显示全部楼层
mark

出0入0汤圆

 楼主| 发表于 2011-10-14 13:05:17 | 显示全部楼层
“kernel_boot_loader.hex”虽然ST官方没有开源,但可以自己写出来。

出0入0汤圆

发表于 2011-10-14 13:44:19 | 显示全部楼层
顶!楼主自己写出来了吗?楼主这个板子已经验证成功了吗?
用cpld来扩sdram!

出0入0汤圆

发表于 2011-10-14 23:47:51 | 显示全部楼层
请问cpld和stm32,sdram的接线图是怎么样的!。
现在这样运行系统怎么样》?

出0入0汤圆

发表于 2011-10-17 10:43:02 | 显示全部楼层
呵呵,纯属玩具,没有任何实际用途

如果要支持sdram,楼主锁说的cpld+sdram,首先用cpld实现一个稳定的sdram controller不是那么简单的,如果要用商业的,花10K以上的美金估计是少不了的。如果自己做,你除非是高手,否则如何保证自己开发的sdram controller的可靠性稳定性?

另外,楼主只知到stm32是72MHZ的,什么armv7架构,比44b0主频高,架构好。但却不知道stm32的72mhz并没有吹的那么快,据说stm32 72mhz还不如TI lm3s 50mhz跑的快(网上有人评测过,可信度如何我不知道,但有这一说);另一个关键的是很多arm7虽然主频低,但他有cache,我不记得44b0是否有cache,估计是有的,有cache和没cache对性能的影响是数量级的。我测过2440跑400mhz时候,不开cache其sdram访存性能比mcf52259 80mhz的mcu慢几倍。所以不要说stm32+sdram怎么怎么快,我可以相当肯定,不会快的,肯定慢!

如果真要上uclinux,与其费这么大力气做个可靠性性能都全无保障的玩具,不如直接上2440之类的,成本也不会比这个做法高,但可靠性,性能则会远强于楼主这种玩法

出0入0汤圆

 楼主| 发表于 2011-10-17 11:58:26 | 显示全部楼层
回复【27楼】bluehacker
呵呵,纯属玩具,没有任何实际用途
如果要支持sdram,楼主锁说的cpld+sdram,首先用cpld实现一个稳定的sdram controller不是那么简单的,如果要用商业的,花10k以上的美金估计是少不了的。如果自己做,你除非是高手,否则如何保证自己开发的sdram controller的可靠性稳定性?
另外,楼主只知到stm32是72mhz的,什么armv7架构,比44b0主频高,架构好。但却不知道stm32的72mhz并没有吹的那么快,据说stm32 72mhz还不如ti lm3s 50mhz跑的快(网上有人评测过,可信度如何我不知道,但有这一说);另一个关键的是很多arm7虽然主频低,但他有cache,我不记得44b0是否有cache,估计是有的,有cache和没cache对性能的影响是数量级的。我测过2440跑400mhz时候,不开cache其sdram访存性能比mcf5......
-----------------------------------------------------------------------

    你说的很不错我就是搞的玩的,没什么实用性,我只是时间多,无聊而已,CPLD主要控制SDRAM自刷新,并将SDRAM接口转换成Intel8086的CPU接口,接口时序中间插入了等待信号,这样一来虽然不是标准的SRAM接口,但STM32的FSMC总线支持等待信号,只要给STM32的FSMC相应配制,STM32却能正常的访问SDRAM,你说的很不错由于没有cache,速度确实没有SRAM快,不过你要知道,FSMC支持突发访问,SDRAM也有突发模式,这样速度也没有你想象的那么慢。

出0入0汤圆

发表于 2011-10-17 13:15:30 | 显示全部楼层
顶一下“玩”的
严重支持 :P

出0入0汤圆

发表于 2011-10-17 14:35:17 | 显示全部楼层
mark!

出0入0汤圆

发表于 2011-10-18 22:02:57 | 显示全部楼层
楼主的cpld接sdram是怎么接的?能把那部分图开源吗?

出0入0汤圆

 楼主| 发表于 2011-10-20 13:47:04 | 显示全部楼层
kernel_boot_loader.hex 源码早就写出来了,好长时间没看帖子,没想到这么多人关注并深爱着stm32,感动中......

自制的cortex m3 bootloader (原文件名:涂改bootloader.JPG)


起动uclinux (原文件名:stm32_uclinux.JPG)

出0入0汤圆

发表于 2011-10-20 15:39:50 | 显示全部楼层
呵呵!顶!这个kernel_boot_loader.hex是u-boot的移植吗?

出0入0汤圆

发表于 2011-10-20 21:53:22 | 显示全部楼层
一直尝试去搞Linux。。。不过一直都觉得很麻烦。。。

出0入0汤圆

发表于 2012-4-27 18:33:37 | 显示全部楼层
这样的高手不得不顶啊

出50入0汤圆

发表于 2012-8-14 22:21:02 | 显示全部楼层
留个记号,也许以后会有用。

出0入0汤圆

发表于 2012-8-15 10:22:28 | 显示全部楼层
楼主很强啊,玩cpld比较麻烦

出0入0汤圆

发表于 2012-8-24 17:56:43 | 显示全部楼层
支持你的

出0入0汤圆

发表于 2012-8-28 15:46:43 | 显示全部楼层
longonly120 发表于 2010-12-28 14:23
回复二楼,STM32能再扩RAM到2MB以上么?
STM32 cortex m3内核采用哈佛结构的ARMv7体系结构,主频72M,可以 ...

努力啊,期待中......

出0入0汤圆

发表于 2012-11-5 13:32:01 | 显示全部楼层
LZ可以发个教程了,STM32F4上应该跑得快很多。

出0入0汤圆

发表于 2012-11-5 14:00:12 来自手机 | 显示全部楼层
就stmf1的fsmc速度,代码内存都挂上面,那真的是一夜回到解放前了,实际速度上10dmips就烧高香了。。。。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-20 16:45

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表