免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1151 | 回复: 1
打印 上一主题 下一主题

MTD驱动问题求救 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-02-05 09:42 |只看该作者 |倒序浏览
在kernel.2.4.26中的cfi_cmdset_0002.c文件中

static int cfi_amdstd_write_buffers (struct mtd_info *mtd, loff_t to , size_t len, size_t *retlen, const u_char *buf)
{
        struct map_info *map = mtd->priv;
        struct cfi_private *cfi = map->fldrv_priv;
        int wbufsize = CFIDEV_INTERLEAVE << cfi->cfiq->MaxBufWriteSize;//根据芯片决定buf大小
        int ret = 0;
        int chipnum;
        unsigned long ofs;
       
        /* code derived from cfi_cmdset_0001.c:cfi_intelext_write_words */
        *retlen = 0;
        if (!len)
                return 0;
/**********************************************/
        chipnum = to >> cfi->chipshift;//
        ofs = to  - (chipnum << cfi->chipshift);//
//上面的两句怎么,理解啊?
/**********************************************/

        /* If it's not bus-aligned, do the first word write */

/**********************************************/
        if (ofs & (CFIDEV_BUSWIDTH-1)) {
                size_t local_len = (-ofs)&(CFIDEV_BUSWIDTH-1);
//如果我想加入8位数据的处理,上面两句又该怎么修改?我的内核版本是2.4.26uclinux  
//如果CFIDEV_BUSWIDTH==1即8位数据处理的话,那么local_len=0
//
/*************************************************/
                if (local_len > len)
                        local_len = len;
                ret = cfi_amdstd_write_words(mtd, to, local_len,
                                             retlen, buf);
                if (ret)
                        return ret;
                ofs += local_len;
                buf += local_len;
                len -= local_len;

                if (ofs >> cfi->chipshift) {
                        chipnum ++;
                        ofs = 0;
                        if (chipnum == cfi->numchips)
                                return 0;
                }
        }

        /* Write buffer is worth it only if more than one word to write... */
        while(len > CFIDEV_BUSWIDTH) {
                /* We must not cross write block boundaries */
                int size = wbufsize - (ofs & (wbufsize-1));

                if (size > len)
                        size = len & ~(CFIDEV_BUSWIDTH-1);
                ret = do_write_buffer(map, &cfi->chips[chipnum],
                                      ofs, buf, size);
                if (ret)
                        return ret;

                ofs += size;
                buf += size;
                (*retlen) += size;
                len -= size;

                if (ofs >> cfi->chipshift) {
                        chipnum ++;
                        ofs = 0;
                        if (chipnum == cfi->numchips)
                                return 0;
                }
        }

        /* ... and write the remaining bytes */
        if (len > 0) {
                size_t local_retlen;
                ret = cfi_amdstd_write_words(mtd, ofs + (chipnum << cfi->chipshift),
                                             len, &local_retlen, buf);
                if (ret)
                        return ret;
                (*retlen) += local_retlen;
        }

        return 0;
}

在这个版本中,因为源代码是使用 mtd->write = cfi_amdstd_write_words;
我修改为  mtd->write = cfi_amdstd_write_buffers;提高了flash编程写入的速度
而且只进行了16和32的数据处理,我在do_write_buffer函数中加入了8位数据处理.
在我的系统能够正常使用了
可是在cfi_amdstd_write_buffers 中的有两个地方没有看明白,害怕以后是否硬件上的改动会造成有一个字节没有写入的问题!
哪位大侠可以详细的说一下,flash编程的时候字节对齐的问题吗?
谢谢

[ 本帖最后由 heavensword 于 2006-2-5 10:30 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2006-02-05 13:37 |只看该作者
chipnum 与 cfi->chipshift 什么关系啊?
都代表了什么意义?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP