选取MX25L25635F作为调试对象,其他型号的NorFlash开发调试原理基本一致。为了使V3/V3s/S3/S3L识别32MB NorFlash并正常工作,主要针对以下三个部分进行开发和调试。下文将针对这三个部分的开发进行说明。

  1. U-Boot
  2. Linux Kernel
  3. System Configuration

第一部分,U-boot

原始的SDK包支持3线模式,但没有支持4线模式,因此,必须在引导过程中加入4线模式。简单解释一下,3线模式是指NorFlash支持3x8位地址线,可以访问的地址空间是16MB(2^24/1024/1024),4线模式支持4x8位地址线,可以访问比16MB大的地址空间。找到源码文件drivers/spinor/sunxi_spinor.c,增加4线模式的使能函数。

  1. static void spinor_enter_4bytes_addr(int enable)
  2. {
  3. int command = ;
  4. if(spinor_4bytes_addr_mode == && enable == )
  5. command = 0xB7;
  6. else if(spinor_4bytes_addr_mode == && enable == )
  7. command = 0xE9;
    else
  8. return ;
    #ifdef CONFIG_ARCH_SUN8IW8P1
  9. spic_config_dual_mode(, , , );
  10. #endif
  11. spic_rw(, (void*)&command, , );
  12. return;
  13. }

需要注意的是,0xB7和0xE9不代码所有32MB NorFlash的4线模式进入/退出命令,应从datasheet中获取相应的命令值。接下来,找到spinor_init函数,回复flash size大于16MB的处理。

  1. if(spi_size > **/)
  2. {
  3. spinor_4bytes_addr_mode = ;
  4. spinor_enter_4bytes_addr(ENABLE_4BYTES);
  5. }

找到NorFlash读写函数__spinor_pp和__spinor_sector_normal_read,增加4线模式的数据读写代码片段。

  1. ------------写
  2. if(spinor_4bytes_addr_mode == )
  3. {
  4. txnum = len+;
  5. sdata[] = SPINOR_PP;
  6. sdata[] = (page_addr >> ) & 0xff;
  7. sdata[] = (page_addr >> ) & 0xff;
  8. sdata[] = page_addr & 0xff;
  9. memcpy((void *)(sdata+), buf, len);
  10. }
  11. else if(spinor_4bytes_addr_mode == )
  12. {
  13. txnum = len+;
  14. sdata[] = SPINOR_PP;
  15. sdata[] = (page_addr >> ) & 0xff;
  16. sdata[] = (page_addr >> ) & 0xff;
  17. sdata[] = (page_addr >> ) & 0xff;
  18. sdata[] = page_addr & 0xff;
  19. memcpy((void *)(sdata+), buf, len);
  20. }
  21. ------------读
  22. if(spinor_4bytes_addr_mode == )
  23. {
  24. txnum = ;
  25. sdata[] = SPINOR_READ;
  26. sdata[] = (page_addr >> ) & 0xff;
  27. sdata[] = (page_addr >> ) & 0xff;
  28. sdata[] = page_addr & 0xff;
  29. }
  30. else if(spinor_4bytes_addr_mode == )
  31. {
  32. txnum = ;
  33. sdata[] = SPINOR_READ;
  34. sdata[] = (page_addr >> ) & 0xff;
  35. sdata[] = (page_addr >> ) & 0xff;
  36. sdata[] = (page_addr >> ) & 0xff;
  37. sdata[] = page_addr & 0xff;
  38. }

最后需要在spinor_datafinish_card函数最后退出4线模式,这样做,刷机结束后,系统启动时才可以正确得到boot0,否则会重复刷机。

第二部分,Linux Kernel

