首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何正确地将mtdblock读写到linux内核空间?

如何正确地将mtdblock读写到linux内核空间?
EN

Stack Overflow用户
提问于 2016-06-02 12:08:43
回答 1查看 1.1K关注 0票数 0

我有密码:

代码语言:javascript
运行
复制
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()执行测试序列:

  1. 1 mtdblock_read() -从1st块读取当前值。
  2. mtdblock_write() -用于写入新值
  3. 2 mtdblock_read() -用于重读writed值。

mtdblock_read中有问题(作为我的意见),因为我有跟踪输出:

代码语言:javascript
运行
复制
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时跳过主要操作?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-03 17:53:13

对于提出问题的人来说,这有点晚了,但也许其他人可以从中受益。

如果mtd设备由SPI驱动程序支持,则无法读取声明为静态的缓冲区。spi.c中的spi_map_buf()中有一部分代码检查这一点:

代码语言:javascript
运行
复制
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时发现了这一点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37591466

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档