- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我指的是这个 answer 中的代码.不过我添加了错误处理。open()
删除和 read()
都执行无误,我读取的 20 个字节都是 0xff
。但是,当尝试从 data[]
数组写入 20 个字节时,我从 write()
函数中得到了一个 EINVAL
错误代码。问题的原因可能是什么?我确实在尝试写入之前删除内存...
最佳答案
我看到了你的original post .我最近遇到了同样的问题,我发现写入大小很重要。
mtd_info_t(struct mtd_info_user) 有一个名为 writesize 的变量(引用:https://elixir.bootlin.com/linux/v3.2/source/include/mtd/mtd-abi.h#L125)
struct mtd_info_user {
__u8 type;
__u32 flags;
__u32 size; /* Total size of the MTD */
__u32 erasesize;
__u32 writesize;
__u32 oobsize; /* Amount of OOB data per block (e.g. 16) */
__u64 padding; /* Old obsolete field; do not use */
};
写入mtd时,要注意writesize
#include <fcntl.h>
#include <mtd/mtd-user.h>
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <sys/ioctl.h>
int main(){
mtd_info_t mtd_info; // the MTD structure
erase_info_t ei; // the erase block structure
int i;
unsigned char read_buf[20] = {0x00}; // empty array for reading
int fd = open("/dev/mtd0", O_RDWR); // open the mtd device for reading and
// writing. Note you want mtd0 not mtdblock0
// also you probably need to open permissions
// to the dev (sudo chmod 777 /dev/mtd0)
ioctl(fd, MEMGETINFO, &mtd_info); // get the device info
// dump it for a sanity check, should match what's in /proc/mtd
printf("MTD Type: %x\nMTD total size: %x(hex) bytes\nMTD erase size: %x(hex) bytes\nMTD write size: %x(hex) bytes\n",
mtd_info.type, mtd_info.size, mtd_info.erasesize, mtd_info.writesize);
ei.length = mtd_info.erasesize; //set the erase block size
for(ei.start = 0; ei.start < mtd_info.size; ei.start += ei.length)
{
ioctl(fd, MEMUNLOCK, &ei);
// printf("Eraseing Block %#x\n", ei.start); // show the blocks erasing
// warning, this prints a lot!
ioctl(fd, MEMERASE, &ei);
}
lseek(fd, 0, SEEK_SET); // go to the first block
read(fd, read_buf, sizeof(read_buf)); // read 20 bytes
// sanity check, should be all 0xFF if erase worked
for(i = 0; i<20; i++)
printf("buf[%d] = 0x%02x\n", i, (unsigned int)read_buf[i]);
/**********************************************************
* important part! *
* notice the size of data array is mtd_info.writesize *
**********************************************************/
uint32_t write_size = mtd_info.writesize;
unsigned char data[write_size];//write 0
bzero(data, write_size);
lseek(fd, 0, SEEK_SET); // go back to first block's start
write(fd, data, sizeof(data)); // write our message
lseek(fd, 0, SEEK_SET); // go back to first block's start
read(fd, read_buf, sizeof(read_buf));// read the data
// sanity check, now you see the message we wrote!
for(i = 0; i<20; i++)
printf("buf[%d] = 0x%02x\n", i, (unsigned int)read_buf[i]);
close(fd);
return 0;
}
希望对你有帮助
关于c - 尝试写入 mtd 设备时获取 EINVAL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24302243/
您可以在内核命令行 root=mtd:name 上按名称指定 MTD 设备,并且可以使用名称 mount mtd:name 进行挂载。我希望我的应用程序能够做同样的事情。它必须调用 open,但是 o
我需要创建一个与回调函数一起工作的 dll。当我在项目属性中设置 Runtime Libary = Multi-threaded Debug (/MTd) 时,它生成此错误消息: 但是当我设置 Run
获得了一个嵌入式系统,我可以使用 root shell 访问它。我无法进入U-boot启动菜单。 (开机延迟=0) 设备从 nor flash 启动并加载 emmc 上的文件系统。它不设置/dev/m
我的表(市场)中有三列:销售员、销售额和周数。我希望能够计算 MTD(本月至今)的总数。就我而言,我希望能够提供表中从 11-18-2016 到 12-18-2016 的数据。我不知道如何在我的表中制
我正在使用 phram 和 ramoops 将最新的系统日志存储在保留内存中,这样一旦我的机器崩溃,我就可以在重启后转储紧急日志。 MTD驱动phram和模块ramoops用于自动记录系统日志到内存:
我有一个小程序,用于尝试在我的嵌入式 Linux 平台上读取 MTD 的详细信息。我遇到了大多数 block 无法读取的问题,而且我不是 100% 确定为什么会这样。 检查 /dev 目录显示 8 个
我有一个非常具体的需求:部分替换闪存的内容和移动 MTD 分区边界。 当前 map 是: u-boot 0x000000 0x040000 u-boot-env 0x040000 0x010000 内
我正在使用嵌入式设备,并希望它们能够通过 Linux 调整其 MTD 分区的大小而无需重新启动。 问题是我的 Linux 镜像大小增加了,并且它所在的当前 MTD 分区 (mtd0) 现在太小了。但是
我才刚刚开始研究 SQL。 我有一个 SQL Server 2008 r2 数据库,它将返回两个字段 DocDate 和 InvValue。我需要将 InvValues 求和为截至今天日期的 MTD
我的立方体中有以下情况: 商店 A 使用日历 Cal1。他们的销售月从 1 月 5 日开始。B 店使用日历 Cal2。他们的销售月从 1 月 10 日开始。铺C...等 商店日历不能简单地表示为主日历
我有一个关于多线程调试 DLL (/MDd) 和多线程调试 (/MTd) 设置的问题。它们之间的区别很明显:一个是使用动态库,一个是使用静态库。当我使用/MDd 编译我的程序时,一切都进行得很好。但是
jffs2(mtd-utils 版本 1.5.0、mkfs.jffs2 修订版 1.60)的最小删除 block 大小似乎为 8KiB: Erase size 0x1000 too small. In
在构建动态库(C++)时,我们可以为Windows选择多线程调试(/MTd)或多线程调试DLL(/MDd)运行时库。如果我们选择Multi-threaded Debug,那么创建的动态库将负责为库中使
我正在为纸牌游戏编写 AI,经过一些测试我发现在我的 alpha beta 算法上使用 MTD(f) - 一系列零窗口搜索 - 比仅使用 alpha-beta 更快本身。 此处对 MTD(f) 算法进
我有两个带有 MSVC2013 32 位编译器的 QT 5.5 项目。第一个是 Qt 控制台应用程序,在 pro 文件中使用 crypto++ 和这两个: QMAKE_CXXFLAGS_RELEASE
我指的是这个 answer 中的代码.不过我添加了错误处理。open() 删除和 read() 都执行无误,我读取的 20 个字节都是 0xff。但是,当尝试从 data[] 数组写入 20 个字节时
在我的 linux/dev/文件夹中,我有 mtd0 - mtd7 和 mtdblock0 - mtdblock7。我想在这里有更多的 mtd 设备。构建内核时应该更改什么? 谢谢 最佳答案 您需要更
我在嵌入式设备上工作,内核镜像存储在闪存的/dev/mtd4 部分。我想在没有 Uboot 的情况下更新这个内核。 这怎么可能?我想调用: echo ./kernel.bin > /dev/mtdbl
我正在尝试使用 MTD block 设备在 NAND 闪存上写入,但我并不理解所有内容。 当我读到here mtdblockN为只读 block 设备N mtdN为读写字符设备N mtdNro为只读字
12 mtd、12 mtd 滚动和 ytd 计算有什么区别 最佳答案 12 mtd 可以追溯到 12 个月,而 ytd 是从当年(日历、财政年度等)的第一天到今天。 关于sas - ytd 报告和 1
我是一名优秀的程序员,十分优秀!