Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
mtd_nor
【NXP-MCXA153】RTT MTD驱动添加
发布于 2024-07-24 09:19:33 浏览:379
订阅该版
[tocm] ## NOR flash 一般在MB级别,常见的如 8MB 16MB 等,不过我此章节的驱动是利用片上flash ,此开发板的A153有128KB的片上flash,尝试将其中的512字节取出然后作为存储数据 ## MTD MOR 层级结构 ![1.png](https://oss-club.rt-thread.org/uploads/20240724/0a40725c06a338a9b1f388cbe4ff52fb.png) MTD设备驱动框架是在mtd_nand.c文件中,其基本功能是: - 向文件系统提供 rt_mtd_nor_read, rt_mtd_nor_write,rt_mtd_nor_read_id等接口 - 向底层提供 rt_mtd_nor_driver_ops 成员就是上述接口地址,俺就要实现这些功能 - 注册接口 rt_mtd_nor_device flash的底层操作,目前只用内部flash,读写操作就是调用NXP的底层接口了 ## 代码实现 ### 创建MTD NOR 设备 ```c struct rt_mtd_nor_device { struct rt_device parent; rt_uint32_t block_size; /* The Block size in the flash */ rt_uint32_t block_start; /* The start of available block*/ rt_uint32_t block_end; /* The end of available block */ /* operations interface */ const struct rt_mtd_nor_driver_ops* ops; }; ``` ### 需要实现的接口 ```c struct rt_mtd_nor_driver_ops { rt_err_t (*read_id) (struct rt_mtd_nor_device* device); rt_ssize_t (*read) (struct rt_mtd_nor_device* device, rt_off_t offset, rt_uint8_t* data, rt_size_t length); rt_ssize_t (*write) (struct rt_mtd_nor_device* device, rt_off_t offset, const rt_uint8_t* data, rt_size_t length); rt_err_t (*erase_block)(struct rt_mtd_nor_device* device, rt_off_t offset, rt_size_t length); }; ``` #### read ```c /** * device MTD nor 设备句柄 * offset 偏移量 * data 读取的数据 * length 读取的数据长度 */ rt_ssize_t nxp_chipflash_read (struct rt_mtd_nor_device* device, rt_off_t offset, rt_uint8_t* data, rt_size_t length) { for(int i = 0; i < length; i++) { *(data + i) = *(volatile rt_uint8_t *)(mtd.destAdrss + offset + i); } return length; } ``` #### write ```c /** * device MTD nor 设备句柄 * offset 偏移量 * data 读取的数据 * length 读取的数据长度 */ rt_ssize_t nxp_chipflash_write (struct rt_mtd_nor_device* device, rt_off_t offset, const rt_uint8_t* data, rt_size_t length) { rt_kprintf("%s %d\n","nxp_chipflash_write", *data); int32_t status = FLASH_API->flash_program_page(&mtd.s_flashDriver, mtd.destAdrss + offset, (uint8_t *)data, length); if (status != kStatus_Success) { return 0; } return length; } ``` #### erase_block ```c /** * device MTD nor 设备句柄 * offset 偏移量 * length 长度 */ rt_err_t nxp_chipflash_erase_block (struct rt_mtd_nor_device* device, rt_off_t offset, rt_size_t length) { FLASH_API->flash_erase_sector(&mtd.s_flashDriver, mtd.destAdrss, mtd.pflashSectorSize, kFLASH_ApiEraseKey); return RT_EOK; } ``` #### 初始化 ```c rt_err_t rt_onchipflash_init(const char* mtd_name) { memset(&mtd.s_flashDriver, 0, sizeof(flash_config_t)); if (FLASH_API->flash_init(&mtd.s_flashDriver) != kStatus_Success) { return RT_ERROR; } //获取参数 FLASH_API->flash_get_property(&mtd.s_flashDriver, kFLASH_PropertyPflashBlockBaseAddr, &mtd.pflashBlockBase); FLASH_API->flash_get_property(&mtd.s_flashDriver, kFLASH_PropertyPflashSectorSize, &mtd.pflashSectorSize); FLASH_API->flash_get_property(&mtd.s_flashDriver, kFLASH_PropertyPflashTotalSize, &mtd.pflashTotalSize); FLASH_API->flash_get_property(&mtd.s_flashDriver, kFLASH_PropertyPflashPageSize, &mtd.PflashPageSize); //记录flash地址数据 //flsh基地址+ flash中大小 - 数量* 扇区大小 mtd.destAdrss = mtd.pflashBlockBase + (mtd.pflashTotalSize - (SECTOR_INDEX_FROM_END) * mtd.pflashSectorSize); int32_t status = FLASH_API->flash_erase_sector(&mtd.s_flashDriver, mtd.destAdrss, mtd.pflashSectorSize, kFLASH_ApiEraseKey); if (status != kStatus_Success) { return RT_ERROR; } mtd.mtd_device.block_start = 512; mtd.mtd_device.block_start = 0; mtd.mtd_device.ops = &mcx_mtd_chipflashops; rt_mtd_nor_register_device(mtd_name, &(mtd.mtd_device)); return RT_EOK; } ``` ### 实验代码 ```c rt_onchipflash_init("mflash"); rt_onchipflash_init("mflash"); static rt_device_t mtd = RT_NULL; mtd = rt_device_find("mflash"); if(!mtd) rt_kprintf("rt find device failed.\n"); else rt_kprintf("rt find device ok.\n"); rt_uint8_t number = 0x22; rt_mtd_nor_write((struct rt_mtd_nor_device *)mtd, 0, &number, 1); rt_uint8_t read = 0; rt_mtd_nor_read((struct rt_mtd_nor_device *)mtd, 0, &read, 1); rt_kprintf("rt mtd device read%d\n", read); ``` ### 结果 ![2.png](https://oss-club.rt-thread.org/uploads/20240724/52b7bbab1be91283f432d4f41e3c9385.png) ## 总结 - 操作FLASH_API 的时候需要更新 SDK 库 - 由于没外部nor flash就使用了内部的,其实就是读写操作而已,后面学习文件系统的操作,加油
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
LTBOHAPPY
加油努力
文章
6
回答
1
被采纳
0
关注TA
发私信
相关文章
1
spi_flash.h使用mtd_nor产生编译错误
2
关于RTT中文件系统以及flash的疑问
3
mtd_nor中的write/read实现是空的
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
DMA
USB
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
I2C_IIC
ESP8266
UART
cubemx
WIZnet_W5500
ota在线升级
PWM
BSP
flash
freemodbus
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
keil_MDK
ulog
SFUD
msh
C++_cpp
MicroPython
本月问答贡献
RTT_逍遥
8
个答案
2
次被采纳
三世执戟
7
个答案
1
次被采纳
KunYi
6
个答案
1
次被采纳
winfeng
2
个答案
1
次被采纳
chenyaxing
2
个答案
1
次被采纳
本月文章贡献
catcatbing
2
篇文章
5
次点赞
swet123
1
篇文章
3
次点赞
YZRD
1
篇文章
2
次点赞
Days
1
篇文章
2
次点赞
阳光的掌控者
1
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部