Moved the waiting loop for "Read Data Request" RDDREQ into the
delta_cmdfunc function, because this bit is only set once after a command is sent and this allows read functions to be called multiple times.
This commit is contained in:
parent
bb1ff049fb
commit
e2053f9c7a
@ -55,13 +55,6 @@ static void delta_read_buf(struct mtd_info *mtd, u_char* const buf, int len)
|
||||
{
|
||||
int i, j;
|
||||
|
||||
while(1) {
|
||||
if(NDSR & NDSR_RDDREQ) {
|
||||
NDSR |= NDSR_RDDREQ;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* we have to be carefull not to overflow the buffer if len is
|
||||
* not a multiple of 4 */
|
||||
unsigned long num_words = len & 0xfffffffc;
|
||||
@ -90,19 +83,25 @@ static void delta_read_buf(struct mtd_info *mtd, u_char* const buf, int len)
|
||||
static unsigned long read_buf = 0;
|
||||
static unsigned char bytes_read = 0;
|
||||
|
||||
/* wait for read request */
|
||||
static void delta_wait_event(unsigned long event)
|
||||
{
|
||||
if(!event)
|
||||
return;
|
||||
|
||||
while(1) {
|
||||
if(NDSR & event) {
|
||||
NDSR |= event;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
static u_char delta_read_byte(struct mtd_info *mtd)
|
||||
{
|
||||
/* struct nand_chip *this = mtd->priv; */
|
||||
unsigned char byte;
|
||||
|
||||
if(bytes_read == 0) {
|
||||
/* wait for read request */
|
||||
while(1) {
|
||||
if(NDSR & NDSR_RDDREQ) {
|
||||
NDSR |= NDSR_RDDREQ;
|
||||
break;
|
||||
}
|
||||
}
|
||||
read_buf = NDDB;
|
||||
printk("delta_read_byte: 0x%x.\n", read_buf);
|
||||
}
|
||||
@ -119,7 +118,7 @@ static void delta_cmdfunc(struct mtd_info *mtd, unsigned command,
|
||||
int column, int page_addr)
|
||||
{
|
||||
/* register struct nand_chip *this = mtd->priv; */
|
||||
unsigned long ndcb0=0, ndcb1=0, ndcb2=0;
|
||||
unsigned long ndcb0=0, ndcb1=0, ndcb2=0, event=0;
|
||||
|
||||
/* clear the ugly byte read buffer */
|
||||
bytes_read = 0;
|
||||
@ -153,10 +152,12 @@ static void delta_cmdfunc(struct mtd_info *mtd, unsigned command,
|
||||
((page_addr<<8) & 0xff00) |
|
||||
((page_addr<<8) & 0xff0000) |
|
||||
((page_addr<<8) & 0xff000000)); /* make this 0x01000000 ? */
|
||||
event = NDSR_RDDREQ;
|
||||
break;
|
||||
case NAND_CMD_READID:
|
||||
printk("delta_cmdfunc: NAND_CMD_READID.\n");
|
||||
ndcb0 = (NAND_CMD_READID | (3 << 21) | (1 << 16)); /* addr cycles*/
|
||||
event = NDSR_RDDREQ;
|
||||
break;
|
||||
case NAND_CMD_PAGEPROG:
|
||||
break;
|
||||
@ -190,6 +191,9 @@ static void delta_cmdfunc(struct mtd_info *mtd, unsigned command,
|
||||
NDCB0 = ndcb0;
|
||||
NDCB0 = ndcb1;
|
||||
NDCB0 = ndcb2;
|
||||
|
||||
/* wait for event */
|
||||
delta_wait_event(event);
|
||||
}
|
||||
|
||||
static void delta_dfc_gpio_init()
|
||||
|
Loading…
Reference in New Issue
Block a user