鸿蒙移植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(十) 系统时钟
522 0
鸿蒙移植i.mx6ull(十) 系统时钟
|
9月前
|
API 开发工具 UED
34.[HarmonyOS NEXT Row案例二] 打造响应式图文导航项:设备适配与弹性空间的完美结合
HarmonyOS NEXT应用开发中,一个常见的需求是根据不同设备类型(如手机、平板)提供不同的用户界面体验。本教程将详细讲解如何使用Row组件创建响应式图文导航项,实现在不同设备上的智能适配,提供最佳的用户体验。
156 5
|
10月前
|
传感器 存储 iOS开发
【HarmonyOS NEXT调试全攻略】设备连接+运行环境一站式指南
本文提供HarmonyOS调试全面指南,涵盖设备连接与运行环境配置。包括模拟器操作、真机调试方法,及环境配置、功能模拟、故障排除等内容。核心覆盖Win/Mac双平台配置、真机级功能模拟、50+故障解决技巧等,助开发者高效调试。适合教育科普学习,错误之处欢迎指出。
|
缓存 API 开发者
基于HarmonyOS 5.0 (Next)的一种面向多设备跨平台的高性能自适应布局能力研究和实现
随着万物互联时代的到来,操作系统作为连接设备、应用与用户体验的核心愈发重要。华为发布的HarmonyOS 5.0(Next)是一款完全自主的手机操作系统,实现了全栈自研,在技术架构和生态体验上进行了颠覆性升级。本文聚焦于基于HarmonyOS 5.0(Next)实现多设备跨平台的高性能自适应布局能力,通过深入分析其技术特点和生态优势,结合开发实践探讨如何利用自适应布局和响应式布局技术,确保应用在多种设备上提供一致且优质的用户体验。研究将基于HarmonyOS 5.0(Next)的分布式能力和ArkTS编程语言,展示多设备跨平台环境下实现高性能自适应布局的方法,推动鸿蒙生态的发展。
574 16
基于HarmonyOS 5.0 (Next)的一种面向多设备跨平台的高性能自适应布局能力研究和实现
|
存储 数据管理 调度
鸿蒙操作系统如何支持不同设备的适配和兼容性?
鸿蒙操作系统如何支持不同设备的适配和兼容性?
2308 2
|
存储 Java API
HarmonyOS学习路之开发篇—设备管理(设备标识符)
网络设备节点通信标识符,是分布式软总线提供的一种非永久性标识符。NetworkID基于Java原生的UUID接口随机生成,长度为32字节,使用十六进制表示。主要用于业务调用分布式能力时,标识分布式网络内的设备节点。
|
Shell Python
鸿蒙移植i.mx6ull(十二) 根文件系统
鸿蒙移植i.mx6ull(十二) 根文件系统
403 0
鸿蒙移植i.mx6ull(十二) 根文件系统
|
Shell
鸿蒙移植i.mx6ull(九) 串口移植(基于IMX6ULL)
鸿蒙移植i.mx6ull(九) 串口移植(基于IMX6ULL)
662 0
鸿蒙移植i.mx6ull(九) 串口移植(基于IMX6ULL)
|
C语言
鸿蒙移植i.mx6ull(八) 添加一个单板(下)
鸿蒙移植i.mx6ull(八) 添加一个单板
243 0
鸿蒙移植i.mx6ull(八) 添加一个单板(下)
|
5月前
|
移动开发 前端开发 Android开发
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
789 12
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡

热门文章

最新文章