# HG changeset patch # User Michael Spacefalcon # Date 1375316789 0 # Node ID 07b686248ab7fd67cfc43eb05cb48638897225a7 # Parent c9768f5fb329156de9f786b30fe28fee3305cc44 pirexplore: finally got the backlight to turn on diff -r c9768f5fb329 -r 07b686248ab7 target-utils/libcommon/Makefile --- a/target-utils/libcommon/Makefile Sun Jul 28 01:30:22 2013 +0000 +++ b/target-utils/libcommon/Makefile Thu Aug 01 00:26:29 2013 +0000 @@ -6,7 +6,7 @@ OBJS= cmdentry.o dispatch.o hexarg.o parseargs.o serio.o serflush.o uartsel.o\ cmd_baud_switch.o cmd_dieid.o cmd_jump.o cmd_r8.o cmd_r16.o cmd_r32.o \ - cmd_w8.o cmd_w16.o cmd_w32.o + cmd_w8.o cmd_w16.o cmd_w32.o osmodelay.o all: libcommon.a diff -r c9768f5fb329 -r 07b686248ab7 target-utils/libcommon/osmodelay.S --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/target-utils/libcommon/osmodelay.S Thu Aug 01 00:26:29 2013 +0000 @@ -0,0 +1,30 @@ +/* + * This assembly module provides a replica of OsmocomBB's bogo-millisecond + * delay_ms() function. It is literally a copy of what OsmocomBB's delay_ms() + * compiles to with their gcc version and their optimization settings, as seen + * by doing arm-elf-objdump on their lib/delay.o. + * + * This hack is intended for those cases where we have to copy OsmocomBB's + * black magic voodoo operations with no ability to understand what is actually + * needed, such as SPCA552E initialization on the Pirelli DP-L10. + */ + + .text + .code 32 + .globl osmo_delay_ms +osmo_delay_ms: + mov r3, #0 + sub sp, sp, #4 + str r3, [sp] + ldr r3, =1300 + mul r3, r0, r3 + b 2f +1: ldr r2, [sp] + ldr r2, [sp] + add r2, r2, #1 + str r2, [sp] +2: ldr r2, [sp] + cmp r2, r3 + bcc 1b + add sp, sp, #4 + bx lr diff -r c9768f5fb329 -r 07b686248ab7 target-utils/pirexplore/cmdtab.c --- a/target-utils/pirexplore/cmdtab.c Sun Jul 28 01:30:22 2013 +0000 +++ b/target-utils/pirexplore/cmdtab.c Thu Aug 01 00:26:29 2013 +0000 @@ -9,6 +9,7 @@ extern void cmd_rtc(); extern void cmd_rtccomp(); extern void cmd_spca(); +extern void cmd_spcainit(); extern void cmd_w8(); extern void cmd_w16(); extern void cmd_w32(); @@ -23,6 +24,7 @@ {"rtc", cmd_rtc}, {"rtccomp", cmd_rtccomp}, {"spca", cmd_spca}, + {"spcainit", cmd_spcainit}, {"w8", cmd_w8}, {"w16", cmd_w16}, {"w32", cmd_w32}, diff -r c9768f5fb329 -r 07b686248ab7 target-utils/pirexplore/lcd.c --- a/target-utils/pirexplore/lcd.c Sun Jul 28 01:30:22 2013 +0000 +++ b/target-utils/pirexplore/lcd.c Thu Aug 01 00:26:29 2013 +0000 @@ -1,6 +1,17 @@ #include #include "types.h" +#define GPIO_OUT_REG (*(volatile u16 *)0xFFFE4802) +#define nCS4_ADDR0 (*(volatile u16 *)0x02800000) +#define nCS4_ADDR2 (*(volatile u16 *)0x02800002) + +fb_spca_write(addr, data) +{ + GPIO_OUT_REG &= 0xFF7F; + nCS4_ADDR0 = addr; + nCS4_ADDR2 = data; +} + void cmd_spca(argbulk) char *argbulk; @@ -18,6 +29,31 @@ printf("ERROR: arg2 must be a valid 16-bit hex value\n"); return; } - *(volatile u16 *)0x02800000 = addr; - *(volatile u16 *)0x02800002 = data; + fb_spca_write(addr, data); } + +void +cmd_spcainit() +{ + /* + * Apparently we have to give it a reset pulse, then immediately + * do the black magic register write sequence. + */ + GPIO_OUT_REG = 0x0000; + GPIO_OUT_REG = 0x0012; + /* non-understandable voodoo copied from OsmocomBB */ + fb_spca_write(0x7e, 0x00); /* internal register access */ + osmo_delay_ms(10); + fb_spca_write(0x7a, 0x00); /* keep CPU in reset state */ + osmo_delay_ms(10); + fb_spca_write(0x7f, 0x00); /* select main page */ + osmo_delay_ms(5); + fb_spca_write(0x72, 0x07); /* don't reshape timing, 16 bit mode */ + fb_spca_write(0x14, 0x03); + fb_spca_write(0x7f, 0x00); /* select main page */ + osmo_delay_ms(5); + fb_spca_write(0x06, 0xff); + fb_spca_write(0x7f, 0x09); + fb_spca_write(0x19, 0x08); /* backlight: 0x08 is on, 0x0c is off */ + fb_spca_write(0x23, 0x18); +} diff -r c9768f5fb329 -r 07b686248ab7 target-utils/pirexplore/main.c --- a/target-utils/pirexplore/main.c Sun Jul 28 01:30:22 2013 +0000 +++ b/target-utils/pirexplore/main.c Thu Aug 01 00:26:29 2013 +0000 @@ -25,11 +25,10 @@ * Other register settings replicating what OsmocomBB does * in board/pirelli_dpl10/init.c */ - *(volatile u16 *)0xfffef008 = 0x7090; + *(volatile u16 *)0xfffef008 = 0x7080; *(volatile u16 *)0xfffef00a = 0x021F; *(volatile u16 *)0xfffe4804 = 0xFF6D; *(volatile u16 *)0xfffe4802 = 0x0000; - *(volatile u16 *)0xfffe4802 = 0x0012; /* nCS4 setup for SPCA552E */ *(volatile u16 *)0xfffffb0a = 0x00A7; for (;;) {