鸿蒙移植i.mx6ull(十一) 存储设备驱动程序(基于IMX6ULL)

本文档详细介绍了鸿蒙系统中存储设备驱动程序的分类,包括字符设备和块设备的特性及交互方式。重点讨论了块设备驱动程序与MTD(Memory Technology Device)的关系,以及如何在内存中模拟Flash存储设备。通过提供内存模拟Flash的步骤和实际操作,展示了如何在开发环境中创建和使用这种模拟设备。
摘要由CSDN通过智能技术生成

Ps:这个鸿蒙系列是韦东山老师录制的视频和开发手册为基础,请大家支持韦老师。 这个专栏是:
1.学习的笔记记录。
2.整理和知识点汇总。
3.个人做的项目经验汇总。

1.存储设备驱动程序分析

参考资料:vendor\democom\demochip\driver\mtd\spi_nor\src\common\spinor.c

1.1 字符设备和块设备

Linux中设备驱动程序分为3类:字符设备、块设备、网络设备。

所谓字符设备就是LED、按键、LCD、触摸屏这些非存储设备,APP可以直接调用驱动函数去操作它们。
而块设备就是Flash、磁盘这些存储设备,APP读写普通的文件时,最终会由驱动程序访问硬件。

为什么叫块设备?以前的磁盘读写时,是以块为单位的:即使只是读写一个字节,也需要读写一个块。 主要差别在于:

  • 字符设备驱动程序里,可以读写任意长度的数据
  • 块设备驱动程序里,读写数据时以块(扇区)为单位

1.1.1 APP与驱动程序的交互

1. 字符设备驱动程序

在这里插入图片描述

2. 块设备驱动程序教

在这里插入图片描述

1.1.2 驱动程序结构体

从上面的图形可以看到,无论是字符设备还是块设备,都要提供open/read/write/ioctl这些函数。
它们的驱动程序核心是类似的:

  • 字符设备驱动程序:file_operations_vfs

在这里插入图片描述

  • 块设备驱动程序:block_operations

在这里插入图片描述

1.1.3 注册函数

1. 字符设备驱动程序注册函数
int register_driver(FAR const char *path, FAR const struct file_operations_vfs *fops,
                    mode_t mode, FAR void *priv);

示例:

int ret = register_driver("/dev/hello", &g_helloDevOps, 0666, NULL);
2. 块设备驱动程序注册函数
int register_blockdriver(FAR const char *path,
                         FAR const struct block_operations *bops,
                         mode_t mode, FAR void *priv);

示例:

int ret = register_blockdriver("/dev/spinor", &g_dev_spinor_ops, 0755, mtd);

1.2 MTD设备

在各类电子产品中,存储设备类型多种多样,比如Nor Flash、Nand Flash,这些Flash又有不同的接口:比如SPI接口等等。
这些不同Flash的访问方法各有不同,但是肯定有这三种操作:

  • 擦除

那么可以抽象出一个软件层:MTD,含义为**Memory Technology Device**,它封装了不同Flash的操作。主要是抽象出一个结构体:

struct MtdDev {
    VOID *priv;
    UINT32 type;

    UINT64 size;
    UINT32 eraseSize;

    int (*erase)(struct MtdDev *mtd, UINT64 start, UINT64 len, UINT64 *failAddr);
    int (*read)(struct MtdDev *mtd, UINT64 start, UINT64 len, const char *buf);
    int (*write)(struct MtdDev *mtd, UINT64 start, UINT64 len, const char *buf);
};

不同的Flash要提供它自己的MtdDev结构体。

1.3 块设备驱动程序为MTD开了一个后门

视频里讲解。

在这里插入图片描述

JFFS2文件系统中,是直接使用MTD的,没有使用block_operations
比如:third_party\Linux_Kernel\fs\jffs2\read.c

在这里插入图片描述

1.4 怎么用内存模拟Flash

1.4.1 指定要使用的内存地址、大小

源码:vendor\democom\demochip\driver\mtd\spi_nor\src\common\spinor.c

在这里插入图片描述

1.4.2 实现MtdDev结构体

源码:vendor\democom\demochip\driver\mtd\spi_nor\src\common\spinor.c

在这里插入图片描述

