From mboxrd@z Thu Jan 1 00:00:00 1970 From: Helmut Raiger Date: Wed, 28 Sep 2011 14:48:19 +0200 Subject: [U-Boot] mx31: Approach for WEIM CS accessors In-Reply-To: <20110922140833.CF0B6140796D@gemini.denx.de> References: <20110922140833.CF0B6140796D@gemini.denx.de> Message-ID: <1317214100-1379-1-git-send-email-helmut.raiger@hale.at> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de I tried to fix the magic numbers used by ALL mx31 boards (except one CS in qong.c) by using some macros. I stayed away from bitfields as it would have resulted in a very verbose change (something like the setup of CS 3 in qong.c). To verify the code I used this helper: -------------- cut ----------- #include typedef unsigned int uint; /* 13 fields of the upper CS control register */ #define CSCR_U(sp, wp, bcd, bcs, psz, pme, sync, dol, \ cnc, wsc, ew, wws, edc) \ ((sp) << 31 | (wp) << 30 | (bcd) << 28 | (psz) << 22 | (pme) << 21 |\ (sync) << 20 | (dol) << 16 | (cnc) << 14 | (wsc) << 8 | (ew) << 7 |\ (wws) << 4 | (edc) << 0) /* 12 fields of the lower CS control register */ #define CSCR_L(oea, oen, ebwa, ebwn, \ csa, ebc, dsz, csn, psr, cre, wrap, csen) \ ((oea) << 28 | (oen) << 24 | (ebwa) << 20 | (ebwn) << 16 |\ (csa) << 12 | (ebc) << 11 | (dsz) << 8 | (csn) << 4 |\ (psr) << 3 | (cre) << 2 | (wrap) << 1 | (csen) << 0) /* 14 fields of the additional CS control register */ #define CSCR_A(ebra, ebrn, rwa, rwn, mum, lah, lbn, lba, dww, dct, \ wwu, age, cnc2, fce) \ ((ebra) << 28 | (ebrn) << 24 | (rwa) << 20 | (rwn) << 16 |\ (mum) << 15 | (lah) << 13 | (lbn) << 10 | (lba) << 8 |\ (dww) << 6 | (dct) << 4 | (wwu) << 3 |\ (age) << 2 | (cnc2) << 1 | (fce) << 0) void decode(unsigned int u, unsigned int l, unsigned int a) { /* 13 fields of the upper CS control register */ uint sp = (u >> 31) & 1; uint wp = (u >> 30) & 1; uint bcd = (u >> 28) & 1; uint bcs = (u >> 24) & 15; uint psz = (u >> 22) & 3; uint pme = (u >> 21) & 1; uint sync = (u >> 20) & 1; uint dol = (u >> 16) & 15; uint cnc = (u >> 14) & 3; uint wsc = (u >> 8) & 31; uint ew = (u >> 7) & 1; uint wws = (u >> 4) & 7; uint edc = (u >> 0) & 15; /* 12 fields of the lower CS control register */ uint oea = (l >> 28) & 15; uint oen = (l >> 24) & 15; uint ebwa = (l >> 20) & 15; uint ebwn = (l >> 16) & 15; uint csa = (l >> 12) & 15; uint ebc = (l >> 11) & 1; uint dsz = (l >> 8) & 7; uint csn = (l >> 4) & 15; uint psr = (l >> 3) & 1; uint cre = (l >> 2) & 1; uint wrap = (l >> 1) & 1; uint csen = (l >> 0) & 1; /* 14 fields of the additional CS control register */ uint ebra = (a >> 28) & 15; uint ebrn = (a >> 24) & 15; uint rwa = (a >> 20) & 15; uint rwn = (a >> 16) & 15; uint mum = (a >> 15) & 1; uint lah = (a >> 13) & 3; uint lbn = (a >> 10) & 7; uint lba = (a >> 8) & 3; uint dww = (a >> 6) & 3; uint dct = (a >> 4) & 3; uint wwu = (a >> 3) & 1; uint age = (a >> 2) & 1; uint cnc2 = (a >> 1) & 1; uint fce = (a >> 0) & 1; printf("---- decode(0x%08x, 0x%08x, 0x%08x):\n", u, l, a); printf("/* sp wp bcd bcs psz pme sync dol cnc wsc ew wws edc */\n"); printf("CSCR_U(%2u,%2u,%3u,%3u,%3u,%3u,%4u,%3u,%3u,%3u,%2u,%3u,%3u)\n", sp, wp, bcd, bcs, psz, pme, sync, dol, cnc, wsc, ew, wws, edc); if(CSCR_U(sp, wp, bcd, bcs, psz, pme, sync, dol, cnc, wsc, ew, wws, edc) != u) printf("U is wrong\n"); printf("/* oea oen ebwa ebwn csa ebc dsz csn psr cre wrap csen */\n"); printf("CSCR_L(%3u,%3u,%4u,%4u,%3u,%3u,%3u,%3u,%3u,%3u,%4u,%4u)\n", oea, oen, ebwa, ebwn, csa, ebc, dsz, csn, psr, cre, wrap, csen); if(CSCR_L(oea, oen, ebwa, ebwn, csa, ebc, dsz, csn, psr, cre, wrap, csen) != l) printf("L is wrong\n"); printf("/* ebra ebrn rwa rwn mum lah lbn lba dww dct wwu age cnc2 fce */\n"); printf("CSCR_A(%2u,%4u,%3u,%3u,%3u,%3u,%3u,%3u,%3u,%3u,%3u,%3u,%4u,%3u)\n", ebra, ebrn, rwa, rwn, mum, lah, lbn, lba, dww, dct, wwu, age, cnc2, fce); if(CSCR_A(ebra, ebrn, rwa, rwn, mum, lah, lbn, lba, dww, dct, wwu, age, cnc2, fce) != a) printf("A is wrong\n"); } int main(void) { printf("qong: CS1 "); decode(0x00000A01, 0x20040501, 0x04020C00); printf("qong: CS3 "); decode(0x00004f00, 0x20013b31, 0x00020800); printf("tt01: CS4 "); decode(0x0000dcf6, 0x444A4541, 0x44443302); printf("pdk: CS5 "); decode(0x0000d843, 0x22252521, 0x22220a00); printf("ads: CS0 "); decode(0x00000f00, 0x10000D03, 0x00720900); printf("phycore: CS0 "); decode(0x0000cf03, 0x10000d03, 0x00720900); printf("phycore: CS1 "); decode(0x0000df06, 0x444a4541, 0x44443302); printf("phycore: CS4 "); decode(0x0000d843, 0x22252521, 0x22220a00); printf("litekit: CS0 "); decode(0x0000cf03, 0xa0330d01, 0x00220800); printf("litekit: CS4 "); decode(0x0000dcf6, 0x444a4541, 0x44443302); } -------------------- cut -------------------- -- Scanned by MailScanner.