From 9407ae838e7696cd5f55c7a22b7cabb8d403fc17 Mon Sep 17 00:00:00 2001 From: Maurus Cuelenaere Date: Wed, 17 Sep 2008 21:44:47 +0000 Subject: Onda VX747: * Button driver rework * Backlight driver rework * LCD driver rework git-svn-id: svn://svn.rockbox.org/rockbox/trunk@18543 a1c6a512-1295-4272-9138-f99709370657 --- firmware/export/config-ondavx747.h | 8 +- firmware/target/mips/ingenic_jz47xx/lcd-jz4740.c | 10 +- .../onda_vx747/backlight-onda_vx747.c | 86 +++++++------ .../ingenic_jz47xx/onda_vx747/lcd-onda_vx747.c | 2 - .../ingenic_jz47xx/onda_vx747/sadc-onda_vx747.c | 140 ++++++++++----------- firmware/target/mips/ingenic_jz47xx/usb-jz4740.c | 33 +++-- 6 files changed, 151 insertions(+), 128 deletions(-) (limited to 'firmware') diff --git a/firmware/export/config-ondavx747.h b/firmware/export/config-ondavx747.h index e015a53374..9a7f53568a 100644 --- a/firmware/export/config-ondavx747.h +++ b/firmware/export/config-ondavx747.h @@ -83,10 +83,10 @@ #define HAVE_BACKLIGHT_BRIGHTNESS /* Main LCD backlight brightness range and defaults */ -#define MIN_BRIGHTNESS_SETTING 0 /* TODO */ -#define MAX_BRIGHTNESS_SETTING 127 -#define DEFAULT_BRIGHTNESS_SETTING 85 -#define DEFAULT_DIMNESS_SETTING 22 +#define MIN_BRIGHTNESS_SETTING 100 +#define MAX_BRIGHTNESS_SETTING 300 +#define DEFAULT_BRIGHTNESS_SETTING 300 /* "full brightness" */ +#define DEFAULT_DIMNESS_SETTING 100 /* "most dim" */ /* Define this if you have a software controlled poweroff */ //#define HAVE_SW_POWEROFF diff --git a/firmware/target/mips/ingenic_jz47xx/lcd-jz4740.c b/firmware/target/mips/ingenic_jz47xx/lcd-jz4740.c index 90ecfc6a3a..af5a132e30 100644 --- a/firmware/target/mips/ingenic_jz47xx/lcd-jz4740.c +++ b/firmware/target/mips/ingenic_jz47xx/lcd-jz4740.c @@ -24,6 +24,7 @@ #include "lcd.h" #include "lcd-target.h" #include "system-target.h" +#include "kernel.h" static volatile bool _lcd_on = false; static volatile bool lcd_poweroff = false; @@ -70,11 +71,18 @@ void lcd_update_rect(int x, int y, int width, int height) __dcache_writeback_all(); /* Size of framebuffer is way bigger than cache size */ + while(REG_SLCD_STATE & SLCD_STATE_BUSY); + REG_SLCD_CTRL = SLCD_CTRL_DMA_EN; + REG_DMAC_DMACR = DMAC_DMACR_DMAE; while( !(REG_DMAC_DCCSR(0) & DMAC_DCCSR_TT) ) - asm("nop"); + yield(); + + REG_DMAC_DMACR = 0; + while(REG_SLCD_STATE & SLCD_STATE_BUSY); + REG_SLCD_CTRL = 0; } /* Update the display. diff --git a/firmware/target/mips/ingenic_jz47xx/onda_vx747/backlight-onda_vx747.c b/firmware/target/mips/ingenic_jz47xx/onda_vx747/backlight-onda_vx747.c index 9deab7712a..598fa1a0eb 100644 --- a/firmware/target/mips/ingenic_jz47xx/onda_vx747/backlight-onda_vx747.c +++ b/firmware/target/mips/ingenic_jz47xx/onda_vx747/backlight-onda_vx747.c @@ -23,58 +23,74 @@ #include "jz4740.h" #include "backlight-target.h" -#define GPIO_PWM 123 -#define PWM_CHN 7 -#define PWM_FULL 101 +#define GPIO_PWM (32*3)+31 +#define PWM_CHN 7 +#define __gpio_as_PWM_CHN __gpio_as_pwm7 -static void set_backlight(int unk, int val) +static void set_backlight(int val) { - if(val == 0) - __gpio_as_pwm7(); - else - { - REG_TCU_TCSR(7) |= 2; - REG_TCU_TCSR(7) &= ~0x100; - int tmp; - tmp = (unk/2 + __cpm_get_rtcclk()) / unk; - if(tmp > 0xFFFF) - tmp = 0xFFFF; - - __tcu_set_half_data(7, (tmp * unk * 1374389535) >> 5); - __tcu_set_full_data(7, tmp); - - REG_TCU_TSCR = (1 << 7); - REG_TCU_TESR = (1 << 7); - - __tcu_enable_pwm_output(7); - } - __tcu_set_count(7, 0); + /* Taken from the OF */ + int tmp; + tmp = (val/2 + __cpm_get_rtcclk()) / val; + if(tmp > 0xFFFF) + tmp = 0xFFFF; + + __tcu_set_half_data(PWM_CHN, (tmp * val * 1374389535) >> 5); + __tcu_set_full_data(PWM_CHN, tmp); } -bool _backlight_init(void) +static void set_backlight_on(void) { - __gpio_as_pwm7(); - - __tcu_stop_counter(7); - __tcu_disable_pwm_output(7); - - set_backlight(300, 7); + __tcu_start_timer_clock(PWM_CHN); + set_backlight(MAX_BRIGHTNESS_SETTING); + + __tcu_set_count(PWM_CHN, 0); + __tcu_start_counter(PWM_CHN); + + __tcu_enable_pwm_output(PWM_CHN); +} + +static void set_backlight_off(void) +{ + __tcu_stop_counter(PWM_CHN); + __tcu_disable_pwm_output(PWM_CHN); + __tcu_stop_timer_clock(PWM_CHN); +} + +bool _backlight_init(void) +{ + __gpio_as_PWM_CHN(); + __tcu_start_timer_clock(PWM_CHN); + + __tcu_stop_counter(PWM_CHN); + __tcu_disable_pwm_output(PWM_CHN); + + __tcu_init_pwm_output_low(PWM_CHN); + __tcu_select_rtcclk(PWM_CHN); + __tcu_select_clk_div1(PWM_CHN); + + __tcu_mask_half_match_irq(PWM_CHN); + __tcu_mask_full_match_irq(PWM_CHN); + + set_backlight_on(); + return true; } + void _backlight_on(void) { - set_backlight(300, 7); + set_backlight_on(); } + void _backlight_off(void) { - set_backlight(300, 0); + set_backlight_off(); } #ifdef HAVE_BACKLIGHT_BRIGHTNESS void _backlight_set_brightness(int brightness) { - (void)brightness; - return; + set_backlight(brightness); } #endif diff --git a/firmware/target/mips/ingenic_jz47xx/onda_vx747/lcd-onda_vx747.c b/firmware/target/mips/ingenic_jz47xx/onda_vx747/lcd-onda_vx747.c index 3846987026..f7c6a137fc 100644 --- a/firmware/target/mips/ingenic_jz47xx/onda_vx747/lcd-onda_vx747.c +++ b/firmware/target/mips/ingenic_jz47xx/onda_vx747/lcd-onda_vx747.c @@ -194,8 +194,6 @@ static void _set_lcd_bus(void) REG_SLCD_CFG = (SLCD_CFG_BURST_8_WORD | SLCD_CFG_DWIDTH_16 | SLCD_CFG_CWIDTH_16BIT | SLCD_CFG_CS_ACTIVE_LOW | SLCD_CFG_RS_CMD_LOW | SLCD_CFG_CLK_ACTIVE_FALLING | SLCD_CFG_TYPE_PARALLEL); - - REG_SLCD_CTRL = SLCD_CTRL_DMA_EN; } static void _set_lcd_clock(void) diff --git a/firmware/target/mips/ingenic_jz47xx/onda_vx747/sadc-onda_vx747.c b/firmware/target/mips/ingenic_jz47xx/onda_vx747/sadc-onda_vx747.c index dd169c3a44..0f1cfca937 100644 --- a/firmware/target/mips/ingenic_jz47xx/onda_vx747/sadc-onda_vx747.c +++ b/firmware/target/mips/ingenic_jz47xx/onda_vx747/sadc-onda_vx747.c @@ -22,21 +22,22 @@ #include "config.h" #include "system.h" #include "jz4740.h" +#include "button.h" #include "button-target.h" -#define BTN_VOL_DOWN (1 << 27) -#define BTN_VOL_UP (1 << 0) -#define BTN_MENU (1 << 1) #define BTN_OFF (1 << 29) +#define BTN_VOL_DOWN (1 << 27) #define BTN_HOLD (1 << 16) -#define BTN_MASK (BTN_VOL_DOWN | BTN_VOL_UP \ - | BTN_MENU | BTN_OFF ) +#define BTN_MENU (1 << 1) +#define BTN_VOL_UP (1 << 0) +#define BTN_MASK (BTN_OFF | BTN_VOL_DOWN | \ + BTN_MENU | BTN_VOL_UP) -#define TS_AD_COUNT 5 -#define M_SADC_CFG_SNUM ((TS_AD_COUNT - 1) << SADC_CFG_SNUM_BIT) +#define TS_AD_COUNT 5 +#define M_SADC_CFG_SNUM ((TS_AD_COUNT - 1) << SADC_CFG_SNUM_BIT) -#define SADC_CFG_INIT ( \ +#define SADC_CFG_INIT ( \ (2 << SADC_CFG_CLKOUT_NUM_BIT) | \ SADC_CFG_XYZ1Z2 | \ M_SADC_CFG_SNUM | \ @@ -45,20 +46,23 @@ SADC_CFG_CMD_INT_PEN \ ) -static bool pendown_flag = false; static short x_pos = -1, y_pos = -1, datacount = 0; -static short stable_x_pos = -1, stable_y_pos = -1; +static bool pen_down = false; +static int cur_touch = 0; -bool button_hold(void) +static enum touchscreen_mode current_mode = TOUCHSCREEN_POINT; +static int touchscreen_buttons[3][3] = { - return (~REG_GPIO_PXPIN(3) & BTN_HOLD ? 1 : 0); -} + {BUTTON_TOPLEFT, BUTTON_TOPMIDDLE, BUTTON_TOPRIGHT}, + {BUTTON_MIDLEFT, BUTTON_CENTER, BUTTON_MIDRIGHT}, + {BUTTON_BOTTOMLEFT, BUTTON_BOTTOMMIDDLE, BUTTON_BOTTOMRIGHT} +}; void button_init_device(void) { REG_SADC_ENA = 0; REG_SADC_STATE &= (~REG_SADC_STATE); - REG_SADC_CTRL = 0x1f; + REG_SADC_CTRL = 0x1F; __cpm_start_sadc(); REG_SADC_CFG = SADC_CFG_INIT; @@ -71,15 +75,15 @@ void button_init_device(void) REG_SADC_CTRL &= (~(SADC_CTRL_PENDM | SADC_CTRL_PENUM | SADC_CTRL_TSRDYM)); REG_SADC_ENA = SADC_ENA_TSEN; //| SADC_ENA_PBATEN | SADC_ENA_SADCINEN); - __gpio_port_as_input(3, 29); - __gpio_port_as_input(3, 27); - __gpio_port_as_input(3, 16); - __gpio_port_as_input(3, 1); - __gpio_port_as_input(3, 0); + __gpio_as_input(32*3 + 29); + __gpio_as_input(32*3 + 27); + __gpio_as_input(32*3 + 16); + __gpio_as_input(32*3 + 1); + __gpio_as_input(32*3 + 0); } static int touch_to_pixels(short x, short y) -{ +{ /* X:300 -> 3800 Y:300->3900 */ x -= 300; y -= 300; @@ -102,68 +106,56 @@ static int touch_to_pixels(short x, short y) #endif } +bool button_hold(void) +{ + return ((~REG_GPIO_PXPIN(3)) & BTN_HOLD ? true : false); +} + int button_read_device(int *data) { - if(button_hold()) + int ret = 0, tmp; + + if((~REG_GPIO_PXPIN(3)) & BTN_HOLD) return 0; - - unsigned int key = ~(__gpio_get_port(3)); - int ret = 0; - - if(key & BTN_MASK) + + tmp = (~REG_GPIO_PXPIN(3)) & BTN_MASK; + + if(tmp & BTN_VOL_DOWN) + ret |= BUTTON_VOL_DOWN; + if(tmp & BTN_VOL_UP) + ret |= BUTTON_VOL_UP; + if(tmp & BTN_MENU) + ret |= BUTTON_MENU; + if(tmp & BTN_OFF) + ret |= BUTTON_POWER; + + if(current_mode == TOUCHSCREEN_BUTTON && cur_touch != 0) { - if(key & BTN_VOL_DOWN) - ret |= BUTTON_VOL_DOWN; - if(key & BTN_VOL_UP) - ret |= BUTTON_VOL_UP; - if(key & BTN_MENU) - ret |= BUTTON_MENU; - if(key & BTN_OFF) - ret |= BUTTON_POWER; + int px_x = cur_touch >> 16; + int px_y = cur_touch & 0xFFFF; + ret |= touchscreen_buttons[px_y/(LCD_HEIGHT/3)] + [px_x/(LCD_WIDTH/3)]; } - - if(data != NULL) + else if(pen_down) { - if(pendown_flag) - { - *data = touch_to_pixels(stable_x_pos, stable_y_pos); - ret |= BUTTON_TOUCH; - } - else - *data = 0; + ret |= BUTTON_TOUCH; + if(data != NULL) + *data = cur_touch; } return ret; } -/* -static enum touchpad_mode current_mode = TOUCHPAD_POINT; - -static bool touch_available = false; - -static int touchpad_buttons[3][3] = -{ - {BUTTON_TOPLEFT, BUTTON_TOPMIDDLE, BUTTON_TOPRIGHT}, - {BUTTON_MIDLEFT, BUTTON_CENTER, BUTTON_MIDRIGHT}, - {BUTTON_BOTTOMLEFT, BUTTON_BOTTOMMIDDLE, BUTTON_BOTTOMRIGHT} -}; - -void touchpad_set_mode(enum touchpad_mode mode) +void touchscreen_set_mode(enum touchscreen_mode mode) { current_mode = mode; } -enum touchpad_mode touchpad_get_mode(void) +enum touchscreen_mode touchscreen_get_mode(void) { return current_mode; } -void button_set_touch_available(void) -{ - touch_available = true; -} -*/ - /* Interrupt handler */ void SADC(void) { @@ -179,18 +171,17 @@ void SADC(void) /* Pen down IRQ */ REG_SADC_CTRL &= (~(SADC_CTRL_PENUM | SADC_CTRL_TSRDYM)); REG_SADC_CTRL |= (SADC_CTRL_PENDM); - pendown_flag = true; + pen_down = true; } if(state & SADC_CTRL_PENUM) { /* Pen up IRQ */ REG_SADC_CTRL &= (~SADC_CTRL_PENDM ); REG_SADC_CTRL |= SADC_CTRL_PENUM; - pendown_flag = false; + pen_down = false; x_pos = -1; y_pos = -1; - stable_x_pos = -1; - stable_y_pos = -1; + cur_touch = 0; } if(state & SADC_CTRL_TSRDYM) { @@ -200,15 +191,15 @@ void SADC(void) dat = REG_SADC_TSDAT; - xData = (dat >> 0) & 0xfff; - yData = (dat >> 16) & 0xfff; + xData = (dat >> 0) & 0xFFF; + yData = (dat >> 16) & 0xFFF; dat = REG_SADC_TSDAT; - tsz1Data = (dat >> 0) & 0xfff; - tsz2Data = (dat >> 16) & 0xfff; + tsz1Data = (dat >> 0) & 0xFFF; + tsz2Data = (dat >> 16) & 0xFFF; - if(!pendown_flag) - return ; + if( !pen_down ) + return; tsz1Data = tsz2Data - tsz1Data; @@ -231,8 +222,7 @@ void SADC(void) { if(x_pos != -1) { - stable_x_pos = x_pos; - stable_y_pos = y_pos; + cur_touch = touch_to_pixels(x_pos, y_pos); x_pos = -1; y_pos = -1; } diff --git a/firmware/target/mips/ingenic_jz47xx/usb-jz4740.c b/firmware/target/mips/ingenic_jz47xx/usb-jz4740.c index cf107397e3..2121d3e4b0 100644 --- a/firmware/target/mips/ingenic_jz47xx/usb-jz4740.c +++ b/firmware/target/mips/ingenic_jz47xx/usb-jz4740.c @@ -497,7 +497,7 @@ static inline u32 jz_readl(u32 address) #define TXFIFOEP0 USB_FIFO_EP0 -u32 Bulk_in_buf[BULK_IN_BUF_SIZE]; +u8 *Bulk_in_buf; u32 Bulk_out_buf[BULK_OUT_BUF_SIZE]; u32 Bulk_in_size,Bulk_in_finish,Bulk_out_size; u16 handshake_PKT[4]={0,0,0,0}; @@ -560,12 +560,14 @@ void HW_SendPKT(int ep, const u8 *buf, int size) Bulk_in_size - Bulk_in_finish); usb_setb(USB_REG_INCSR, USB_INCSR_INPKTRDY); Bulk_in_finish = Bulk_in_size; - } else + } + else { udcWriteFifo((u8 *)((u32)buf+Bulk_in_finish), fifosize[ep]); usb_setb(USB_REG_INCSR, USB_INCSR_INPKTRDY); Bulk_in_finish += fifosize[ep]; + Bulk_in_buf = (u8*)buf; } } else //EP0 @@ -645,7 +647,7 @@ static struct { (1 << 7) | 1,// endpoint 2 is IN endpoint 2, /* bulk */ 512, - 16 + 0 }, { sizeof(USB_EndPointDescriptor), @@ -653,7 +655,7 @@ static struct { (0 << 7) | 1,// endpoint 5 is OUT endpoint 2, /* bulk */ 512, /* OUT EP FIFO size */ - 16 + 0 } } }; @@ -822,21 +824,27 @@ void usbHandleStandDevReq(u8 *buf) } } -extern char printfbuf[256]; +unsigned char nandbuffer[4096]; void usbHandleVendorReq(u8 *buf) { - int ret_state, i; USB_DeviceRequest *dreq = (USB_DeviceRequest *)buf; switch (dreq->bRequest) { + case 0xB0: + memset(&nandbuffer, 0, 4096); + jz_nand_read(dreq->wValue, dreq->wIndex, &nandbuffer); + //printf("Read block %d page %d", dreq->wValue, dreq->wIndex); + udc_state = IDLE; + break; case 0xAB: - //for(i=0; i<256; i+=64) - HW_SendPKT(0, printfbuf, 64); - udc_state = IDLE; + HW_SendPKT(1, nandbuffer, 4096); + //printf("Send data"); + //udc_state = BULK_OUT; break; case 0x12: HW_SendPKT(0, "TEST", 4); + //printf("Send test"); udc_state = IDLE; break; } @@ -874,7 +882,7 @@ void EP0_Handler (void) byCSR0 = jz_readb(USB_REG_CSR0); /* Check for SentStall - if sendtall is set ,clear the sendstall bit*/ + if sendstall is set ,clear the sendstall bit*/ if (byCSR0 & USB_CSR0_SENTSTALL) { jz_writeb(USB_REG_CSR0, (byCSR0 & ~USB_CSR0_SENDSTALL)); @@ -942,7 +950,8 @@ void EPIN_Handler(u8 EP) Bulk_in_size - Bulk_in_finish); usb_setw(USB_REG_INCSR, USB_INCSR_INPKTRDY); Bulk_in_finish = Bulk_in_size; - } else + } + else { udcWriteFifo((u8 *)((u32)Bulk_in_buf+Bulk_in_finish), fifosize[EP]); @@ -1030,6 +1039,8 @@ void __udc_start(void) void usb_init_device(void) { + REG_USB_REG_POWER &= ~USB_POWER_SOFTCONN; + REG_USB_REG_POWER |= USB_POWER_SOFTCONN; __udc_start(); } -- cgit v1.2.3