病了几天, 自己也偷懒了.今天继续
#define BUSY 1
inline void wait_idle(void) {
int i;
while(!(NFSTAT & BUSY)) ; NFSTAR只有第一位有效, 0: flash busy 1: ready to use &:位与
// 回忆一下while的用法, 很久没用忘了.while(1),则执行下面的语句, 并回到while语句继续判断; while(0),退出循环
// 所以, nfstat=busy的时候不断循环,直到 nfstat=ready to use
for(i=0; i<10; i++);
}
#define NAND_SECTOR_SIZE 512 //1 page = 512 bytes
#define NAND_BLOCK_MASK (NAND_SECTOR_SIZE - 1)
/* low level nand read function */
int
nand_read_ll(unsigned char *buf, unsigned long start_addr, int size)
{
int i, j;
if ((start_addr & NAND_BLOCK_MASK) || (size & NAND_BLOCK_MASK)) { // ||: 或 ; start_addr不可以等于511; size应该能等于511吧?
return -1; /* invalid alignment */
}
/* chip Enable */
NFCONF &= ~0x800;
for(i=0; i<10; i++);
for(i=start_addr; i < (start_addr + size);) {
/* READ0 */
NFCMD = 0;
/* Write Address */
NFADDR = i & 0xff;
NFADDR = (i >> 9) & 0xff;
NFADDR = (i >> 17) & 0xff;
NFADDR = (i >> 25) & 0xff; //分四段写入地址
wait_idle();
for(j=0; j < NAND_SECTOR_SIZE; j++, i++) { //每次读取一个页面的数据, i会最后更新为下一个页面的地址.
*buf = (NFDATA & 0xff); //问题: 如何能肯定start_addr就是一个页面的第一个地址呢?如果不是第一个地址,那么j<nand_sector_size 是否会出错?
buf++;
}
}
玩了一下三国志11, 不错. 可以给老爸试一试