内核部分的修改比较简单,在NorFlash设备驱动drivers/mtd/devices/m25p80.c中加入针对MX25L25635F这款32MB NorFlash的支持,如下:

  1. --- a/drivers/mtd/devices/m25p80.c
  2. +++ b/drivers/mtd/devices/m25p80.c
  3. @@ -, +, @@ static const struct spi_device_id m25p_ids[] = {
  4. { "mx25l1606e", INFO(0xc22015, , * , , SECT_4K) },
  5. { "mx25l3205d", INFO(0xc22016, , * , , ) },
  6. { "mx25l6405d", INFO(0xc22017, , * , , ) },
  7. - { "mx25l12805d", INFO(0xc22018, , * , , ) },
  8. + { "mx25l12805f", INFO(0xc22018, , * , , ) },
  9. { "mx25l12855e", INFO(0xc22618, , * , , ) },
  10. { "mx25l25635e", INFO(0xc22019, , * , , ) },
  11. { "mx25l25655e", INFO(0xc22619, , * , , ) },
  12. @@ -, +, @@ static int __devexit m25p_remove(struct spi_device *spi)
  13. }
  14.  
  15. +static int m25p_shutdown(struct spi_device *spi)
  16. +{
  17. + struct m25p *flash = dev_get_drvdata(&spi->dev);
  18. + const struct spi_device_id *id = spi_get_device_id(spi);
  19. + struct flash_info *info;
  20. + printk("m25p: spinor shutdown\n");
  21. +
  22. + if(flash->addr_width == )
  23. + {
  24. + info = (void *)id->driver_data;
  25. + set_4byte(flash, info->jedec_id, );
  26. + }
  27. + return ;
  28. +}
  29. +
  30. +
  31. static struct spi_driver m25p80_driver = {
  32. .driver = {
  33. .name = "m25p80",
  34. @@ -, +, @@ static struct spi_driver m25p80_driver = {
  35. .id_table = m25p_ids,
  36. .probe = m25p_probe,
  37. .remove = __devexit_p(m25p_remove),
  38. + .shutdown = m25p_shutdown,
  39.  
  40. /* REVISIT: many of these chips have deep power-down modes, which
  41. * should clearly be entered on suspend() to minimize power use.

第三部分,System Configuration

V3/V3s/S3/S3L这4个平台的SDK里面,U-Boot和Kernel都会调用sys_config.fex的Nor配置,需要将Nor Flash的大小修改成32,意思是32MB。

  1. @@ -, +, @@ max_speed_hz =
  2. bus_num =
  3. chip_select =
  4. mode =
  5. -sflash_size =
  6. +sflash_size =

完成上述三个环节的修改以后,依次编译U-Boot,Linux Kernel,最后打包Firmware,烧录到设备。

在全志V3/V3s和索智S3/S3L上调试32MB NorFlash的更多相关文章

  1. 将日志备份推送到s3存储上

    1.将日志备份推送到s3存储上 #!/bin/sh # 此脚本实现将/usr/local/netqin/boss/netqin/logs/BOSS_ContentServer/BOSS_AD_SDK ...

  2. aws s3文件上传设置accesskey、secretkey、sessiontoken

    背景: 最近跟进的项目会封装aws S3资源管理细节,对外提供获取文件上传凭证的API,业务方使用获取到的凭证信息直接请求aws进行文件上传.因此,测试过程需要验证S3文件上传的有效性.aws官网有提 ...

  3. 亚马逊S3下载上传文件

    引用网址: http://www.jxtobo.com/27697.html 下载 CloudBerry Explorer http://www.cloudberrylab.com/download- ...

  4. .NET快速信息化系统开发框架 V3.2->Web版本新增“文件管理中心”集上传、下载、文件共享等一身,非常实用的功能

    文件中心是3.2版本开始新增的一个非常实用功能,可以归档自己平时所需要的文件,也可以把文件分享给别人,更像一个知识中心.文件中心主界面如下图所示,左侧“我的网盘”展示了用户对文件的分类,只能自己看到, ...

  5. AWS S3 递归上传文件和递归下载文件, 以及S3之间拷贝文件夹

    1. 递归上传文件: aws s3 cp 本地文件夹 s3://bucket-name -- recursive --region us-east-1 2. 递归下载S3上的文件夹: cd  本地下载 ...

  6. Java连接S3并上传Redis

    package com.shinho.bigdatalake.redis; import com.amazonaws.regions.Region; import com.amazonaws.regi ...

  7. storj白皮书v3最全面解读,Docker创始人的加入能否扳倒AWS S3

    Storj新发了白皮书v3,地址是:https://storj.io/storjv3.pdf. 这次白皮书一共有90页,看完还真要费不少时间.如果你没有时间看,可以看一下我这篇快速技术解读. 上次St ...

  8. 小白自制Linux开发板(第二季 V3s篇) 一. 换个核心再来一次

    1.前言 大家心心念念(个人认为)的小白自制开发板全新系列正式来了,之前我们使用全志的F1C200s芯片制作了一个小电脑,众所周知,调试很艰难,坑也很多,以至于墨云到现在还是没找到对应的补救方案,为了 ...

  9. NetworkComms V3 之同步收发数据

    NetworkComms网络通信框架序言 NetworkComms通信框架,是一款来自英国的c#语言编写的通信框架,历时6年研发,成熟稳定,性能可靠. NetworkComms v3的核心功能在一定程 ...

随机推荐

  1. 微信开发——微信公众平台实现消息接收以及消息的处理(Java版)

    本文主要讲述了如何在微信公众平台实现消息接收以及消息的处理,使用java语言开发,现在把实现思路和代码整理出来分先给兄弟们,希望给他们带来帮助. 温馨提示: 这篇文章是依赖前几篇的文章的. 第一篇:微 ...

  2. Python初学者第十四天 三元运算及文件处理2

    14day 1.三元运算: 又称三目运算,是对简单的条件语句的简写 如简单条件语句: if a > b: n = a else: n = b print(n) 三目运算语句: n = a if ...

  3. 第三次作业 史浩然 -assassin Talon

  4. 从Vue-router到html5的pushState

    最近在用vue的时候突然想到一个问题 首先,我们知道vue实现的单页应用中一般不会去刷新页面,因为刷新之后页面中的vuex数据就不见了. 其次,我们也知道一般情况下,url变更的时候,比如指定loca ...

  5. BZOJ 1588 营业额统计 set

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1588 题目大意: 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交 ...

  6. mvvm模型

  7. Java工具类(util) 之01- 数学运算工具(精确运算)

    数学运算工具(精确运算) /** * * @author maple * */ public abstract class AmountUtil { private AmountUtil() { } ...

  8. leetcode shell

    leetcode 195. 第十行 # | | 第一种是先取出前10行,然后取出最后一行.(但是不足10行,也可以取出最后一行) 正解: tail -n +K :从第K行取出所有 然后取出第一行 le ...

  9. 【[GDOI2014]拯救莫莉斯】

    可能我的状态比较鬼畜,应该没有人这么写 设\(dp[i][j][k]\)表示在第\(i\)行,放置油库的状态为\(j\),实际上周围已经有油库或者本身有油库的状态为\(k\)的时候的最小花费 由于我们 ...

  10. 如何彻底修改eclipse中的名称

    一.右键工程:Refactor->Rename,或选中工程按F2,修改名称二.修改项目目录下:.project文件 <?xml version="1.0" encodi ...