0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Linux NOR开发指南

嵌入式Linux那些事 来源:嵌入式Linux那些事 作者:嵌入式Linux那些事 2023-03-06 09:55 次阅读

Linux NOR 开发指南

1 简介

编写目的

此文档描述Sunxi NOR 模块的使用方法,为相关人员调试提供指导

适用范围

boot0: 适用于brandy-2.0

u-boot: 适用于u-boot-2018

kernel: 适用于linux-4.9/linux-5.4 内核

BSP 的开发人员、测试人员

2 模块介绍

2.1 模块功能介绍

Linux 中SPINOR 体系结构如下图所示:

poYBAGQFR_SAdEauAABZARRWkR0112.png

SPI NOR Framework:这层主要是处理不同厂家的NOR 物理特色差异,初始化SPINOR的工作状态,如工作线宽(1 线、2 线、4 线、8 线)、有效地址位(16M 以上的NOR 需要使用4 地址模式),为上层MTD 提供读写擦接口

对应代码目录:drivers/mtd/spi-nor/spi-nor.c

M25P80(generic SPI NOR controller driver):这层主要对SPI NOR Framework

层传下来的数据封装成msg,传递给SPI framework 层。

对应代码目录:drivers/mtd/devices/m25p80.c

SPI Framework:这层主要是将msg 加入ctl 的工作队列中,启动内核线程队列,处理队列

中的msg。

对应代码目录:drivers/spi/spi.c

SPI controller driver:这层初始化SPI 控制器频率、时钟模式、cs 有效电平、大小端等

配置,同时处理上层传下来的msg,通过CPU/DMA 方式传输数据到FIFO,再传输给外设

SPINOR。

对应代码目录:drivers/spi/spi-sunxi.c

2.2 相关术语介绍

术语 解释说明
Sunxi 指Allwinner 的一系列SOC 硬件平台
SPI Serial Peripheral Interface,同步串行外设接口
NOR Flash NOR Flash 是一种非易失闪存威廉希尔官方网站 ,是Intel 在1988 年创建
MTD MTD(memory technology device 内存威廉希尔官方网站 设备) 是用于访问memory 设备(ROM、flash)的Linux 的子系统

2.3 模块配置介绍

2.3.1 longan 的配置和打包

./build.sh config

All available platform:

0. android

1. linux

Choice [linux]: 1

... //配置根据需求选择

All available flash: //flash类型,只区分nor和非nor方案,Android方案无此选项,默认非nor

0. default

1. nor

Choice [default]: 1

打包普通固件

#./build.sh clean

#./build.sh

#./build.sh pack

打包卡打印固件

#./build.sh clean

#./build.sh

#./build.sh pack_debug

在配置的过程中会把平台目录下的BoardConfig.mk 的信息拷贝到.buildconfig 中。

2.3.2 sys_config 配置

SPINOR 的boot0 启动阶段,部分参数是从boot0 头部获取的,而这些参数是我们在打包固件时,通过工具update_boot0 将sys_config.fex 中[spinor_para],更新到boot0 头部的,sys_config.fex 的[spinor_para] 配置参数如下:

[spinor_para]

;readcmd =0x6b

;read_mode =4

;write_mode =4

;flash_size =16

;delay_cycle =1

;frequency =100000000

;erase_size =64

;lock_flag =0

;sample_delay =0

;sample_mode =2

spi_sclk = port:PC00<4><0><2>

spi_cs = port:PC01<4><1><2>

spi0_mosi = port:PC02<4><0><2>

spi0_miso = port:PC03<4><0><2>

spi0_wp = port:PC04<4><0><2>

spi0_hold = port:PC05<4><0><2>

其中:

readcmd:boot0 用于读取数据的命令,不填默认用uboot 传递过来的readcmd

read_mode、write_mode:boot0 的工作线宽(1、2、4),不填默认更加readcmd 决

定线宽

flash_size:flash 的大小

delay_cycle:boot0 的采样延时配置,大于60MHZ 配置为1,小于24MHZ 配置为2,

大于24MHZ 小于60HZ 配置为3

frequency:boot0 的SPI 工作频率,不填使用默认值50M

erase_size:boot0 的擦除单位

lock_flag:锁功能是否打开

sample_delay:boot0 的细调采样的采样延时,uboot、kernel 也会用到,默认不填等于

0xaaaaffff

sample_mode:boot0 的细调采样的采样模式,uboot、kernel 也会用到,默认不填等于

0xaaaaffff

spi_sclk、spi_cs、spi0_mosi、spi0_miso、spi0_wp 和spi0_hold 用于配置相应的GPIO。

2.3.3 UBOOT 配置

