- 论坛徽章:
- 0
|
在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 编辑 ] |
|