xref: /plan9-contrib/sys/src/nboot/zynq/qspi.c (revision 529c1f209803c78c4f2cda11b13818a57f01c872)
1*529c1f20SDavid du Colombier #include <u.h>
2*529c1f20SDavid du Colombier #include "dat.h"
3*529c1f20SDavid du Colombier #include "fns.h"
4*529c1f20SDavid du Colombier 
5*529c1f20SDavid du Colombier enum {
6*529c1f20SDavid du Colombier 	QSPI_CFG,
7*529c1f20SDavid du Colombier 	QSPI_STATUS,
8*529c1f20SDavid du Colombier 	QSPI_EN = 5,
9*529c1f20SDavid du Colombier 	QSPI_TXD4 = 7,
10*529c1f20SDavid du Colombier 	QSPI_RXD,
11*529c1f20SDavid du Colombier 	QSPI_TXD1 = 32,
12*529c1f20SDavid du Colombier 	QSPI_TXD2,
13*529c1f20SDavid du Colombier 	QSPI_TXD3
14*529c1f20SDavid du Colombier };
15*529c1f20SDavid du Colombier 
16*529c1f20SDavid du Colombier #define QSPI0 ((void *) 0xE000D000)
17*529c1f20SDavid du Colombier 
18*529c1f20SDavid du Colombier static u32int
cmd(ulong * r,int sz,u32int c)19*529c1f20SDavid du Colombier cmd(ulong *r, int sz, u32int c)
20*529c1f20SDavid du Colombier {
21*529c1f20SDavid du Colombier 	if(sz == 4)
22*529c1f20SDavid du Colombier 		r[QSPI_TXD4] = c;
23*529c1f20SDavid du Colombier 	else
24*529c1f20SDavid du Colombier 		r[QSPI_TXD1 + sz - 1] = c;
25*529c1f20SDavid du Colombier 	r[QSPI_CFG] |= 1<<16;
26*529c1f20SDavid du Colombier 	while((r[QSPI_STATUS] & (1<<2|1<<4)) != (1<<2|1<<4))
27*529c1f20SDavid du Colombier 		;
28*529c1f20SDavid du Colombier 	return r[QSPI_RXD];
29*529c1f20SDavid du Colombier }
30*529c1f20SDavid du Colombier 
31*529c1f20SDavid du Colombier void
flash(void)32*529c1f20SDavid du Colombier flash(void)
33*529c1f20SDavid du Colombier {
34*529c1f20SDavid du Colombier 	ulong *r;
35*529c1f20SDavid du Colombier 
36*529c1f20SDavid du Colombier 	r = QSPI0;
37*529c1f20SDavid du Colombier 	r[QSPI_CFG] = 1<<31 | 1<<19 | 3<<6 | 1<<15 | 1<<14 | 1<<10 | 1<<3 | 1;
38*529c1f20SDavid du Colombier 	r[QSPI_CFG] &= ~(1<<10);
39*529c1f20SDavid du Colombier 	r[QSPI_EN] = 1;
40*529c1f20SDavid du Colombier 	cmd(r, 1, 0x06);
41*529c1f20SDavid du Colombier //	cmd(r, 3, 0xD8);
42*529c1f20SDavid du Colombier 	for(;;)
43*529c1f20SDavid du Colombier 		print("%x\n", cmd(r, 2, 0x05));
44*529c1f20SDavid du Colombier 
45*529c1f20SDavid du Colombier }
46