2.3.3.1 编译和配置

#make clean

#make sun8iw19p1_nor_config ----启动的uboot (#make sun8iw19p1_config----烧写uboot)

#make -j32

2.3.3.2 Menuconfig 配置

#cd brandy/brandy-2.0/u-boot-2018

#make menuconfig

进入Device Drivers

Device Drivers ----> [*]SPI Suppport ----> [*]Sunxi flash support ---->

pYYBAGQFR_SAJPQwAAB6DLrEbws832.png

进入SPI Support

Device Drivers ----> [*]SPI Suppport ----> [*]Sunxi SPI driver

poYBAGQFR_WAKlpmAABDplKsBKw729.png

进入sunxi_flash_support

Device Drivers ----> [*]Sunxi flash support ----> [*]Support sunxi spinor devices

pYYBAGQFR_WAQvAXAAA7eGRi4l8540.png

2.3.4 KERNEL 配置

2.3.4.1 SPINOR-驱动配置

#cd kernel/liunx-4.9 #make ARCH=arm menuconfig

进入Device Drivers

Device Drivers ----> <*>Memory Technology Device (MTD) support ----> [*]SPI support ---->

pYYBAGQFR_aAfWDgAAB44oKIlMs513.png

进入Menory Technology Device(MTD) support

Device Drivers ----> <*>Memory Technology Device (MTD) support ----> <*>SUNXI partitioning support <*>Direct char device access to MTD devices <*>Caching block device access to MTD devices Self-contained MTD device drivers ----> SPI-NOR device support ---->

poYBAGQFR_eAFSZLAABtAhw5HUg252.png

进入Self-contained MTD device drivers(5.4 内核不需要选择此项)

Device Drivers ----> <*>Memory Technology Device (MTD) support ----> Self-contained MTD device drivers ----> <*>Support most SPI Flash chips (AT16DF, M25P.....)

pYYBAGQFR_eAatGbAABPA6sY148898.png

2.3.4.2 cmdline 方式选择

Boot opttions ---->

poYBAGQFR_iABJycAABUBYHZkCY778.png

进入Boot options

Boot opttions ----> Kernel command line type ---->

pYYBAGQFR_iAP7BFAABtT_HFxww019.png

进入kernel command line type

Boot opttions ----> Kernel command line type ----> (X)Use bootloade kernel arguments if available

poYBAGQFR_mARJpGAAAx85ssslE355.png

2.3.4.3 文件系统配置

进入File systems

File system ----> [*]Miscellaneous filesystems ---->

pYYBAGQFR_mAPBxLAABBVqHNBKg634.png

• 进入Miscellaneous filesystems • Incluede support for ZLIB compressed file systems (NEW) • Incluede support for LZ4 compressed file systems (NEW) • Incluede support for LZO compressed file systems (NEW) • Incluede support for XZ compressed file systems (NEW)

File system ----> [*]Miscellaneous filesystems ----> [*]Incluede support for XZ compressed file systems (NEW)(压缩方式选择如下)

poYBAGQFR_qADRTgAABYyQy1i-M766.png

以上的压缩方式(ZLIB/LZ4/LZO/XZ)具体选择哪一种需要根据longan/build/mkcmd.sh 中如下代码使用的压缩方式而定,如下代码使用的是gzip 压缩方式,则内核File systems 中配置需选择LZO 压缩方式,若使用的是xz, 则需选择XZ 压缩方式。

${ROOTFS} ${LICHEE_PLAT_OUT}/rootfs.squashfs -root-owned -no-progress -comp gzip -noappend

2.4 源码目录介绍

2.4.1 UBOOT 源码目录

u-boot-2018drivers ├──sunxi_flash ---sunxi_flash的初始化/退出/读/写/擦除等flash接口 ├─mmc ---mmc接口代码 ├─nand ---nand接口代码 ├─spinor ---spi nor接口代码 ├─sunxi_flash.c ---sunxi_flash操作接口 └──其他 ├── spi --sunxi_spi的接口代码 ├─sunxi_spi.c ---具体代码的实现 ├──mtd ├─spi ├─sf_probe.c ---nand接口代码 ├─spinor ---spi nor接口代码 ├─sunxi_flash.c ---sunxi_flash

2.4.2 KERNEL 源码目录

longankernellinux-4.9drivers ├── mtd ├─spi-nor ├─spi-nor.c ---spi nor驱动代码 └──其他 ├── spi --spi的接口代码 └── makefile ---编译文件 版

3 接口描述

3.1 驱动物理层接口

3.1.1 spi_nor_erase

static int spi_nor_erase(struct mtd_info *mtd, struct erase_info *instr)

