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

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

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. 字符设备驱动程序

1671001994165.jpg

2. 块设备驱动程序教

1671002018788.jpg


1.1.2 驱动程序结构体


从上面的图形可以看到,无论是字符设备还是块设备,都要提供open/read/write/ioctl这些函数。

它们的驱动程序核心是类似的:


字符设备驱动程序:file_operations_vfs

1671002028474.jpg


块设备驱动程序:block_operations

1671002039641.jpg


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开了一个后门


视频里讲解。

1671002101865.jpg


在JFFS2文件系统中,是直接使用MTD的,没有使用block_operations。

比如:third_party\Linux_Kernel\fs\jffs2\read.c:

1671002109081.jpg


1.4 怎么用内存模拟Flash


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


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

1671002121251.jpg

1.4.2 实现MtdDev结构体


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

1671002131434.jpg


1.4.3 怎么使用块设备


添加分区

/dev/spinor表示整个块设备

/dev/spinorblk0表示里面的第0个分区

不添加分区也可以,可以直接挂载/dev/spinor

mount

1671002141740.jpg


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 原来的内存映射

1671002170675.jpg

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

1671002180791.jpg

相关文章
|
Linux 芯片
鸿蒙移植i.mx6ull(十) 系统时钟
鸿蒙移植i.mx6ull(十) 系统时钟
228 0
鸿蒙移植i.mx6ull(十) 系统时钟
|
3月前
|
存储 数据管理 调度
鸿蒙操作系统如何支持不同设备的适配和兼容性?
鸿蒙操作系统如何支持不同设备的适配和兼容性?
100 2
|
9月前
|
存储 Java API
HarmonyOS学习路之开发篇—设备管理(设备标识符)
网络设备节点通信标识符,是分布式软总线提供的一种非永久性标识符。NetworkID基于Java原生的UUID接口随机生成,长度为32字节,使用十六进制表示。主要用于业务调用分布式能力时,标识分布式网络内的设备节点。
|
Shell Python
鸿蒙移植i.mx6ull(十二) 根文件系统
鸿蒙移植i.mx6ull(十二) 根文件系统
128 0
鸿蒙移植i.mx6ull(十二) 根文件系统
|
Shell
鸿蒙移植i.mx6ull(九) 串口移植(基于IMX6ULL)
鸿蒙移植i.mx6ull(九) 串口移植(基于IMX6ULL)
359 0
鸿蒙移植i.mx6ull(九) 串口移植(基于IMX6ULL)
|
C语言
鸿蒙移植i.mx6ull(八) 添加一个单板(下)
鸿蒙移植i.mx6ull(八) 添加一个单板
99 0
鸿蒙移植i.mx6ull(八) 添加一个单板(下)
|
芯片
鸿蒙移植i.mx6ull(八) 添加一个单板(上)
鸿蒙移植i.mx6ull(八) 添加一个单板
251 0
鸿蒙移植i.mx6ull(八) 添加一个单板(上)
|
物联网
鸿蒙移植i.mx6ull (七) Liteos-a的编译系统(下)
鸿蒙移植i.mx6ull (七) Liteos-a的编译系统
273 0
鸿蒙移植i.mx6ull (七) Liteos-a的编译系统(下)
|
9月前
|
IDE JavaScript API
HarmonyOS开发第一步,熟知开发工具DevEco Studio
本文主要以常见的功能点作为概述希望可以帮助到学习HarmonyOS的开发者。
221 0
|
4月前
|
数据管理 API 调度
【华为鸿蒙系统学习】- HarmonyOS4.0开发|自学篇
【华为鸿蒙系统学习】- HarmonyOS4.0开发|自学篇
216 0