1*569b7f92Snonaka /* $NetBSD: arm_pxa2x0.cpp,v 1.3 2010/04/06 16:20:28 nonaka Exp $ */
23af75740Srafal
33af75740Srafal /*-
43af75740Srafal * Copyright (c) 2008 The NetBSD Foundation, Inc.
53af75740Srafal * All rights reserved.
63af75740Srafal *
73af75740Srafal * This code is derived from software contributed to The NetBSD Foundation
83af75740Srafal * by UCHIYAMA Yasushi.
93af75740Srafal *
103af75740Srafal * Redistribution and use in source and binary forms, with or without
113af75740Srafal * modification, are permitted provided that the following conditions
123af75740Srafal * are met:
133af75740Srafal * 1. Redistributions of source code must retain the above copyright
143af75740Srafal * notice, this list of conditions and the following disclaimer.
153af75740Srafal * 2. Redistributions in binary form must reproduce the above copyright
163af75740Srafal * notice, this list of conditions and the following disclaimer in the
173af75740Srafal * documentation and/or other materials provided with the distribution.
183af75740Srafal *
193af75740Srafal * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
203af75740Srafal * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
213af75740Srafal * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
223af75740Srafal * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
233af75740Srafal * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
243af75740Srafal * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
253af75740Srafal * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
263af75740Srafal * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
273af75740Srafal * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
283af75740Srafal * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
293af75740Srafal * POSSIBILITY OF SUCH DAMAGE.
303af75740Srafal */
313af75740Srafal
323af75740Srafal #include <arm/arm_arch.h>
333af75740Srafal #include <console.h>
343af75740Srafal #include <memory.h>
353af75740Srafal #include <arm/arm_pxa2x0.h>
363af75740Srafal
373af75740Srafal /*
383af75740Srafal * Intel XScale PXA 2x0
393af75740Srafal */
403af75740Srafal
413af75740Srafal #define PAGE_SIZE 0x1000
423af75740Srafal #define DRAM_BANK_NUM 4 /* total 256MByte */
433af75740Srafal #define DRAM_BANK_SIZE 0x04000000 /* 64Mbyte */
443af75740Srafal
453af75740Srafal #define DRAM_BANK0_START 0xa0000000
463af75740Srafal #define DRAM_BANK0_SIZE DRAM_BANK_SIZE
473af75740Srafal #define DRAM_BANK1_START 0xa4000000
483af75740Srafal #define DRAM_BANK1_SIZE DRAM_BANK_SIZE
493af75740Srafal #define DRAM_BANK2_START 0xa8000000
503af75740Srafal #define DRAM_BANK2_SIZE DRAM_BANK_SIZE
513af75740Srafal #define DRAM_BANK3_START 0xac000000
523af75740Srafal #define DRAM_BANK3_SIZE DRAM_BANK_SIZE
533af75740Srafal #define ZERO_BANK_START 0xe0000000
543af75740Srafal #define ZERO_BANK_SIZE DRAM_BANK_SIZE
553af75740Srafal
563af75740Srafal __BEGIN_DECLS
573af75740Srafal
583af75740Srafal // 2nd bootloader
59*569b7f92Snonaka void boot_func_pxa2x0(kaddr_t, kaddr_t, kaddr_t, kaddr_t);
60*569b7f92Snonaka extern char boot_func_end_pxa2x0[];
61*569b7f92Snonaka #define BOOT_FUNC_START reinterpret_cast <vaddr_t>(boot_func_pxa2x0)
62*569b7f92Snonaka #define BOOT_FUNC_END reinterpret_cast <vaddr_t>(boot_func_end_pxa2x0)
633af75740Srafal
643af75740Srafal /* jump to 2nd loader */
65*569b7f92Snonaka void FlatJump_pxa2x0(kaddr_t, kaddr_t, kaddr_t, kaddr_t);
663af75740Srafal
673af75740Srafal __END_DECLS
683af75740Srafal
PXA2X0Architecture(Console * & cons,MemoryManager * & mem)693af75740Srafal PXA2X0Architecture::PXA2X0Architecture(Console *&cons, MemoryManager *&mem)
703af75740Srafal : ARMArchitecture(cons, mem)
713af75740Srafal {
723af75740Srafal DPRINTF((TEXT("PXA-2x0 CPU.\n")));
733af75740Srafal }
743af75740Srafal
~PXA2X0Architecture(void)753af75740Srafal PXA2X0Architecture::~PXA2X0Architecture(void)
763af75740Srafal {
773af75740Srafal }
783af75740Srafal
793af75740Srafal BOOL
init(void)803af75740Srafal PXA2X0Architecture::init(void)
813af75740Srafal {
823af75740Srafal if (!_mem->init()) {
833af75740Srafal DPRINTF((TEXT("can't initialize memory manager.\n")));
843af75740Srafal return FALSE;
853af75740Srafal }
863af75740Srafal // set D-RAM information
873af75740Srafal _mem->loadBank(DRAM_BANK0_START, DRAM_BANK_SIZE);
883af75740Srafal _mem->loadBank(DRAM_BANK1_START, DRAM_BANK_SIZE);
893af75740Srafal _mem->loadBank(DRAM_BANK2_START, DRAM_BANK_SIZE);
903af75740Srafal _mem->loadBank(DRAM_BANK3_START, DRAM_BANK_SIZE);
913af75740Srafal
92*569b7f92Snonaka // set D-cache information
93*569b7f92Snonaka dcachesize = 32768 * 2;
94*569b7f92Snonaka DPRINTF((TEXT("D-cache size = %d\n"), dcachesize));
95*569b7f92Snonaka
963af75740Srafal #ifdef HW_TEST
973af75740Srafal DPRINTF((TEXT("Testing framebuffer.\n")));
983af75740Srafal testFramebuffer();
993af75740Srafal
1003af75740Srafal DPRINTF((TEXT("Testing UART.\n")));
1013af75740Srafal testUART();
1023af75740Srafal #endif
1033af75740Srafal
104*569b7f92Snonaka #ifdef REGDUMP
105*569b7f92Snonaka DPRINTF((TEXT("Dump peripheral registers.\n")));
106*569b7f92Snonaka dumpPeripheralRegs();
107*569b7f92Snonaka #endif
108*569b7f92Snonaka
109*569b7f92Snonaka #ifdef CS0DUMP
110*569b7f92Snonaka uint32_t dumpsize = 1024 * 1024; // 1MB
111*569b7f92Snonaka DPRINTF((TEXT("Dump CS area (size = %d)\n"), dumpsize));
112*569b7f92Snonaka dumpCS0(dumpsize);
113*569b7f92Snonaka #endif
114*569b7f92Snonaka
1153af75740Srafal return TRUE;
1163af75740Srafal }
1173af75740Srafal
1183af75740Srafal void
testFramebuffer(void)1193af75740Srafal PXA2X0Architecture::testFramebuffer(void)
1203af75740Srafal {
1213af75740Srafal DPRINTF((TEXT("No framebuffer test yet.\n")));
1223af75740Srafal }
1233af75740Srafal
1243af75740Srafal void
testUART(void)1253af75740Srafal PXA2X0Architecture::testUART(void)
1263af75740Srafal {
1273af75740Srafal #define COM_DATA VOLATILE_REF8(uart + 0x00)
1283af75740Srafal #define COM_IIR VOLATILE_REF8(uart + 0x08)
1293af75740Srafal #define COM_LSR VOLATILE_REF8(uart + 0x14)
1303af75740Srafal #define LSR_TXRDY 0x20
1313af75740Srafal #define COM_TX_CHECK while (!(COM_LSR & LSR_TXRDY))
1323af75740Srafal #define COM_PUTCHAR(c) (COM_DATA = (c))
1333af75740Srafal #define COM_CLR_INTS ((void)COM_IIR)
1343af75740Srafal #define _(c) \
1353af75740Srafal __BEGIN_MACRO \
1363af75740Srafal COM_TX_CHECK; \
1373af75740Srafal COM_PUTCHAR(c); \
1383af75740Srafal COM_TX_CHECK; \
1393af75740Srafal COM_CLR_INTS; \
1403af75740Srafal __END_MACRO
1413af75740Srafal
1423af75740Srafal vaddr_t uart =
1433af75740Srafal _mem->mapPhysicalPage(0x40100000, 0x100, PAGE_READWRITE);
1443af75740Srafal
1453af75740Srafal // Don't turn on the enable-UART bit in the IER; this seems to
1463af75740Srafal // result in WinCE losing the port (and nothing working later).
1473af75740Srafal // All that should be taken care of by using WinCE to open the
1483af75740Srafal // port before we actually use it.
1493af75740Srafal
1503af75740Srafal _('H');_('e');_('l');_('l');_('o');_(' ');
1513af75740Srafal _('W');_('o');_('r');_('l');_('d');_('\r');_('\n');
1523af75740Srafal
1533af75740Srafal _mem->unmapPhysicalPage(uart);
1543af75740Srafal }
1553af75740Srafal
1563af75740Srafal BOOL
setupLoader(void)1573af75740Srafal PXA2X0Architecture::setupLoader(void)
1583af75740Srafal {
1593af75740Srafal vaddr_t v;
1603af75740Srafal vsize_t sz = BOOT_FUNC_END - BOOT_FUNC_START;
1613af75740Srafal
1623af75740Srafal // check 2nd bootloader size.
1633af75740Srafal if (sz > _mem->getPageSize()) {
1643af75740Srafal DPRINTF((TEXT("2nd bootloader size(%dbyte) is larger than page size(%d).\n"),
1653af75740Srafal sz, _mem->getPageSize()));
1663af75740Srafal return FALSE;
1673af75740Srafal }
1683af75740Srafal
1693af75740Srafal // get physical mapped page and copy loader to there.
1703af75740Srafal // don't writeback D-cache here. make sure to writeback before jump.
1713af75740Srafal if (!_mem->getPage(v , _loader_addr)) {
1723af75740Srafal DPRINTF((TEXT("can't get page for 2nd loader.\n")));
1733af75740Srafal return FALSE;
1743af75740Srafal }
1753af75740Srafal DPRINTF((TEXT("2nd bootloader vaddr=0x%08x paddr=0x%08x\n"),
1763af75740Srafal (unsigned)v,(unsigned)_loader_addr));
1773af75740Srafal
1783af75740Srafal memcpy(reinterpret_cast <LPVOID>(v),
1793af75740Srafal reinterpret_cast <LPVOID>(BOOT_FUNC_START), sz);
1803af75740Srafal DPRINTF((TEXT("2nd bootloader copy done.\n")));
1813af75740Srafal
1823af75740Srafal return TRUE;
1833af75740Srafal }
1843af75740Srafal
1853af75740Srafal void
jump(paddr_t info,paddr_t pvec)1863af75740Srafal PXA2X0Architecture::jump(paddr_t info, paddr_t pvec)
1873af75740Srafal {
1883af75740Srafal kaddr_t sp;
1893af75740Srafal vaddr_t v;
1903af75740Srafal paddr_t p;
1913af75740Srafal
1923af75740Srafal // stack for bootloader
1933af75740Srafal _mem->getPage(v, p);
1943af75740Srafal sp = ptokv(p) + _mem->getPageSize();
1953af75740Srafal DPRINTF((TEXT("sp for bootloader = %08x + %08x = %08x\n"),
1963af75740Srafal ptokv(p), _mem->getPageSize(), sp));
1973af75740Srafal
1983af75740Srafal // writeback whole D-cache
1993af75740Srafal WritebackDCache();
2003af75740Srafal
2013af75740Srafal SetKMode(1);
202*569b7f92Snonaka FlatJump_pxa2x0(info, pvec, sp, _loader_addr);
2033af75740Srafal // NOTREACHED
204*569b7f92Snonaka SetKMode(0);
205*569b7f92Snonaka DPRINTF((TEXT("Return from FlatJump_pxa2x0.\n")));
206*569b7f92Snonaka }
207*569b7f92Snonaka
208*569b7f92Snonaka
209*569b7f92Snonaka //
210*569b7f92Snonaka // dump CS0
211*569b7f92Snonaka //
212*569b7f92Snonaka void
dumpCS0(uint32_t size)213*569b7f92Snonaka PXA2X0Architecture::dumpCS0(uint32_t size)
214*569b7f92Snonaka {
215*569b7f92Snonaka static char buf[0x1000];
216*569b7f92Snonaka vaddr_t mem;
217*569b7f92Snonaka uint32_t addr;
218*569b7f92Snonaka uint32_t off;
219*569b7f92Snonaka HANDLE fh;
220*569b7f92Snonaka unsigned long wrote;
221*569b7f92Snonaka
222*569b7f92Snonaka fh = CreateFile(TEXT("rom.bin"), GENERIC_WRITE, FILE_SHARE_READ,
223*569b7f92Snonaka 0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
224*569b7f92Snonaka if (fh == INVALID_HANDLE_VALUE) {
225*569b7f92Snonaka DPRINTF((TEXT("can't open file. (%s)\n"), TEXT("rom.bin")));
226*569b7f92Snonaka return;
227*569b7f92Snonaka }
228*569b7f92Snonaka
229*569b7f92Snonaka for (addr = 0; addr < size; addr += 0x1000) {
230*569b7f92Snonaka memset(buf, 0, sizeof(buf));
231*569b7f92Snonaka mem = _mem->mapPhysicalPage(addr, 0x1000, PAGE_READWRITE);
232*569b7f92Snonaka for (off = 0; off < 0x1000; off++) {
233*569b7f92Snonaka buf[off] = VOLATILE_REF8(mem + off);
234*569b7f92Snonaka }
235*569b7f92Snonaka _mem->unmapPhysicalPage(mem);
236*569b7f92Snonaka WriteFile(fh, buf, 0x1000, &wrote, 0);
237*569b7f92Snonaka }
238*569b7f92Snonaka
239*569b7f92Snonaka CloseHandle(fh);
240*569b7f92Snonaka }
241*569b7f92Snonaka
242*569b7f92Snonaka //
243*569b7f92Snonaka // dump peripheral registers.
244*569b7f92Snonaka //
245*569b7f92Snonaka
246*569b7f92Snonaka #ifdef REGDUMP
247*569b7f92Snonaka #define PXA250_GPIO_REG_NUM 3
248*569b7f92Snonaka #define PXA250_GPIO_NUM 96
249*569b7f92Snonaka #define PXA270_GPIO_REG_NUM 4
250*569b7f92Snonaka #define PXA270_GPIO_NUM 121
251*569b7f92Snonaka
252*569b7f92Snonaka static const TCHAR *pxa270_gpioName[PXA270_GPIO_NUM][7] =
253*569b7f92Snonaka {
254*569b7f92Snonaka /*0*/ { TEXT("GPIO<0>"),TEXT(""),TEXT(""),TEXT(""),TEXT(""),TEXT(""),TEXT(""), },
255*569b7f92Snonaka /*1*/ { TEXT("GPIO<1>/nRESET_GPIO"),TEXT(""),TEXT(""),TEXT(""),TEXT(""),TEXT(""),TEXT(""), },
256*569b7f92Snonaka /*2*/ { TEXT("SYS_EN5"),TEXT(""),TEXT(""),TEXT(""),TEXT(""),TEXT(""),TEXT(""), },
257*569b7f92Snonaka /*3*/ { TEXT("GPIO<3>/PWR_SCL"),TEXT(""),TEXT(""),TEXT(""),TEXT(""),TEXT(""),TEXT(""), },
258*569b7f92Snonaka /*4*/ { TEXT("GPIO<4>/PWR_SDA"),TEXT(""),TEXT(""),TEXT(""),TEXT(""),TEXT(""),TEXT(""), },
259*569b7f92Snonaka /*5*/ { TEXT("PWR_CAP<0>"),TEXT(""),TEXT(""),TEXT(""),TEXT(""),TEXT(""),TEXT(""), },
260*569b7f92Snonaka /*6*/ { TEXT("PWR_CAP<1>"),TEXT(""),TEXT(""),TEXT(""),TEXT(""),TEXT(""),TEXT(""), },
261*569b7f92Snonaka /*7*/ { TEXT("PWR_CAP<2>"),TEXT(""),TEXT(""),TEXT(""),TEXT(""),TEXT(""),TEXT(""), },
262*569b7f92Snonaka /*8*/ { TEXT("PWR_CAP<3>"),TEXT(""),TEXT(""),TEXT(""),TEXT(""),TEXT(""),TEXT(""), },
263*569b7f92Snonaka /*9*/ { TEXT("GPIO<9>"),TEXT(""),TEXT(""),TEXT("FFCTS"),TEXT("HZ_CLK"),TEXT(""),TEXT("CHOUT<0>"), },
264*569b7f92Snonaka /*10*/ { TEXT("GPIO<10>"),TEXT("FFDCD"),TEXT(""),TEXT("USB_P3_57"),TEXT("HZ_CLK"),TEXT(""),TEXT("CHOUT<1>"), },
265*569b7f92Snonaka /*11*/ { TEXT("GPIO<11>"),TEXT("EXT_SYNC<0>"),TEXT("SSPRXD2"),TEXT("USB_P3_1"),TEXT("CHOUT<0>"),TEXT("PWM_OUT<2>"),TEXT("48_MHz"), },
266*569b7f92Snonaka /*12*/ { TEXT("GPIO<12>"),TEXT("EXT_SYNC<1>"),TEXT("CIF_DD<7>"),TEXT(""),TEXT("CHOUT<1>"),TEXT("PWM_OUT<3>"),TEXT("48_MHz"), },
267*569b7f92Snonaka /*13*/ { TEXT("GPIO<13>"),TEXT("CLK_EXT"),TEXT("KP_DKIN<7>"),TEXT("KP_MKIN<7>"),TEXT("SSPTXD2"),TEXT(""),TEXT(""), },
268*569b7f92Snonaka /*14*/ { TEXT("GPIO<14>"),TEXT("L_VSYNC"),TEXT("SSPSFRM2"),TEXT(""),TEXT(""),TEXT("SSPSFRM2"),TEXT("UCLK"), },
269*569b7f92Snonaka /*15*/ { TEXT("GPIO<15>"),TEXT(""),TEXT(""),TEXT(""),TEXT("nPCE<1>"),TEXT("nCS<1>"),TEXT(""), },
270*569b7f92Snonaka /*16*/ { TEXT("GPIO<16>"),TEXT("KP_MKIN<5>"),TEXT(""),TEXT(""),TEXT(""),TEXT("PWM_OUT<0>"),TEXT("FFTXD"), },
271*569b7f92Snonaka /*17*/ { TEXT("GPIO<17>"),TEXT("KP_MKIN<6>"),TEXT("CIF_DD<6>"),TEXT(""),TEXT(""),TEXT("PWM_OUT<1>"),TEXT(""), },
272*569b7f92Snonaka /*18*/ { TEXT("GPIO<18>"),TEXT("RDY"),TEXT(""),TEXT(""),TEXT(""),TEXT(""),TEXT(""), },
273*569b7f92Snonaka /*19*/ { TEXT("GPIO<19>"),TEXT("SSPSCLK2"),TEXT(""),TEXT("FFRXD"),TEXT("SSPSCLK2"),TEXT("L_CS"),TEXT("nURST"), },
274*569b7f92Snonaka /*20*/ { TEXT("GPIO<20>"),TEXT("DREQ<0>"),TEXT("MBREQ"),TEXT(""),TEXT("nSDCS<2>"),TEXT(""),TEXT(""), },
275*569b7f92Snonaka /*21*/ { TEXT("GPIO<21>"),TEXT(""),TEXT(""),TEXT(""),TEXT("nSDCS<3>"),TEXT("DVAL<0>"),TEXT("MBGNT"), },
276*569b7f92Snonaka /*22*/ { TEXT("GPIO<22>"),TEXT("SSPEXTCLK2"),TEXT("SSPSCLK2EN"),TEXT("SSPSCLK2"),TEXT("KP_MKOUT<7>"),TEXT("SSPSYSCLK2"),TEXT("SSPSCLK2"), },
277*569b7f92Snonaka /*23*/ { TEXT("GPIO<23>"),TEXT(""),TEXT("SSPSCLK"),TEXT(""),TEXT("CIF_MCLK"),TEXT("SSPSCLK"),TEXT(""), },
278*569b7f92Snonaka /*24*/ { TEXT("GPIO<24>"),TEXT("CIF_FV"),TEXT("SSPSFRM"),TEXT(""),TEXT("CIF_FV"),TEXT("SSPSFRM"),TEXT(""), },
279*569b7f92Snonaka /*25*/ { TEXT("GPIO<25>"),TEXT("CIF_LV"),TEXT(""),TEXT(""),TEXT("CIF_LV"),TEXT("SSPTXD"),TEXT(""), },
280*569b7f92Snonaka /*26*/ { TEXT("GPIO<26>"),TEXT("SSPRXD"),TEXT("CIF_PCLK"),TEXT("FFCTS"),TEXT(""),TEXT(""),TEXT(""), },
281*569b7f92Snonaka /*27*/ { TEXT("GPIO<27>"),TEXT("SSPEXTCLK"),TEXT("SSPSCLKEN"),TEXT("CIF_DD<0>"),TEXT("SSPSYSCLK"),TEXT(""),TEXT("FFRTS"), },
282*569b7f92Snonaka /*28*/ { TEXT("GPIO<28>"),TEXT("AC97_BITCLK"),TEXT("I2S_BITCLK"),TEXT("SSPSFRM"),TEXT("I2S_BITCLK"),TEXT(""),TEXT("SSPSFRM"), },
283*569b7f92Snonaka /*29*/ { TEXT("GPIO<29>"),TEXT("AC97_SDATA_IN_0"),TEXT("I2S_SDATA_IN"),TEXT("SSPSCLK"),TEXT("SSPRXD2"),TEXT(""),TEXT("SSPSCLK"), },
284*569b7f92Snonaka /*30*/ { TEXT("GPIO<30>"),TEXT(""),TEXT(""),TEXT(""),TEXT("I2S_SDATA_OUT"),TEXT("AC97_SDATA_OUT"),TEXT("USB_P3_2"), },
285*569b7f92Snonaka /*31*/ { TEXT("GPIO<31>"),TEXT(""),TEXT(""),TEXT(""),TEXT("I2S_SYNC"),TEXT("AC97_SYNC"),TEXT("USB_P3_6"), },
286*569b7f92Snonaka /*32*/ { TEXT("GPIO<32>"),TEXT(""),TEXT(""),TEXT(""),TEXT("MSSCLK"),TEXT("MMCLK"),TEXT(""), },
287*569b7f92Snonaka /*33*/ { TEXT("GPIO<33>"),TEXT("FFRXD"),TEXT("FFDSR"),TEXT(""),TEXT("DVAL<1>"),TEXT("nCS<5>"),TEXT("MBGNT"), },
288*569b7f92Snonaka /*34*/ { TEXT("GPIO<34>"),TEXT("FFRXD"),TEXT("KP_MKIN<3>"),TEXT("SSPSCLK3"),TEXT("USB_P2_2"),TEXT(""),TEXT("SSPSCLK3"), },
289*569b7f92Snonaka /*35*/ { TEXT("GPIO<35>"),TEXT("FFCTS"),TEXT("USB_P2_1"),TEXT("SSPSFRM3"),TEXT(""),TEXT("KP_MKOUT<6>"),TEXT("SSPTXD3"), },
290*569b7f92Snonaka /*36*/ { TEXT("GPIO<36>"),TEXT("FFDCD"),TEXT("SSPSCLK2"),TEXT("KP_MKIN<7>"),TEXT("USB_P2_4"),TEXT("SSPSCLK2"),TEXT(""), },
291*569b7f92Snonaka /*37*/ { TEXT("GPIO<37>"),TEXT("FFDSR"),TEXT("SSPSFRM2"),TEXT("KP_MKIN<3>"),TEXT("USB_P2_8"),TEXT("SSPSFRM2"),TEXT("FFTXD"), },
292*569b7f92Snonaka /*38*/ { TEXT("GPIO<38>"),TEXT("FFRI"),TEXT("KP_MKIN<4>"),TEXT("USB_P2_3"),TEXT("SSPTXD3"),TEXT("SSPTXD2"),TEXT("PWM_OUT<1>"), },
293*569b7f92Snonaka /*39*/ { TEXT("GPIO<39>"),TEXT("KP_MKIN<4>"),TEXT(""),TEXT("SSPSFRM3"),TEXT("USB_P2_6"),TEXT("FFTXD"),TEXT("SSPSFRM3"), },
294*569b7f92Snonaka /*40*/ { TEXT("GPIO<40>"),TEXT("SSPRXD2"),TEXT(""),TEXT("USB_P2_5"),TEXT("KP_MKOUT<6>"),TEXT("FFDTR"),TEXT("SSPSCLK3"), },
295*569b7f92Snonaka /*41*/ { TEXT("GPIO<41>"),TEXT("FFRXD"),TEXT("USB_P2_7"),TEXT("SSPRXD3"),TEXT("KP_MKOUT<7>"),TEXT("FFRTS"),TEXT(""), },
296*569b7f92Snonaka /*42*/ { TEXT("GPIO<42>"),TEXT("BTRXD"),TEXT("ICP_RXD"),TEXT(""),TEXT(""),TEXT(""),TEXT("CIF_MCLK"), },
297*569b7f92Snonaka /*43*/ { TEXT("GPIO<43>"),TEXT(""),TEXT(""),TEXT("CIF_FV"),TEXT("ICP_TXD"),TEXT("BTTXD"),TEXT("CIF_FV"), },
298*569b7f92Snonaka /*44*/ { TEXT("GPIO<44>"),TEXT("BTCTS"),TEXT(""),TEXT("CIF_LV"),TEXT(""),TEXT(""),TEXT("CIF_LV"), },
299*569b7f92Snonaka /*45*/ { TEXT("GPIO<45>"),TEXT(""),TEXT(""),TEXT("CIF_PCLK"),TEXT("AC97_SYSCLK"),TEXT("BTRTS"),TEXT("SSPSYSCLK3"), },
300*569b7f92Snonaka /*46*/ { TEXT("GPIO<46>"),TEXT("ICP_RXD"),TEXT("STD_RXD"),TEXT(""),TEXT(""),TEXT("PWM_OUT<2>"),TEXT(""), },
301*569b7f92Snonaka /*47*/ { TEXT("GPIO<47>"),TEXT("CIF_DD<0>"),TEXT(""),TEXT(""),TEXT("STD_TXD"),TEXT("ICP_TXD"),TEXT("PWM_OUT<3>"), },
302*569b7f92Snonaka /*48*/ { TEXT("GPIO<48>"),TEXT("CIF_DD<5>"),TEXT(""),TEXT(""),TEXT("BB_OB_DAT<1>"),TEXT("nPOE"),TEXT(""), },
303*569b7f92Snonaka /*49*/ { TEXT("GPIO<49>"),TEXT(""),TEXT(""),TEXT(""),TEXT(""),TEXT("nPWE"),TEXT(""), },
304*569b7f92Snonaka /*50*/ { TEXT("GPIO<50>"),TEXT("CIF_DD<3>"),TEXT(""),TEXT("SSPSCLK2"),TEXT("BB_OB_DAT<2>"),TEXT("nPIOR"),TEXT("SSPSCLK2"), },
305*569b7f92Snonaka /*51*/ { TEXT("GPIO<51>"),TEXT("CIF_DD<2>"),TEXT(""),TEXT(""),TEXT("BB_OB_DAT<3>"),TEXT("nPIOW"),TEXT(""), },
306*569b7f92Snonaka /*52*/ { TEXT("GPIO<52>"),TEXT("CIF_DD<4>"),TEXT("SSPSCLK3"),TEXT(""),TEXT("BB_OB_CLK"),TEXT("SSPSCLK3"),TEXT(""), },
307*569b7f92Snonaka /*53*/ { TEXT("GPIO<53>"),TEXT("FFRXD"),TEXT("USB_P2_3"),TEXT(""),TEXT("BB_OB_STB"),TEXT("CIF_MCLK"),TEXT("SSPSYSCLK"), },
308*569b7f92Snonaka /*54*/ { TEXT("GPIO<54>"),TEXT(""),TEXT("BB_OB_WAIT"),TEXT("CIF_PCLK"),TEXT(""),TEXT("nPCE<2>"),TEXT(""), },
309*569b7f92Snonaka /*55*/ { TEXT("GPIO<55>"),TEXT("CIF_DD<1>"),TEXT("BB_IB_DAT<1>"),TEXT(""),TEXT(""),TEXT("nPREG"),TEXT(""), },
310*569b7f92Snonaka /*56*/ { TEXT("GPIO<56>"),TEXT("nPWAIT"),TEXT("BB_IB_DAT<2>"),TEXT(""),TEXT("USB_P3_4"),TEXT(""),TEXT(""), },
311*569b7f92Snonaka /*57*/ { TEXT("GPIO<57>"),TEXT("nIOIS16"),TEXT("BB_IB_DAT<3>"),TEXT(""),TEXT(""),TEXT(""),TEXT("SSPTXD"), },
312*569b7f92Snonaka /*58*/ { TEXT("GPIO<58>"),TEXT(""),TEXT("LDD<0>"),TEXT(""),TEXT(""),TEXT("LDD<0>"),TEXT(""), },
313*569b7f92Snonaka /*59*/ { TEXT("GPIO<59>"),TEXT(""),TEXT("LDD<1>"),TEXT(""),TEXT(""),TEXT("LDD<1>"),TEXT(""), },
314*569b7f92Snonaka /*60*/ { TEXT("GPIO<60>"),TEXT(""),TEXT("LDD<2>"),TEXT(""),TEXT(""),TEXT("LDD<2>"),TEXT(""), },
315*569b7f92Snonaka /*61*/ { TEXT("GPIO<61>"),TEXT(""),TEXT("LDD<3>"),TEXT(""),TEXT(""),TEXT("LDD<3>"),TEXT(""), },
316*569b7f92Snonaka /*62*/ { TEXT("GPIO<62>"),TEXT(""),TEXT("LDD<4>"),TEXT(""),TEXT(""),TEXT("LDD<4>"),TEXT(""), },
317*569b7f92Snonaka /*63*/ { TEXT("GPIO<63>"),TEXT(""),TEXT("LDD<5>"),TEXT(""),TEXT(""),TEXT("LDD<5>"),TEXT(""), },
318*569b7f92Snonaka /*64*/ { TEXT("GPIO<64>"),TEXT(""),TEXT("LDD<6>"),TEXT(""),TEXT(""),TEXT("LDD<6>"),TEXT(""), },
319*569b7f92Snonaka /*65*/ { TEXT("GPIO<65>"),TEXT(""),TEXT("LDD<7>"),TEXT(""),TEXT(""),TEXT("LDD<7>"),TEXT(""), },
320*569b7f92Snonaka /*66*/ { TEXT("GPIO<66>"),TEXT(""),TEXT("LDD<8>"),TEXT(""),TEXT(""),TEXT("LDD<8>"),TEXT(""), },
321*569b7f92Snonaka /*67*/ { TEXT("GPIO<67>"),TEXT(""),TEXT("LDD<9>"),TEXT(""),TEXT(""),TEXT("LDD<9>"),TEXT(""), },
322*569b7f92Snonaka /*68*/ { TEXT("GPIO<68>"),TEXT(""),TEXT("LDD<10>"),TEXT(""),TEXT(""),TEXT("LDD<10>"),TEXT(""), },
323*569b7f92Snonaka /*69*/ { TEXT("GPIO<69>"),TEXT(""),TEXT("LDD<11>"),TEXT(""),TEXT(""),TEXT("LDD<11>"),TEXT(""), },
324*569b7f92Snonaka /*70*/ { TEXT("GPIO<70>"),TEXT(""),TEXT("LDD<12>"),TEXT(""),TEXT(""),TEXT("LDD<12>"),TEXT(""), },
325*569b7f92Snonaka /*71*/ { TEXT("GPIO<71>"),TEXT(""),TEXT("LDD<13>"),TEXT(""),TEXT(""),TEXT("LDD<13>"),TEXT(""), },
326*569b7f92Snonaka /*72*/ { TEXT("GPIO<72>"),TEXT(""),TEXT("LDD<14>"),TEXT(""),TEXT(""),TEXT("LDD<14>"),TEXT(""), },
327*569b7f92Snonaka /*73*/ { TEXT("GPIO<73>"),TEXT(""),TEXT("LDD<15>"),TEXT(""),TEXT(""),TEXT("LDD<15>"),TEXT(""), },
328*569b7f92Snonaka /*74*/ { TEXT("GPIO<74>"),TEXT(""),TEXT(""),TEXT(""),TEXT(""),TEXT("L_FCLK_RD"),TEXT(""), },
329*569b7f92Snonaka /*75*/ { TEXT("GPIO<75>"),TEXT(""),TEXT(""),TEXT(""),TEXT(""),TEXT("L_LCLK_A0"),TEXT(""), },
330*569b7f92Snonaka /*76*/ { TEXT("GPIO<76>"),TEXT(""),TEXT(""),TEXT(""),TEXT(""),TEXT("L_PCLK_WR"),TEXT(""), },
331*569b7f92Snonaka /*77*/ { TEXT("GPIO<77>"),TEXT(""),TEXT(""),TEXT(""),TEXT(""),TEXT("L_BIAS"),TEXT(""), },
332*569b7f92Snonaka /*78*/ { TEXT("GPIO<78>"),TEXT(""),TEXT(""),TEXT(""),TEXT("nPCE<2>"),TEXT("nCS<2>"),TEXT(""), },
333*569b7f92Snonaka /*79*/ { TEXT("GPIO<79>"),TEXT(""),TEXT(""),TEXT(""),TEXT("PSKTSEL"),TEXT("nCS<3>"),TEXT("PWM_OUT<2>"), },
334*569b7f92Snonaka /*80*/ { TEXT("GPIO<80>"),TEXT("DREQ<1>"),TEXT("MBREQ"),TEXT(""),TEXT(""),TEXT("nCS<4>"),TEXT("PWM_OUT<3>"), },
335*569b7f92Snonaka /*81*/ { TEXT("GPIO<81>"),TEXT(""),TEXT("CIF_DD<0>"),TEXT(""),TEXT("SSPTXD3"),TEXT("BB_OB_DAT<0>"),TEXT(""), },
336*569b7f92Snonaka /*82*/ { TEXT("GPIO<82>"),TEXT("SSPRXD3"),TEXT("BB_IB_DAT<0>"),TEXT("CIF_DD<5>"),TEXT(""),TEXT(""),TEXT("FFDTR"), },
337*569b7f92Snonaka /*83*/ { TEXT("GPIO<83>"),TEXT("SSPSFRM3"),TEXT("BB_IB_CLK"),TEXT("CIF_DD<4>"),TEXT("SSPSFRM3"),TEXT("FFTXD"),TEXT("FFRTS"), },
338*569b7f92Snonaka /*84*/ { TEXT("GPIO<84>"),TEXT("SSPCLK3"),TEXT("BB_IB_STB"),TEXT("CIF_FV"),TEXT("SSPCLK3"),TEXT(""),TEXT("CIF_FV"), },
339*569b7f92Snonaka /*85*/ { TEXT("GPIO<85>"),TEXT("FFRXD"),TEXT("DREQ<2>"),TEXT("CIF_LV"),TEXT("nPCE<1>"),TEXT("BB_IB_WAIT"),TEXT("CIF_LV"), },
340*569b7f92Snonaka /*86*/ { TEXT("GPIO<86>"),TEXT("SSPRXD2"),TEXT("LDD<16>"),TEXT("USB_P3_5"),TEXT("nPCE<1>"),TEXT("LDD<16>"),TEXT(""), },
341*569b7f92Snonaka /*87*/ { TEXT("GPIO<87>"),TEXT("nPCE<2>"),TEXT("LDD<17>"),TEXT("USB_P3_1"),TEXT("SSPTXD2"),TEXT("LDD<17>"),TEXT("SSPSFRM2"), },
342*569b7f92Snonaka /*88*/ { TEXT("GPIO<88>"),TEXT("USBHPWR<1>"),TEXT("SSPRXD2"),TEXT("SSPSFRM2"),TEXT(""),TEXT(""),TEXT("SSPSFRM2"), },
343*569b7f92Snonaka /*89*/ { TEXT("GPIO<89>"),TEXT("SSPRXD3"),TEXT(""),TEXT("FFRI"),TEXT("AC97_SYSCLK"),TEXT("USBHPEN<1>"),TEXT("SSPTXD2"), },
344*569b7f92Snonaka /*90*/ { TEXT("GPIO<90>"),TEXT("KP_MKIN<5>"),TEXT("USB_P3_5"),TEXT("CIF_DD<4>"),TEXT(""),TEXT("nURST"),TEXT(""), },
345*569b7f92Snonaka /*91*/ { TEXT("GPIO<91>"),TEXT("KP_MKIN<6>"),TEXT("USB_P3_1"),TEXT("CIF_DD<5>"),TEXT(""),TEXT("UCLK"),TEXT(""), },
346*569b7f92Snonaka /*92*/ { TEXT("GPIO<92>"),TEXT("MMDAT<0>"),TEXT(""),TEXT(""),TEXT("MMDAT<0>"),TEXT("MSBS"),TEXT(""), },
347*569b7f92Snonaka /*93*/ { TEXT("GPIO<93>"),TEXT("KP_DKIN<0>"),TEXT("CIF_DD<6>"),TEXT(""),TEXT("AC97_SDATA_OUT"),TEXT(""),TEXT(""), },
348*569b7f92Snonaka /*94*/ { TEXT("GPIO<94>"),TEXT("KP_DKIN<1>"),TEXT("CIF_DD<5>"),TEXT(""),TEXT("AC97_SYNC"),TEXT(""),TEXT(""), },
349*569b7f92Snonaka /*95*/ { TEXT("GPIO<95>"),TEXT("KP_DKIN<2>"),TEXT("CIF_DD<4>"),TEXT("KP_MKIN<6>"),TEXT("AC97_RESET_n"),TEXT(""),TEXT(""), },
350*569b7f92Snonaka /*96*/ { TEXT("GPIO<96>"),TEXT("KP_DKIN<3>"),TEXT("MBREQ"),TEXT("FFRXD"),TEXT(""),TEXT("DVAL<1>"),TEXT("KP_MKOUT<6>"), },
351*569b7f92Snonaka /*97*/ { TEXT("GPIO<97>"),TEXT("KP_DKIN<4>"),TEXT("DREQ<1>"),TEXT("KP_MKIN<3>"),TEXT(""),TEXT("MBGNT"),TEXT(""), },
352*569b7f92Snonaka /*98*/ { TEXT("GPIO<98>"),TEXT("KP_DKIN<5>"),TEXT("CIF_DD<0>"),TEXT("KP_MKIN<4>"),TEXT("AC97_SYSCLK"),TEXT(""),TEXT("FFRTS"), },
353*569b7f92Snonaka /*99*/ { TEXT("GPIO<99>"),TEXT("KP_DKIN<6>"),TEXT("AC97_SDATA_IN_1"),TEXT("KP_MKIN<5>"),TEXT(""),TEXT(""),TEXT("FFTXD"), },
354*569b7f92Snonaka /*100*/ { TEXT("GPIO<100>"),TEXT("KP_MKIN<0>"),TEXT("DREQ<2>"),TEXT("FFCTS"),TEXT(""),TEXT(""),TEXT(""), },
355*569b7f92Snonaka /*101*/ { TEXT("GPIO<101>"),TEXT("KP_MKIN<1>"),TEXT(""),TEXT(""),TEXT(""),TEXT(""),TEXT(""), },
356*569b7f92Snonaka /*102*/ { TEXT("GPIO<102>"),TEXT("KP_MKIN<2>"),TEXT(""),TEXT("FFRXD"),TEXT("nPCE<1>"),TEXT(""),TEXT(""), },
357*569b7f92Snonaka /*103*/ { TEXT("GPIO<103>"),TEXT("CIF_DD<3>"),TEXT(""),TEXT(""),TEXT(""),TEXT("KP_MKOUT<0>"),TEXT(""), },
358*569b7f92Snonaka /*104*/ { TEXT("GPIO<104>"),TEXT("CIF_DD<2>"),TEXT(""),TEXT(""),TEXT("PSKTSEL"),TEXT("KP_MKOUT<1>"),TEXT(""), },
359*569b7f92Snonaka /*105*/ { TEXT("GPIO<105>"),TEXT("CIF_DD<1>"),TEXT(""),TEXT(""),TEXT("nPCE<2>"),TEXT("KP_MKOUT<2>"),TEXT(""), },
360*569b7f92Snonaka /*106*/ { TEXT("GPIO<106>"),TEXT("CIF_DD<9>"),TEXT(""),TEXT(""),TEXT(""),TEXT("KP_MKOUT<3>"),TEXT(""), },
361*569b7f92Snonaka /*107*/ { TEXT("GPIO<107>"),TEXT("CIF_DD<8>"),TEXT(""),TEXT(""),TEXT(""),TEXT("KP_MKOUT<4>"),TEXT(""), },
362*569b7f92Snonaka /*108*/ { TEXT("GPIO<108>"),TEXT("CIF_DD<7>"),TEXT(""),TEXT(""),TEXT("CHOUT<0>"),TEXT("KP_MKOUT<5>"),TEXT(""), },
363*569b7f92Snonaka /*109*/ { TEXT("GPIO<109>"),TEXT("MMDAT<1>"),TEXT("MSSDIO"),TEXT(""),TEXT("MMDAT<1>"),TEXT("MSSDIO"),TEXT(""), },
364*569b7f92Snonaka /*110*/ { TEXT("GPIO<110>"),TEXT("MMDAT<2>/MMCCS<0>"),TEXT(""),TEXT(""),TEXT("MMDAT<2>/MMCCS<0>"),TEXT(""),TEXT(""), },
365*569b7f92Snonaka /*111*/ { TEXT("GPIO<111>"),TEXT("MMDAT<3>/MMCCS<1>"),TEXT(""),TEXT(""),TEXT("MMDAT<3>/MMCCS<1>"),TEXT(""),TEXT(""), },
366*569b7f92Snonaka /*112*/ { TEXT("GPIO<112>"),TEXT("MMCMD"),TEXT("nMSINS"),TEXT(""),TEXT("MMCMD"),TEXT(""),TEXT(""), },
367*569b7f92Snonaka /*113*/ { TEXT("GPIO<113>"),TEXT(""),TEXT(""),TEXT("USB_P3_3"),TEXT("I2S_SYSCLK"),TEXT("AC97_RESET_n"),TEXT(""), },
368*569b7f92Snonaka /*114*/ { TEXT("GPIO<114>"),TEXT("CIF_DD<1>"),TEXT(""),TEXT(""),TEXT("UEN"),TEXT("UVS0"),TEXT(""), },
369*569b7f92Snonaka /*115*/ { TEXT("GPIO<115>"),TEXT("DREQ<0>"),TEXT("CIF_DD<3>"),TEXT("MBREQ"),TEXT("UEN"),TEXT("nUVS1"),TEXT("PWM_OUT<1>"), },
370*569b7f92Snonaka /*116*/ { TEXT("GPIO<116>"),TEXT("CIF_DD<2>"),TEXT("AC97_SDATA_IN_0"),TEXT("UDET"),TEXT("DVAL<0>"),TEXT("nUVS2"),TEXT("MBGNT"), },
371*569b7f92Snonaka /*117*/ { TEXT("GPIO<117>"),TEXT("SCL"),TEXT(""),TEXT(""),TEXT("SCL"),TEXT(""),TEXT(""), },
372*569b7f92Snonaka /*118*/ { TEXT("GPIO<118>"),TEXT("SDA"),TEXT(""),TEXT(""),TEXT("SDA"),TEXT(""),TEXT(""), },
373*569b7f92Snonaka /*119*/ { TEXT("GPIO<119>"),TEXT("USBHPWR<2>"),TEXT(""),TEXT(""),TEXT(""),TEXT(""),TEXT(""), },
374*569b7f92Snonaka /*120*/ { TEXT("GPIO<120>"),TEXT("USBHPEN<2>"),TEXT(""),TEXT(""),TEXT(""),TEXT(""),TEXT(""), },
375*569b7f92Snonaka };
376*569b7f92Snonaka #endif
377*569b7f92Snonaka
378*569b7f92Snonaka void
dumpPeripheralRegs(void)379*569b7f92Snonaka PXA2X0Architecture::dumpPeripheralRegs(void)
380*569b7f92Snonaka {
381*569b7f92Snonaka #ifdef REGDUMP
382*569b7f92Snonaka uint32_t reg;
383*569b7f92Snonaka bool first;
384*569b7f92Snonaka int i, n;
385*569b7f92Snonaka
386*569b7f92Snonaka #define GPIO_OFFSET(r,o) ((r == 3) ? (o + 0x100) : (o + (r * 4)))
387*569b7f92Snonaka // GPIO
388*569b7f92Snonaka if (platid_match(&platid, &platid_mask_CPU_ARM_XSCALE_PXA270))
389*569b7f92Snonaka n = PXA270_GPIO_REG_NUM;
390*569b7f92Snonaka else
391*569b7f92Snonaka n = PXA250_GPIO_REG_NUM;
392*569b7f92Snonaka
393*569b7f92Snonaka vaddr_t gpio =
394*569b7f92Snonaka _mem->mapPhysicalPage(0x40e00000, 0x1000, PAGE_READWRITE);
395*569b7f92Snonaka DPRINTF((TEXT("Dump GPIO registers.\n")));
396*569b7f92Snonaka for (i = 0; i < n; i++) {
397*569b7f92Snonaka reg = VOLATILE_REF(gpio + GPIO_OFFSET(i, 0x00));
398*569b7f92Snonaka DPRINTF((TEXT("GPLR%d: 0x%08x\n"), i, reg));
399*569b7f92Snonaka }
400*569b7f92Snonaka for (i = 0; i < n; i++) {
401*569b7f92Snonaka reg = VOLATILE_REF(gpio + GPIO_OFFSET(i, 0x0c));
402*569b7f92Snonaka DPRINTF((TEXT("GPDR%d: 0x%08x\n"), i, reg));
403*569b7f92Snonaka }
404*569b7f92Snonaka #if 0 /* write-only register */
405*569b7f92Snonaka for (i = 0; i < n; i++) {
406*569b7f92Snonaka reg = VOLATILE_REF(gpio + GPIO_OFFSET(i, 0x18));
407*569b7f92Snonaka DPRINTF((TEXT("GPSR%d: 0x%08x\n"), reg));
408*569b7f92Snonaka }
409*569b7f92Snonaka for (i = 0; i < n; i++) {
410*569b7f92Snonaka reg = VOLATILE_REF(gpio + GPIO_OFFSET(i, 0x24));
411*569b7f92Snonaka DPRINTF((TEXT("GPCR%d: 0x%08x\n"), reg));
412*569b7f92Snonaka }
413*569b7f92Snonaka #endif
414*569b7f92Snonaka for (i = 0; i < n; i++) {
415*569b7f92Snonaka reg = VOLATILE_REF(gpio + GPIO_OFFSET(i, 0x30));
416*569b7f92Snonaka DPRINTF((TEXT("GRER%d: 0x%08x\n"), i, reg));
417*569b7f92Snonaka }
418*569b7f92Snonaka for (i = 0; i < n; i++) {
419*569b7f92Snonaka reg = VOLATILE_REF(gpio + GPIO_OFFSET(i, 0x3c));
420*569b7f92Snonaka DPRINTF((TEXT("GFER%d: 0x%08x\n"), i, reg));
421*569b7f92Snonaka }
422*569b7f92Snonaka for (i = 0; i < n; i++) {
423*569b7f92Snonaka reg = VOLATILE_REF(gpio + GPIO_OFFSET(i, 0x48));
424*569b7f92Snonaka DPRINTF((TEXT("GEDR%d: 0x%08x\n"), i, reg));
425*569b7f92Snonaka }
426*569b7f92Snonaka for (i = 0; i < n; i++) {
427*569b7f92Snonaka reg = VOLATILE_REF(gpio + 0x54 + (i * 8));
428*569b7f92Snonaka DPRINTF((TEXT("GAFR%d_L: 0x%08x\n"), i, reg));
429*569b7f92Snonaka reg = VOLATILE_REF(gpio + 0x58 + (i * 8));
430*569b7f92Snonaka DPRINTF((TEXT("GAFR%d_U: 0x%08x\n"), i, reg));
431*569b7f92Snonaka }
432*569b7f92Snonaka
433*569b7f92Snonaka //
434*569b7f92Snonaka // display detail
435*569b7f92Snonaka //
436*569b7f92Snonaka
437*569b7f92Snonaka if (!platid_match(&platid, &platid_mask_CPU_ARM_XSCALE_PXA270))
438*569b7f92Snonaka return;
439*569b7f92Snonaka
440*569b7f92Snonaka // header
441*569b7f92Snonaka DPRINTF((TEXT("pin#,function,name,rising,falling,status\n")));
442*569b7f92Snonaka
443*569b7f92Snonaka n = PXA270_GPIO_NUM;
444*569b7f92Snonaka for (i = 0; i < n; i++) {
445*569b7f92Snonaka const TCHAR *fn_name, *pin_name;
446*569b7f92Snonaka uint32_t dir, altfn, redge, fedge, status;
447*569b7f92Snonaka
448*569b7f92Snonaka // pin function
449*569b7f92Snonaka dir = VOLATILE_REF(gpio + GPIO_OFFSET(i, 0x0c));
450*569b7f92Snonaka dir = (dir >> (i % 32)) & 1;
451*569b7f92Snonaka altfn = VOLATILE_REF(gpio + 0x54 + ((i / 16) * 4));
452*569b7f92Snonaka altfn = (altfn >> ((i % 16) * 2)) & 3;
453*569b7f92Snonaka if (altfn == 0) {
454*569b7f92Snonaka if (dir == 0) {
455*569b7f92Snonaka fn_name = TEXT("GPIO_IN");
456*569b7f92Snonaka } else {
457*569b7f92Snonaka fn_name = TEXT("GPIO_OUT");
458*569b7f92Snonaka }
459*569b7f92Snonaka DPRINTF((TEXT("%d,%s,%s,"), i, fn_name,
460*569b7f92Snonaka pxa270_gpioName[i][0]));
461*569b7f92Snonaka } else {
462*569b7f92Snonaka if (dir == 0) {
463*569b7f92Snonaka fn_name = TEXT("IN");
464*569b7f92Snonaka pin_name = pxa270_gpioName[i][altfn];
465*569b7f92Snonaka } else {
466*569b7f92Snonaka fn_name = TEXT("OUT");
467*569b7f92Snonaka pin_name = pxa270_gpioName[i][altfn+3];
468*569b7f92Snonaka }
469*569b7f92Snonaka DPRINTF((TEXT("%d,ALT_FN_%d_%s,%s,"), i, altfn,
470*569b7f92Snonaka fn_name, pin_name));
471*569b7f92Snonaka }
472*569b7f92Snonaka
473*569b7f92Snonaka // edge detect
474*569b7f92Snonaka redge = VOLATILE_REF(gpio + GPIO_OFFSET(i, 0x30));
475*569b7f92Snonaka redge = (redge >> (i % 32)) & 1;
476*569b7f92Snonaka fedge = VOLATILE_REF(gpio + GPIO_OFFSET(i, 0x3c));
477*569b7f92Snonaka fedge = (fedge >> (i % 32)) & 1;
478*569b7f92Snonaka DPRINTF((TEXT("%s,%s,"),
479*569b7f92Snonaka redge ? TEXT("enable") : TEXT("disable"),
480*569b7f92Snonaka fedge ? TEXT("enable") : TEXT("disable")));
481*569b7f92Snonaka
482*569b7f92Snonaka // status
483*569b7f92Snonaka status = VOLATILE_REF(gpio + GPIO_OFFSET(i, 0x00));
484*569b7f92Snonaka status = (status >> (i % 32)) & 1;
485*569b7f92Snonaka DPRINTF((TEXT("%s"), status ? TEXT("high") : TEXT("low")));
486*569b7f92Snonaka
487*569b7f92Snonaka DPRINTF((TEXT("\n")));
488*569b7f92Snonaka }
489*569b7f92Snonaka _mem->unmapPhysicalPage(gpio);
490*569b7f92Snonaka
491*569b7f92Snonaka // LCDC
492*569b7f92Snonaka DPRINTF((TEXT("Dump LCDC registers.\n")));
493*569b7f92Snonaka vaddr_t lcdc =
494*569b7f92Snonaka _mem->mapPhysicalPage(0x44000000, 0x1000, PAGE_READWRITE);
495*569b7f92Snonaka reg = VOLATILE_REF(lcdc + 0x00);
496*569b7f92Snonaka DPRINTF((TEXT("LCCR0: 0x%08x\n"), reg));
497*569b7f92Snonaka DPRINTF((TEXT("-> ")));
498*569b7f92Snonaka first = true;
499*569b7f92Snonaka if (reg & (1U << 26)) {
500*569b7f92Snonaka DPRINTF((TEXT("%sLDDALT"), first ? TEXT("") : TEXT("/")));
501*569b7f92Snonaka first = false;
502*569b7f92Snonaka }
503*569b7f92Snonaka if (reg & (1U << 25)) {
504*569b7f92Snonaka DPRINTF((TEXT("%sOUC"), first ? TEXT("") : TEXT("/")));
505*569b7f92Snonaka first = false;
506*569b7f92Snonaka }
507*569b7f92Snonaka if (reg & (1U << 22)) {
508*569b7f92Snonaka DPRINTF((TEXT("%sLCDT"), first ? TEXT("") : TEXT("/")));
509*569b7f92Snonaka first = false;
510*569b7f92Snonaka }
511*569b7f92Snonaka if (reg & (1U << 9)) {
512*569b7f92Snonaka DPRINTF((TEXT("%sDPD"), first ? TEXT("") : TEXT("/")));
513*569b7f92Snonaka first = false;
514*569b7f92Snonaka }
515*569b7f92Snonaka if (reg & (1U << 7)) {
516*569b7f92Snonaka DPRINTF((TEXT("%sPAS"), first ? TEXT("") : TEXT("/")));
517*569b7f92Snonaka first = false;
518*569b7f92Snonaka }
519*569b7f92Snonaka if (reg & (1U << 2)) {
520*569b7f92Snonaka DPRINTF((TEXT("%sSDS"), first ? TEXT("") : TEXT("/")));
521*569b7f92Snonaka first = false;
522*569b7f92Snonaka }
523*569b7f92Snonaka if (reg & (1U << 1)) {
524*569b7f92Snonaka DPRINTF((TEXT("%sCMS"), first ? TEXT("") : TEXT("/")));
525*569b7f92Snonaka first = false;
526*569b7f92Snonaka }
527*569b7f92Snonaka if (reg & (1U << 0)) {
528*569b7f92Snonaka DPRINTF((TEXT("%sENB"), first ? TEXT("") : TEXT("/")));
529*569b7f92Snonaka first = false;
530*569b7f92Snonaka }
531*569b7f92Snonaka DPRINTF((TEXT("\n")));
532*569b7f92Snonaka DPRINTF((TEXT("-> PDD = 0x%02x\n"), (reg >> 12) & 0xff));
533*569b7f92Snonaka reg = VOLATILE_REF(lcdc + 0x04);
534*569b7f92Snonaka DPRINTF((TEXT("LCCR1: 0x%08x\n"), reg));
535*569b7f92Snonaka DPRINTF((TEXT("-> BLW = 0x%02x, ELW = 0x%02x, HSW = 0x%02x, PPL = 0x%03x\n"),
536*569b7f92Snonaka (reg >> 24) & 0xff, (reg >> 16) & 0xff, (reg >> 10) & 0x3f,
537*569b7f92Snonaka reg & 0x3ff));
538*569b7f92Snonaka reg = VOLATILE_REF(lcdc + 0x08);
539*569b7f92Snonaka DPRINTF((TEXT("LCCR2: 0x%08x\n"), reg));
540*569b7f92Snonaka DPRINTF((TEXT("-> BFW = 0x%02x, EFW = 0x%02x, VSW = 0x%02x, LPP = 0x%03x\n"),
541*569b7f92Snonaka (reg >> 24) & 0xff, (reg >> 16) & 0xff, (reg >> 10) & 0x3f,
542*569b7f92Snonaka reg & 0x3ff));
543*569b7f92Snonaka reg = VOLATILE_REF(lcdc + 0x0c);
544*569b7f92Snonaka DPRINTF((TEXT("LCCR3: 0x%08x\n"), reg));
545*569b7f92Snonaka DPRINTF((TEXT("-> ")));
546*569b7f92Snonaka first = true;
547*569b7f92Snonaka if (reg & (1U << 27)) {
548*569b7f92Snonaka DPRINTF((TEXT("%sDPC"), first ? TEXT("") : TEXT("/")));
549*569b7f92Snonaka first = false;
550*569b7f92Snonaka }
551*569b7f92Snonaka if (reg & (1U << 23)) {
552*569b7f92Snonaka DPRINTF((TEXT("%sOEP"), first ? TEXT("") : TEXT("/")));
553*569b7f92Snonaka first = false;
554*569b7f92Snonaka }
555*569b7f92Snonaka if (reg & (1U << 22)) {
556*569b7f92Snonaka DPRINTF((TEXT("%sPCP"), first ? TEXT("") : TEXT("/")));
557*569b7f92Snonaka first = false;
558*569b7f92Snonaka }
559*569b7f92Snonaka if (reg & (1U << 21)) {
560*569b7f92Snonaka DPRINTF((TEXT("%sHSP"), first ? TEXT("") : TEXT("/")));
561*569b7f92Snonaka first = false;
562*569b7f92Snonaka }
563*569b7f92Snonaka if (reg & (1U << 20)) {
564*569b7f92Snonaka DPRINTF((TEXT("%sVSP"), first ? TEXT("") : TEXT("/")));
565*569b7f92Snonaka first = false;
566*569b7f92Snonaka }
567*569b7f92Snonaka if (reg & (1U << 19)) {
568*569b7f92Snonaka DPRINTF((TEXT("%sVSP"), first ? TEXT("") : TEXT("/")));
569*569b7f92Snonaka first = false;
570*569b7f92Snonaka }
571*569b7f92Snonaka DPRINTF((TEXT("\n")));
572*569b7f92Snonaka DPRINTF((TEXT("-> PDFOR = %d\n"), (reg >> 30) & 3));
573*569b7f92Snonaka DPRINTF((TEXT("-> BPP = 0x%02x\n"), ((reg >> 29) & 1 << 3) | ((reg >> 24) & 7)));
574*569b7f92Snonaka DPRINTF((TEXT("-> API = 0x%x\n"), (reg >> 16) & 0xf));
575*569b7f92Snonaka DPRINTF((TEXT("-> ACB = 0x%02x\n"), (reg >> 8) & 0xff));
576*569b7f92Snonaka DPRINTF((TEXT("-> PCD = 0x%02x\n"), reg & 0xff));
577*569b7f92Snonaka reg = VOLATILE_REF(lcdc + 0x10);
578*569b7f92Snonaka DPRINTF((TEXT("LCCR4: 0x%08x\n"), reg));
579*569b7f92Snonaka DPRINTF((TEXT("-> PCDDIV = %d\n"), (reg >> 31) & 1));
580*569b7f92Snonaka DPRINTF((TEXT("-> PAL_FOR = %d\n"), (reg >> 15) & 3));
581*569b7f92Snonaka DPRINTF((TEXT("-> K3 = 0x%x, K2 = 0x%x, K1 = 0x%x\n"),
582*569b7f92Snonaka (reg >> 6) & 7, (reg >> 3) & 7, reg & 7));
583*569b7f92Snonaka reg = VOLATILE_REF(lcdc + 0x14);
584*569b7f92Snonaka DPRINTF((TEXT("LCCR5: 0x%08x\n"), reg));
585*569b7f92Snonaka reg = VOLATILE_REF(lcdc + 0x54);
586*569b7f92Snonaka DPRINTF((TEXT("LCDBSCNTR: 0x%08x\n"), reg));
587*569b7f92Snonaka _mem->unmapPhysicalPage(lcdc);
588*569b7f92Snonaka #endif
5893af75740Srafal }
590