description:mtd erase interface @mtd: MTD device structure @instr: erase operation descrition structure return:success return 0,fail return fail code**

3.1.2 spi_nor_read

static int spi_nor_read(struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf)

description:mtd read interface @mtd:MTD device structure @from: offset to read from MTD device @len: data len @retlen: had read data len @buf: data buffer return:success return max_bitflips,fail return fail code**

3.1.3 spi_nor_write

static int spi_nor_write(struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf)

description:mtd write data interface @to: offset to MTD device @len: want write data len @retlen:return the writen len @buf: data buffer return: success return 0, fail return code fail

3.1.4 spi_nor_lock

static int spi_nor_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len) description:check block is badblock or not

@mtd:MTD device structure @ofs: offset the mtd device start (align to simu block size) @len:The length of the operating return: success return 0, fail return code fail

3.1.5 spi_nor_unlock

static int spi_nor_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len) description:check block is badblock or not

@mtd:MTD device structure @ofs: offset the mtd device start (align to simu block size) @len:The length of the operating return: success return 0, fail return code fail

3.1.6 spi_nor_is_locked

static int spi_nor_is_locked(struct mtd_info *mtd, loff_t ofs, uint64_t len) description:check block is badblock or not

@mtd:MTD device structure @ofs: offset the mtd device start (align to simu block size) @len:The length of the operating return: Is lock return 1, else return 0

3.1.7 spi_nor_has_lock_erase

static int spi_nor_has_lock_erase(struct mtd_info *mtd, struct erase_info *instr)

description:mtd has lock erase interface,First unlock to operate space, after the completion of the flash lock up @mtd: MTD device structure @instr: erase operation descrition structure return:success return 0,fail return fail code

3.1.8 spi_nor_has_lock_write

static int spi_nor_has_lock_write(struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf)

description:mtd has lock write data interface,First unlock to operate space, after the completion of the flash lock up @to: offset to MTD device @len: want write data len @retlen:return the writen len @buf: data buffer return: success return 0, fail return code fail

3.2 Uboot 应用接口

3.2.1 sunxi_flash_spinor_probe

static int sunxi_flash_spinor_probe(void)

description:SPINOR initialization,Set the storage type。 return:zero on success, else a negative error code.

3.2.2 sunxi_flash_spinor_init

static int sunxi_flash_spinor_init(int boot_mode, int res)

description:SPINOR initialization。 @boot_mode:Working mode @res:The default is 0 return:zero on success, else a negative error code.

3.2.3 sunxi_flash_spinor_exit

int sunxi_flash_spinor_exit(void)

description:Release registration is a resource for applications. return:zero on success, else a negative error code.

3.2.4 sunxi_flash_spinor_write

static int sunxi_flash_spinor_write(uint start_block, uint nblock, void *buffer)

description:mtd write data interface. @start_block:want write start sector @nblock:want write sectorcount @buffer:data buffer

return:zero on success, else a negative error code.

3.2.5 sunxi_flash_spinor_write

static int sunxi_flash_spinor_write(uint start_block, uint nblock, void *buffer)

description:mtd readdata interface. @start_block:want read start sector @nblock:want read sector count @buffer:data buffer return:zero on success, else a negative error code.

3.2.6 sunxi_flash_spinor_erase

static int sunxi_flash_spinor_erase(int erase, void *mbr_buffer)

description:erase boot || partition data. @erase:erase flag @buffer:The default is NULL return:zero on success, else a negative error code.

3.2.7 sunxi_flash_spinor_force_erase

int sunxi_flash_spinor_force_erase(void)

description:erase boot & partition data. return:zero on success, else a negative error code.

3.2.8 sunxi_flash_spinor_flush

int sunxi_flash_spinor_flush(void)

description:Flush physical cache data to flash.

return:zero on success, else a negative error code.

3.2.9 sunxi_flash_spinor_download_spl

static int sunxi_flash_spinor_download_spl(unsigned char *buf, int len, unsigned int ext)

description:write boot0. @buf:boot0 data buffer @len:boot0 data len @ext:storage type return:zero on success, else a negative error code.

3.2.10 sunxi_flash_spinor_download_toc

static int sunxi_flash_spinor_download_toc(unsigned char *buf, int len, unsigned int ext)

description:write uboot. @buf:uboot data buffer @len:uboot data len @ext:storage type return:zero on success, else a negative error code.

4 使用例子

4.1 uboot shell 使用

4.1.1 sunxi_flash

mem_addr:内存地址,0x40000000 之后可以随便选取如:0x45000000,0x46000000 part_name:分区文件名,boot-resource、env、boot、rootfs size:可以省略,默认读取整个分区文件