1.4.3 怎么使用块设备

  • 添加分区
  • /dev/spinor表示整个块设备
  • /dev/spinorblk0表示里面的第0个分区
  • 不添加分区也可以,可以直接挂载/dev/spinor
  • mount

在这里插入图片描述

2. 使用内存模拟Flash

参考资料:vendor\democom\demochip\driver\mtd\spi_nor\src\common\spinor.c

2.1 最终结果

本章节做的修改会制作为补丁文件:

  • 04_openharmony_ramfs_imx6ull.patch

假设目录openharmony中是未修改的代码,从没打过补丁;
假设补丁文件放在openharmony的同级目录; 打补丁方法如下:

$ cd openharmony
$ patch -p1 < ../openharmony_100ask_v1.2.patch
$ patch -p1 < ../01_openharmony_add_demo_board.patch
$ patch -p1 < ../02_openharmony_memmap_imx6ull.patch 
$ patch -p1 < ../03_openharmony_uart_imx6ull.patch
$ patch -p1 < ../04_openharmony_ramfs_imx6ull.patch

打上补丁后,可以如此编译:

$ cd kernel/liteos_a
$ cp tools/build/config/debug/demochip_clang.config .config
$ make clean
$ make

2.2 原来的内存映射

在这里插入图片描述

2.3 在内存里挖出一块用来模拟Flash

在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
IMX6ULL 核心板AD PADS CADENCE 3种封装原理图库+PCB封装库+主要器件技术手册, 器件手册: IMX6ULLIEC.pdf KLM8G1GETF-B041-14B.pdf MT41K256M16TW-107 IT.pdf MT9700.pdf RB521S30.PDF RT8096CHGJ5.PDF SSM3J328R.pdf 原理图库器件列表: Library Component Count : 45 Name Description ---------------------------------------------------------------------------------------------------- CAP_NP CAP CER 0.22UF 6.3V 20% X5R 0402 CAP_NP_1 CAP CER 22UF 6.3V 20% X5R 0603 CAP_NP_10 CAP CER 0.22UF 6.3V 20% X5R 0402 CAP_NP_11 CAP CER 0.22UF 6.3V 20% X5R 0402 CAP_NP_12 CAP CER 0.22UF 6.3V 20% X5R 0402 CAP_NP_13 CAP CER 0.22UF 6.3V 20% X5R 0402 CAP_NP_14 CAP CER 0.22UF 6.3V 20% X5R 0402 CAP_NP_2 CAP CER 22UF 6.3V 20% X5R 0603 CAP_NP_3 CAP CER 22UF 6.3V 20% X5R 0603 CAP_NP_4 CAP CER 0.22UF 6.3V 20% X5R 0402 CAP_NP_5 CAP CER 0.22UF 6.3V 20% X5R 0402 CAP_NP_6 CAP CER 0.22UF 6.3V 20% X5R 0402 CAP_NP_7 CAP CER 0.22UF 6.3V 20% X5R 0402 CAP_NP_8 CAP CER 22UF 6.3V 20% X5R 0603 CAP_NP_9 CAP CER 0.22UF 6.3V 20% X5R 0402 CRYSTAL XTAL 32.768KHZ 7PF 20PPM -- SMT CRYSTAL_JXS63 XTAL 24MHZ -- 30PPM 3.2X2.5MM SMD DIODE_SCHTKY_0 DIODE SCH RECT 200MA 30V AEC-Q101 SOD-523 IMX6ULL_CORE_140P INDUCTOR IND WW PWR 1.5uH@1MHZ 2A 20% 2520 MCIMX6Y2DVM05AA_PBGA_289PIC CPU ARM COREA7 528MHZ 16BIT 1.5V PBGA289 MOSFET_P TRAN PMOS PWR 12V 4.3A SOT23 MT29F32G08CBADB_48P IC MEM NAND FLASH ASYNC 32GB 2.7-3.6V TSOP48 MT41J256M16RE_FBGA96IC MEM DDR3 SDRAM 256MX16 1.071NS 1.35V FBGA96 MTFC4GMVEA_WFBGA_153PIC MEM NAND FLASH 8GB MMC 4.51 CTLR 2.7-3.6V FBGA153 RT8096CHGJ5 RT9166-18GVL SY6280AAC
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值