2 #include "../port/lib.h"
8 #include "../port/error.h"
52 static Dirtab qspidir[Qmax] = {
53 ".", { Qdir, 0, QTDIR }, 0, 0555,
54 "boot", { Qboot, 0}, 65536, 0640,
56 static int nqspidir = Qbase;
59 qspicmd(int n, ulong d)
61 while((qspi[INTSTAT] & TXNFULL) == 0)
66 qspi[TXD1 - 1 + n] = d;
67 qspi[CONF] |= STARTCOM;
68 while((qspi[INTSTAT] & (TXNFULL|RXNEMPTY)) != (TXNFULL|RXNEMPTY))
80 qspi = vmap(QSPI_BASE, 0x100);
81 qspi[LQSPICFG] &= ~(1<<31);
82 qspi[CONF] = 1<<31 | 1<<19 | 1<<15 | 1<<14 | 1<<10 | 3<<6 | QSPIDIV<<3 | 1;
90 qspi[CONF] &= ~(1<<10);
102 d = qspicmd(2, 0x05);
106 tsleep(&up->sleep, return0, nil, 1);
111 doread(uvlong addr, void *a, ulong n)
117 if(addr + n > QSPISIZ)
119 evenaddr((uintptr) a);
121 qspicmd(4, 0x6B | addr << 8);
131 memmove(aa, (char*) &d + 4 - n, n);
140 dowrite(uvlong addr, void *a, ulong n)
146 if(addr + n > QSPISIZ)
148 evenaddr((uintptr) a);
156 qspicmd(4, 0x32 | addr << 8);
184 qspicmd(4, 0xD8 | addr << 8);
190 qspiwalk(Chan* c, Chan *nc, char** name, int nname)
192 return devwalk(c, nc, name, nname, qspidir, nqspidir, devgen);
196 qspistat(Chan* c, uchar* dp, int n)
198 return devstat(c, dp, n, qspidir, nqspidir, devgen);
202 qspiopen(Chan* c, int omode)
204 devopen(c, omode, qspidir, nqspidir, devgen);
205 if(c->qid.path == Qboot){
207 if((omode & OTRUNC) != 0)
216 if(c->qid.path == Qboot && (c->flag & COPEN) != 0)
221 qspiread(Chan *c, void *a, long n, vlong offset)
223 switch((ulong)c->qid.path){
225 return devdirread(c, a, n, qspidir, nqspidir, devgen);
227 return doread(offset, a, n);
235 qspiwrite(Chan *c, void *a, long n, vlong offset)
237 switch((ulong)c->qid.path){
239 return dowrite(offset, a, n);
247 qspiattach(char* spec)
250 return devattach('Q', spec);