我有密码:
static unsigned char buffer[512];
static struct mtd_info *mtd_ptr = NULL;
static unsigned int *counter = NULL;
static void mtdblock_read(void)
{
int readed = 0;
int ret = 0;
const unsigned int mtd_device_num = 12;
counter = (unsigned int *)buffer;
mtd_ptr = get_mtd_device(NULL, mtd_device_num);
if(IS_ERR(mtd_ptr)){
printk("Can't get mtd partition...");
mtd_ptr = NULL;
return;
}
printk("Found partition '%s'\n", mtd_ptr->name);
if(mtd_ptr->read)
{
ret = mtd_ptr->read(mtd_ptr, 0, sizeof(buffer), &readed, buffer);
printk("%s:%d - %d, readed: %d\n", __func__, __LINE__, ret, readed);
}
else
printk("Not have 'read' ops\n");
printk("current counter = 0x%08X\n", *counter);
}
static void mtdblock_write(void)
{
int writed = 0;
int ret = 0;
(*counter) = 111;
printk("Write counter (%d) to mtd\n", *counter);
if(mtd_ptr && mtd_ptr->write)
{
ret = mtd_ptr->write(mtd_ptr, 0, sizeof(buffer), &writed, buffer);
printk("%s:%d - %d, writed: %d\n", __func__, __LINE__, ret, writed);
if(mtd_ptr->sync)
mtd_ptr->sync(mtd_ptr);
}
else
printk("Not have 'write' ops or mtd is not available\n");
}
void test()
{
mtdblock_read();
mtdblock_write();
mtdblock_read();
}
mtdblock_read必须从and块读取512个字节,并将int值显示到缓冲区的前4个字节中。
mtdblock_write将4字节值放在512字节缓冲区的开头,并将其写入and块.
test()执行测试序列:
mtdblock_read中有问题(作为我的意见),因为我有跟踪输出:
Found 13 partition 'dying_gasp'
mtdblock_read:303 - 0, readed: 512
current counter = 0x00000000
Write counter (1953719668) to mtd
mtdblock_write:322 - 0, writed: 512
Found 13 partition 'dying_gasp'
mtdblock_read:303 - 0, readed: 512
current counter = 0x00000000
从这里我可以看到mtd_ptr->read()有返回值-74,但是报告给readed,它有512字节从mtdblock读取。但实际上,它不是从mtdblock读取数据。此外,我检查了mtd_ptr-> writed (),但是它正确地报告了512字节,并且返回值为零。
你能帮我解决这个问题吗?这是内部mtdblock驱动程序错误,还是我在读或写mtdlock时跳过主要操作?
发布于 2021-08-03 09:53:13
对于提出问题的人来说,这有点晚了,但也许其他人可以从中受益。
如果mtd设备由SPI驱动程序支持,则无法读取声明为静态的缓冲区。spi.c中的spi_map_buf()中有一部分代码检查这一点:
if (vmalloced_buf || kmap_buf) {
desc_len = min_t(int, max_seg_size, PAGE_SIZE);
sgs = DIV_ROUND_UP(len + offset_in_page(buf), desc_len);
} else if (virt_addr_valid(buf)) {
desc_len = min_t(int, max_seg_size, ctlr->max_dma_len);
sgs = DIV_ROUND_UP(len, desc_len);
} else {
dev_err(&ctlr->dev,"Not vmalloced, not kmap, va not valid\n");
return -EINVAL;
}
所以,如果您继续使用kmalloc缓冲区,一切都会进行得很好。在尝试创建一个使用i.MX6UL芯片上的mtd_read的内核mod并直接调用mtd_read时发现了这一点。
https://stackoverflow.com/questions/37591466
复制相似问题