sunxi_flash read [size] 读取flash 中的分区文件到内存中 例:使用sunxi_flash read 命令将boot 分区读入到0x49000000 中,然后使用md 命令读取 0x49000000 中的内容。

pYYBAGQFR_qAEBPqAAAvtmyqYbA230.png

验证方法:

0x49000000 读入前与读入后数据有没有发生变化

在out/pack_out 目录下找到对应的分区文件,使用hexdump -Cv boot.fex -n 500 命 令输出分区文件的数据,对比一致即读入成功。

poYBAGQFR_uAIwXwAAAqRJEczBw944.png

sunxi_flash write [size] 将内存中的数据,写入到分区中 例: 1)使用mm 命令修改内存内容

pYYBAGQFR_uAcUSyAAA1ppyDv8U903.png

2)使用sunxi_flash write 0x44000000 env 将内存中的数据写入env 分区

poYBAGQFR_yAdq7bAAATn8XEi-M506.png

3)重新将env 分区读入内存中,对比一致表示写入成功

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 模块
    +关注

    关注

    7

    文章

    2679

    浏览量

    47402
  • Linux
    +关注

    关注

    87

    文章

    11252

    浏览量

    209102
  • u-boot
    +关注

    关注

    0

    文章

    121

    浏览量

    38219
收藏 人收藏

    评论

    相关推荐

    EAC0945 linux开发指南

    EAC0945 linux开发指南
    发表于 09-28 12:40

    EAC0945 linux开发指南

    `EAC0945 linux开发指南`
    发表于 10-31 12:18

    Rockchip Linux SDK uboot logo开发指南

    arm嵌入式vs-rk3399 板卡uboot logo 开发指南概述:本文档主要介绍 rockchip linux sdk uboot logo 显示的相关功能、配置以及开发过程中的注意事项。适用于 rockhip
    发表于 10-09 08:12

    CPLD FPGA高级应用开发指南

    CPLD FPGA高级应用开发指南
    发表于 04-15 10:56 58次下载
    CPLD FPGA高级应用<b class='flag-5'>开发指南</b>

    Tiny6410 Linux开发指南详解

    Tiny6410 Linux 开发指南
    发表于 07-08 17:12 210次下载
    Tiny6410 <b class='flag-5'>Linux</b><b class='flag-5'>开发指南</b>详解

    A64开发板LCD开发指南

    A64开发板LCD开发指南,驱动开发指南
    发表于 06-21 17:02 0次下载

    电热毯开发指南

    电热毯开发指南
    发表于 12-29 20:14 0次下载

    彩光灯开发指南

    彩光灯开发指南
    发表于 12-29 20:15 0次下载

    Linux的平台下Mini210S裸机程序开发指南

    Linux的平台下Mini210S裸机程序开发指南
    发表于 10-29 10:52 59次下载
    <b class='flag-5'>Linux</b>的平台下Mini210S裸机程序<b class='flag-5'>开发指南</b>

    Rockchip Linux SDK的开发指南的详细资料说明

    本文档的主要内容详细介绍的是Rockchip Linux SDK的开发指南的详细资料说明。
    发表于 01-10 17:17 74次下载
    Rockchip <b class='flag-5'>Linux</b> SDK的<b class='flag-5'>开发指南</b>的详细资料说明

    迅为RK3399开发板嵌入式linux开发指南

    迅为RK3399开发板嵌入式linux开发指南迅为RK3399开发板发布《北京迅为嵌入式linux开发指
    发表于 11-01 16:58 76次下载
    迅为RK3399<b class='flag-5'>开发</b>板嵌入式<b class='flag-5'>linux</b><b class='flag-5'>开发指南</b>

    nRF52832开发指南-下册

    nRF52832开发指南-下册
    发表于 06-16 14:14 44次下载

    Tina_Linux_系统软件开发指南

    Tina_Linux_系统软件开发指南
    的头像 发表于 03-02 15:25 1796次阅读
    Tina_<b class='flag-5'>Linux</b>_系统软件<b class='flag-5'>开发指南</b>

    Tina Linux配置开发指南

    Tina Linux配置开发指南
    的头像 发表于 03-02 15:28 1.6w次阅读
    Tina <b class='flag-5'>Linux</b>配置<b class='flag-5'>开发指南</b>

    【北京迅为】itop-龙芯2k1000开发指南Linux基础入门vim 编辑器

    【北京迅为】itop-龙芯2k1000开发指南Linux基础入门vim 编辑器
    的头像 发表于 10-25 14:56 282次阅读
    【北京迅为】itop-龙芯2k1000<b class='flag-5'>开发指南</b><b class='flag-5'>Linux</b>基础入门vim 编辑器