Skip to contentSkip to conversation

NAND connected with address lines based example

DISCUSSION Marcus Mikolaiczyk 4 participants 5 messages Mar 31, 2005 Memory technology devices (MTD)

lore
Share & tools
lore
#0 lore raw

Dear list users,

I got a system where a Samsung NAND ist connect via Adresslines (A0 -> CLE, A1 -> ALE) using a chipselect from the processor. I looked through the guide "MTD NAND Driver Programming Interface" and the sources to adapt an existing driver. Now I stuck with a problem concerning the board_hwcontrol function.
It's alwas there that CLE/ALE have a set and a clear command. But in my setup the CLE/ALE setting is made through the access of the addresslines. See the table:

A1(ALE) A0(CLE) Beispieladresse Funktion
-------------------------------------------------------------------------------

1         0         0       0xA8000000        read/write access on mem
2         0         1       0xA8000001        Command
3         1         0       0xA8000002        Addresssetting
4         1         1       0xA8000003        not valid

The base is A8000000 for example.
Now writing a Byte to 0xA8000001 (a NAND command) automatically sets ALE =0 and CLE=1
Writing the addressparts is done through writing the 1st databyte Col1 to address 0xA8000002 and so on.
Concerning now the function board_hwcontrol there is the
...

switch(cmd) {
		case NAND_CTL_SETCLE: /* Write to addr 0xA8000001 */;break;
		case NAND_CTL_CLRCLE: /* do nothing */;break;
		case NAND_CTL_SETALE: /* Write to addr 0xA8000002 */;break;
		case NAND_CTL_CLRALE: /* do nothing */;break;
}

...
Am I right when these commands have to be empty in this case? Where do I tell the system to use the address 0xA8000001 for commands and 0xA8000002 for addresses?

Kind Regards

Marcus

#1 lore raw

Hi Marcus,

Quoted 31 lines · Marcus Mikolaiczyk

Dear list users,

I got a system where a Samsung NAND ist connect via Adresslines (A0 -> CLE, A1 -> ALE) using a chipselect from the processor. I looked through the guide "MTD NAND Driver Programming Interface" and the sources to adapt an existing driver. Now I stuck with a problem concerning the board_hwcontrol function.
It's alwas there that CLE/ALE have a set and a clear command. But in my setup the CLE/ALE setting is made through the access of the addresslines. See the table:

A1(ALE) A0(CLE) Beispieladresse Funktion
-------------------------------------------------------------------------------

1         0         0       0xA8000000        read/write access on mem
2         0         1       0xA8000001        Command
3         1         0       0xA8000002        Addresssetting
4         1         1       0xA8000003        not valid

The base is A8000000 for example.
Now writing a Byte to 0xA8000001 (a NAND command) automatically sets ALE =0 and CLE=1
Writing the addressparts is done through writing the 1st databyte Col1 to address 0xA8000002 and so on.
Concerning now the function board_hwcontrol there is the
...

switch(cmd) {
		case NAND_CTL_SETCLE: /* Write to addr 0xA8000001 */;break;
		case NAND_CTL_CLRCLE: /* do nothing */;break;
		case NAND_CTL_SETALE: /* Write to addr 0xA8000002 */;break;
		case NAND_CTL_CLRALE: /* do nothing */;break;
}
Quoted 4 lines

...
Am I right when these commands have to be empty in this case? Where do I tell the system to use the address 0xA8000001 for commands and 0xA8000002 for addresses?

You can write your hardware control function like this:

switch(cmd) {
	case NAND_CTL_SETCLE: this->IO_ADDR_W = io_base_addr+1; break;
	case NAND_CTL_CLRCLE: this->IO_ADDR_W = io_base_addr; break;
	case NAND_CTL_SETALE: this->IO_ADDR_W = io_base_addr+2; break;	
	case NAND_CTL_CLRALE: this->IO_ADDR_W = io_base_addr; break;
}

Where io_base_addr = A8000000, your base address.

Hope this helps.

Signature · 2 lines
William J Beksi                          <[email protected]>
GPG Key Fingerprint = ED4B 32C3 69E6 C2B7 705C  263F CB2F 3253 E7E1 DB3B
#2 lore raw

Thanks to all

I'll thought of Williams idea too but was not sure, and try to implement it asap (next few hours) and give a feedback.

Quoted 10 lines

You can write your hardware control function like this:

switch(cmd) {
    case NAND_CTL_SETCLE: this->IO_ADDR_W = io_base_addr+1; break;
    case NAND_CTL_CLRCLE: this->IO_ADDR_W = io_base_addr; break;
    case NAND_CTL_SETALE: this->IO_ADDR_W = io_base_addr+2; break;
    case NAND_CTL_CLRALE: this->IO_ADDR_W = io_base_addr; break;
}
Quoted 3 lines

Where io_base_addr = A8000000, your base address.

Hope this helps.

Thanks so far.

Marcus

#4 lore raw
In reply to Marcus Mikolaiczyk
Quoted 31 lines · Marcus Mikolaiczyk

Dear list users,

I got a system where a Samsung NAND ist connect via Adresslines (A0 -> CLE, A1 -> ALE) using a chipselect from the processor. I looked through the guide "MTD NAND Driver Programming Interface" and the sources to adapt an existing driver. Now I stuck with a problem concerning the board_hwcontrol function.
It's alwas there that CLE/ALE have a set and a clear command. But in my setup the CLE/ALE setting is made through the access of the addresslines. See the table:

A1(ALE) A0(CLE) Beispieladresse Funktion
-------------------------------------------------------------------------------

1         0         0       0xA8000000        read/write access on mem
2         0         1       0xA8000001        Command
3         1         0       0xA8000002        Addresssetting
4         1         1       0xA8000003        not valid

The base is A8000000 for example.
Now writing a Byte to 0xA8000001 (a NAND command) automatically sets ALE =0 and CLE=1
Writing the addressparts is done through writing the 1st databyte Col1 to address 0xA8000002 and so on.
Concerning now the function board_hwcontrol there is the
...

switch(cmd) {
		case NAND_CTL_SETCLE: /* Write to addr 0xA8000001 */;break;
		case NAND_CTL_CLRCLE: /* do nothing */;break;
		case NAND_CTL_SETALE: /* Write to addr 0xA8000002 */;break;
		case NAND_CTL_CLRALE: /* do nothing */;break;
}
Quoted 8 lines

...
Am I right when these commands have to be empty in this case? Where do I tell the system to use the address 0xA8000001 for commands and 0xA8000002 for addresses?

Kind Regards

Marcus

You could do something like this I suppose.

struct nand_chip *this = mtd->priv;

switch(cmd) {
	case NAND_CTL_SETCLE: this->IO_ADDR_R = this->IO_ADDR_W = 0xA8000001; 
break;
	case NAND_CTL_CLRCLE: this->IO_ADDR_R = this->IO_ADDR_W = 0xA8000000; 

break;
}

That what I'd do.

Regards,
Pathompong Puengrostham