开发板使用手册 让研发速度快上加快
更新包含了开发环境搭建、系统编译与烧写和pmon基础知识、启动流程分析、网络加载系统、烧写系统到nand以及新增pmon 移植教程、新增pmon下操作gpio章节和pmon下ejtag使用章节等。
pmon 支持俩种接口类型的 nand flash,一个是 nand 控制器接口,一个是 spi 接口。龙芯核心板上板载了一个 nand 控制器接口的 flash。
9.9.11.1 配置 pmon
首先我们需要在 pmon 里面添加对 nand 的支持,那么我们都要配置哪些内容呢?这个要从 pmon 的启动流程入手,pmon 在启动的时候是在 targets/ls2k/ls2k/tgt_machdep.c 里调用 ls2k_nand_init()函数对 nand 进行初始化的, 如果我们要调用 ls2k_nand_init()函数,就需要定义宏定义 nnadn 和 config_ls2k_nand, 其中 nnadn 的值在 targets/ls2k/compile/ls2k/m25p80.h 中定义为 1,
所以我们只需要在 targets/ls2k/conf/ls2k 文件中添加代码 option config_ls2k_nand 即可,这里我们添 加到第 269 行,
在 pmon 默认的 bsp 中,默认添加了代码 select nand,所以这里我们不必要在添加代码 select nand,而select 指定的是后面的参数 nand 被选中,选中了 nand 参数以后,在 conf/files 文件中使用 file 指定的 c 文件就可以被编译到 pmon 里面。因为 file 指定的文件编译与否取决于后面的参数有没有被选中,needs-flag 表示为该文件生成头文件。
然我们回过头再来看条件编译的这部分代码,
如果我们定义了 nnand 和 config_ls2k_nand,就是执行*(volatile int *)0xbfe10420 |= (1<<9) 代码将gpio 的管教复用设置为 nand,,如果没用定义这俩个宏定义,就将复用关系设置为 gpio,如下图所示:
如果定义了这俩个宏定义,接着就会调用 ls2k_nand_init 函数来初始化 nand,我们跳转到 ls2k_nand_init 函数定义的 sys/dev/nand/ls2k-nand.c 驱动文件,通过阅读代码我们可以找到对 mtd 结构初始化的驱动函数为 ls2k_nand_init_mtd,通过访问 mtd 就可以访问 nand 控制器,
在 ls2k_nand_init_mtd 函数中,最关键的是对 ecc 的选择,在 pmon 中默认的 ecc 有 nand_ecc_soft 和 nand_ecc_soft_bch 俩种。bch 校验比 ecc 校验有更强的纠错能力,龙芯 bsp 里面默认使用的是 ecc 校验,代码如下:
如果我们需要使用 bch 校验,需要在在 targets/ls2k/conf/ls2k 中定义 select nand_bch,,这个我们选择 bch 校验,如下图所示:
9.9.11.2 配置分区
在 nand 初始化最后的步骤会建立分区信息,建立分区信息的逻辑是先会调用 nand_flash_add_parts 函
数对环境变量 mtdparts 进行判断,mtdparts 环境变量在 targets/ls2k/include/pmon_target.h 中定义,
如 果 环 境 变 量 mtdparts 中 设 置 了 分 区 信 息 , 则 调 用 add_mtd_device 来 指 定 分 区 , sys/dev/nand/ls2k-nand.c 中代码如下:
环境变量 mtdparts 中的值我们要怎么设置呢?
这里环境变量的设置我们要和 pmon 里面设备树的保持一致,打开 targets/ls2k/conf/ls2k.dts 设备树文件,找到 nand 节点,其中 nand 节点的子 partition 节点表示的是分区信息,如下图所示:
其中:
compatible = loongson,ls-nand; 表示匹配驱动所使用的属性。
reg = ; 表示控制寄存器的地址和长度,其中 0x1fe06040 是
nand_dma_addr_reg 的地址。 地址 0x1fe06000 是 nand_cmd 的地址。长度均为 0x20。
interrupt-parent = ; 中断控制器是 icu
interrupts = ; 分配中断号为 52
interrupt-names = nand_irq; 中断名称
dmas = ; 表示使用 dma0 控制器,通道数为 1
dma-names = nand_rw; dma 控制器名称
dma-mask = ; 表示设备 dma 能力,如果设备只有 32 位 dma 能力,则应该配置成
0x00xffffffff,如果设备有 64 位 dma 能力,则应该配置成 0xffffffff 0xffffffff
number-of-parts = ; 表示分区数量,这里设置成俩个分区
partition@0 {
label = kernel_partition;
reg = ;
};
分区 0,分区名称为 kernel_partition,其中分区起始地址为 0x0000000,分区长度为 0x01e00000。
partition@0x01400000 {
label = os_partition;
reg = ;
};
分区 1,分区名称为 os_partition,其中分区起始地址为 0x01e00000,分区长度为剩余所有空间。
这里我们需要修改 partition@0 和 partition@0x01400000 子节点。这里我们把内核的分区大小设置 成 30m,剩余的 482m 给文件系统。
接着我们需要添加片选信息。一般情况下根据硬件设计规范,flash 的片选会接到 cs0 上,通过原理图我们可以确定,片选引脚连接到了 cs0 上,如下图所示:
但是设备树我们要怎么写呢?这个就需要我们去看驱动源码了,我们打开内核源码
drivers/mtd/nand/ls-nand.c 下的 nand 控制器的驱动,在第 637 行我们可以看到他是通过 nand-cs 来获取的片选信息,
所以我们在设备树中添加属性 nand-cs=;,添加完成如下图所示:
这样,pmon 下的设备树我们就设置好了,然后我们回过头在来设置环境变量 mtdparts,要与设备树中我们设置的保持一致,修改完成如下图所示:
这样 pmon 对 nand 的设置就已经完成了。
支持全部窄带电力线通信标准的调制解调器
河南5G的推进步伐神速
宝马升级i3动力系统,下一代i产品最早有望于2021年亮相!
格力“芯”事!董明珠与格力电器仍将深度绑定
海尔优家APP正式启用远程可视化服务,智能家电进入快速普及阶段
国产软硬件龙芯系列迅为2K1000开发板配置 nand flash
推荐给大家一款高性价比的LoRa物联网网关
电动机哪一种能够更加精准的控制
电话自动外呼系统,自动语音以通知软件,电话自动催费系统
OLED领域不得势!索尼松下联合开发OLED技术
苹果市值首次冲关一万亿美元受挫
LTM9001可实现具不同带宽的低通或带通滤波器网络
电缆外护层的结构组成是怎样的,它的作用是什么
高芯科技携多款消费电子领域红外产品亮相CES 2024
使用陶瓷电容需要注意哪些事项
世界主要国家和地区网络空间竞争的主要举措与政策建议
相约艾睿电子技术解决方案展,探讨科技无限可能
特斯拉起诉前工程师窃取软件代码文件,后者:误上传
自然语言对话工具将人工智能跨越裂谷的关键之一
TFT-LCD电容触摸屏模块(RGB接口)时序描述