summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaurus Cuelenaere <mcuelenaere@gmail.com>2008-09-17 21:44:47 +0000
committerMaurus Cuelenaere <mcuelenaere@gmail.com>2008-09-17 21:44:47 +0000
commit9407ae838e7696cd5f55c7a22b7cabb8d403fc17 (patch)
treee14f5648f63790ce170c5fa6024da0c8a55ce1e1
parent3655a32a3e8e49bc0e70f28eaa6d60f17fbdb412 (diff)
downloadrockbox-9407ae838e7696cd5f55c7a22b7cabb8d403fc17.tar.gz
rockbox-9407ae838e7696cd5f55c7a22b7cabb8d403fc17.zip
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
-rw-r--r--bootloader/ondavx747.c60
-rw-r--r--firmware/export/config-ondavx747.h8
-rw-r--r--firmware/target/mips/ingenic_jz47xx/lcd-jz4740.c10
-rw-r--r--firmware/target/mips/ingenic_jz47xx/onda_vx747/backlight-onda_vx747.c86
-rw-r--r--firmware/target/mips/ingenic_jz47xx/onda_vx747/lcd-onda_vx747.c2
-rw-r--r--firmware/target/mips/ingenic_jz47xx/onda_vx747/sadc-onda_vx747.c140
-rw-r--r--firmware/target/mips/ingenic_jz47xx/usb-jz4740.c33
7 files changed, 161 insertions, 178 deletions
diff --git a/bootloader/ondavx747.c b/bootloader/ondavx747.c
index 1f6e3cbeac..d8fefd4f48 100644
--- a/bootloader/ondavx747.c
+++ b/bootloader/ondavx747.c
@@ -42,48 +42,6 @@ static void audiotest(void)
42 __aic_enable_loopback(); 42 __aic_enable_loopback();
43} 43}
44 44
45/* CP0 hazard avoidance. */
46#define BARRIER __asm__ __volatile__(".set noreorder\n\t" \
47 "nop; nop; nop; nop; nop; nop;\n\t" \
48 ".set reorder\n\t")
49static void show_tlb(void)
50{
51#define ASID_MASK 0xFF
52
53 unsigned int old_ctx;
54 unsigned int entry;
55 unsigned int entrylo0, entrylo1, entryhi;
56 unsigned int pagemask;
57
58 cli();
59
60 /* Save old context */
61 old_ctx = (read_c0_entryhi() & 0xff);
62
63 printf("TLB content:");
64 for(entry = 0; entry < 32; entry++)
65 {
66 write_c0_index(entry);
67 BARRIER;
68 tlb_read();
69 BARRIER;
70 entryhi = read_c0_entryhi();
71 entrylo0 = read_c0_entrylo0();
72 entrylo1 = read_c0_entrylo1();
73 pagemask = read_c0_pagemask();
74 printf("%02d: ASID=%02d%s VA=0x%08x", entry, entryhi & ASID_MASK, (entrylo0 & entrylo1 & 1) ? "(G)" : " ", entryhi & ~ASID_MASK);
75 printf("PA0=0x%08x C0=%x %s%s%s", (entrylo0>>6)<<12, (entrylo0>>3) & 7, (entrylo0 & 4) ? "Dirty " : "", (entrylo0 & 2) ? "Valid " : "Invalid ", (entrylo0 & 1) ? "Global" : "");
76 printf("PA1=0x%08x C1=%x %s%s%s", (entrylo1>>6)<<12, (entrylo1>>3) & 7, (entrylo1 & 4) ? "Dirty " : "", (entrylo1 & 2) ? "Valid " : "Invalid ", (entrylo1 & 1) ? "Global" : "");
77
78 printf("pagemask=0x%08x entryhi=0x%08x", pagemask, entryhi);
79 printf("entrylo0=0x%08x entrylo1=0x%08x", entrylo0, entrylo1);
80 }
81 BARRIER;
82 write_c0_entryhi(old_ctx);
83
84 sti();
85}
86
87int main(void) 45int main(void)
88{ 46{
89 kernel_init(); 47 kernel_init();
@@ -135,12 +93,15 @@ int main(void)
135 { 93 {
136 memset(testdata, 0, 4096); 94 memset(testdata, 0, 4096);
137 reset_screen(); 95 reset_screen();
138 jz_nand_read(2, j, &testdata); 96 jz_nand_read(0, j, &testdata);
139 printf("Page %d", j); 97 printf("Page %d", j);
140 int i; 98 int i;
141 for(i=0; i<256; i+=8) 99 for(i=0; i<768; i+=16)
142 { 100 {
143 snprintf(msg, 30, "%02c%02c%02c%02c%02c%02c%02c%02c", testdata[i], testdata[i+1], testdata[i+2], testdata[i+3], testdata[i+4], testdata[i+5], testdata[i+6], testdata[i+7]); 101 snprintf(msg, 30, "%02x%02x%02x%02x%02x%02x%02x%02x %02x%02x%02x%02x%02x%02x%02x%02x",
102 testdata[i], testdata[i+1], testdata[i+2], testdata[i+3], testdata[i+4], testdata[i+5], testdata[i+6], testdata[i+7],
103 testdata[i+8], testdata[i+9], testdata[i+10], testdata[i+11], testdata[i+12], testdata[i+13], testdata[i+14], testdata[i+15]
104 );
144 printf(msg); 105 printf(msg);
145 } 106 }
146 while(!((btn = button_read_device(&touch)) & (BUTTON_VOL_UP|BUTTON_VOL_DOWN))); 107 while(!((btn = button_read_device(&touch)) & (BUTTON_VOL_UP|BUTTON_VOL_DOWN)));
@@ -155,9 +116,13 @@ int main(void)
155 while(1) 116 while(1)
156 { 117 {
157#ifdef ONDA_VX747 118#ifdef ONDA_VX747
119#if 1
158 btn = button_get(false); 120 btn = button_get(false);
159 touch = button_get_data(); 121 touch = button_get_data();
160#else 122#else
123 btn = button_read_device(&touch);
124#endif
125#else
161 btn = button_read_device(); 126 btn = button_read_device();
162#endif 127#endif
163#define KNOP(x,y) lcd_set_foreground(LCD_BLACK); \ 128#define KNOP(x,y) lcd_set_foreground(LCD_BLACK); \
@@ -174,11 +139,6 @@ int main(void)
174 printf("BUTTON_HOLD"); 139 printf("BUTTON_HOLD");
175 asm("break 0x7"); 140 asm("break 0x7");
176 } 141 }
177 if(btn & BUTTON_VOL_DOWN)
178 {
179 reset_screen();
180 show_tlb();
181 }
182 if(btn & BUTTON_POWER) 142 if(btn & BUTTON_POWER)
183 { 143 {
184 power_off(); 144 power_off();
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 @@
83#define HAVE_BACKLIGHT_BRIGHTNESS 83#define HAVE_BACKLIGHT_BRIGHTNESS
84 84
85/* Main LCD backlight brightness range and defaults */ 85/* Main LCD backlight brightness range and defaults */
86#define MIN_BRIGHTNESS_SETTING 0 /* TODO */ 86#define MIN_BRIGHTNESS_SETTING 100
87#define MAX_BRIGHTNESS_SETTING 127 87#define MAX_BRIGHTNESS_SETTING 300
88#define DEFAULT_BRIGHTNESS_SETTING 85 88#define DEFAULT_BRIGHTNESS_SETTING 300 /* "full brightness" */
89#define DEFAULT_DIMNESS_SETTING 22 89#define DEFAULT_DIMNESS_SETTING 100 /* "most dim" */
90 90
91/* Define this if you have a software controlled poweroff */ 91/* Define this if you have a software controlled poweroff */
92//#define HAVE_SW_POWEROFF 92//#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 @@
24#include "lcd.h" 24#include "lcd.h"
25#include "lcd-target.h" 25#include "lcd-target.h"
26#include "system-target.h" 26#include "system-target.h"
27#include "kernel.h"
27 28
28static volatile bool _lcd_on = false; 29static volatile bool _lcd_on = false;
29static volatile bool lcd_poweroff = false; 30static volatile bool lcd_poweroff = false;
@@ -70,11 +71,18 @@ void lcd_update_rect(int x, int y, int width, int height)
70 71
71 __dcache_writeback_all(); /* Size of framebuffer is way bigger than cache size */ 72 __dcache_writeback_all(); /* Size of framebuffer is way bigger than cache size */
72 73
74 while(REG_SLCD_STATE & SLCD_STATE_BUSY);
75 REG_SLCD_CTRL = SLCD_CTRL_DMA_EN;
76
73 REG_DMAC_DMACR = DMAC_DMACR_DMAE; 77 REG_DMAC_DMACR = DMAC_DMACR_DMAE;
74 78
75 while( !(REG_DMAC_DCCSR(0) & DMAC_DCCSR_TT) ) 79 while( !(REG_DMAC_DCCSR(0) & DMAC_DCCSR_TT) )
76 asm("nop"); 80 yield();
81
82 REG_DMAC_DMACR = 0;
77 83
84 while(REG_SLCD_STATE & SLCD_STATE_BUSY);
85 REG_SLCD_CTRL = 0;
78} 86}
79 87
80/* Update the display. 88/* 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 @@
23#include "jz4740.h" 23#include "jz4740.h"
24#include "backlight-target.h" 24#include "backlight-target.h"
25 25
26#define GPIO_PWM 123 26#define GPIO_PWM (32*3)+31
27#define PWM_CHN 7 27#define PWM_CHN 7
28#define PWM_FULL 101 28#define __gpio_as_PWM_CHN __gpio_as_pwm7
29 29
30static void set_backlight(int unk, int val) 30static void set_backlight(int val)
31{ 31{
32 if(val == 0) 32 /* Taken from the OF */
33 __gpio_as_pwm7(); 33 int tmp;
34 else 34 tmp = (val/2 + __cpm_get_rtcclk()) / val;
35 { 35 if(tmp > 0xFFFF)
36 REG_TCU_TCSR(7) |= 2; 36 tmp = 0xFFFF;
37 REG_TCU_TCSR(7) &= ~0x100; 37
38 int tmp; 38 __tcu_set_half_data(PWM_CHN, (tmp * val * 1374389535) >> 5);
39 tmp = (unk/2 + __cpm_get_rtcclk()) / unk; 39 __tcu_set_full_data(PWM_CHN, tmp);
40 if(tmp > 0xFFFF)
41 tmp = 0xFFFF;
42
43 __tcu_set_half_data(7, (tmp * unk * 1374389535) >> 5);
44 __tcu_set_full_data(7, tmp);
45
46 REG_TCU_TSCR = (1 << 7);
47 REG_TCU_TESR = (1 << 7);
48
49 __tcu_enable_pwm_output(7);
50 }
51 __tcu_set_count(7, 0);
52} 40}
53 41
54bool _backlight_init(void) 42static void set_backlight_on(void)
55{ 43{
56 __gpio_as_pwm7(); 44 __tcu_start_timer_clock(PWM_CHN);
57
58 __tcu_stop_counter(7);
59 __tcu_disable_pwm_output(7);
60
61 set_backlight(300, 7);
62 45
46 set_backlight(MAX_BRIGHTNESS_SETTING);
47
48 __tcu_set_count(PWM_CHN, 0);
49 __tcu_start_counter(PWM_CHN);
50
51 __tcu_enable_pwm_output(PWM_CHN);
52}
53
54static void set_backlight_off(void)
55{
56 __tcu_stop_counter(PWM_CHN);
57 __tcu_disable_pwm_output(PWM_CHN);
58 __tcu_stop_timer_clock(PWM_CHN);
59}
60
61bool _backlight_init(void)
62{
63 __gpio_as_PWM_CHN();
64 __tcu_start_timer_clock(PWM_CHN);
65
66 __tcu_stop_counter(PWM_CHN);
67 __tcu_disable_pwm_output(PWM_CHN);
68
69 __tcu_init_pwm_output_low(PWM_CHN);
70 __tcu_select_rtcclk(PWM_CHN);
71 __tcu_select_clk_div1(PWM_CHN);
72
73 __tcu_mask_half_match_irq(PWM_CHN);
74 __tcu_mask_full_match_irq(PWM_CHN);
75
76 set_backlight_on();
77
63 return true; 78 return true;
64} 79}
80
65void _backlight_on(void) 81void _backlight_on(void)
66{ 82{
67 set_backlight(300, 7); 83 set_backlight_on();
68} 84}
85
69void _backlight_off(void) 86void _backlight_off(void)
70{ 87{
71 set_backlight(300, 0); 88 set_backlight_off();
72} 89}
73 90
74#ifdef HAVE_BACKLIGHT_BRIGHTNESS 91#ifdef HAVE_BACKLIGHT_BRIGHTNESS
75void _backlight_set_brightness(int brightness) 92void _backlight_set_brightness(int brightness)
76{ 93{
77 (void)brightness; 94 set_backlight(brightness);
78 return;
79} 95}
80#endif 96#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)
194 REG_SLCD_CFG = (SLCD_CFG_BURST_8_WORD | SLCD_CFG_DWIDTH_16 | SLCD_CFG_CWIDTH_16BIT 194 REG_SLCD_CFG = (SLCD_CFG_BURST_8_WORD | SLCD_CFG_DWIDTH_16 | SLCD_CFG_CWIDTH_16BIT
195 | SLCD_CFG_CS_ACTIVE_LOW | SLCD_CFG_RS_CMD_LOW | SLCD_CFG_CLK_ACTIVE_FALLING 195 | SLCD_CFG_CS_ACTIVE_LOW | SLCD_CFG_RS_CMD_LOW | SLCD_CFG_CLK_ACTIVE_FALLING
196 | SLCD_CFG_TYPE_PARALLEL); 196 | SLCD_CFG_TYPE_PARALLEL);
197
198 REG_SLCD_CTRL = SLCD_CTRL_DMA_EN;
199} 197}
200 198
201static void _set_lcd_clock(void) 199static 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 @@
22#include "config.h" 22#include "config.h"
23#include "system.h" 23#include "system.h"
24#include "jz4740.h" 24#include "jz4740.h"
25#include "button.h"
25#include "button-target.h" 26#include "button-target.h"
26 27
27#define BTN_VOL_DOWN (1 << 27)
28#define BTN_VOL_UP (1 << 0)
29#define BTN_MENU (1 << 1)
30#define BTN_OFF (1 << 29) 28#define BTN_OFF (1 << 29)
29#define BTN_VOL_DOWN (1 << 27)
31#define BTN_HOLD (1 << 16) 30#define BTN_HOLD (1 << 16)
32#define BTN_MASK (BTN_VOL_DOWN | BTN_VOL_UP \ 31#define BTN_MENU (1 << 1)
33 | BTN_MENU | BTN_OFF ) 32#define BTN_VOL_UP (1 << 0)
33#define BTN_MASK (BTN_OFF | BTN_VOL_DOWN | \
34 BTN_MENU | BTN_VOL_UP)
34 35
35 36
36#define TS_AD_COUNT 5 37#define TS_AD_COUNT 5
37#define M_SADC_CFG_SNUM ((TS_AD_COUNT - 1) << SADC_CFG_SNUM_BIT) 38#define M_SADC_CFG_SNUM ((TS_AD_COUNT - 1) << SADC_CFG_SNUM_BIT)
38 39
39#define SADC_CFG_INIT ( \ 40#define SADC_CFG_INIT ( \
40 (2 << SADC_CFG_CLKOUT_NUM_BIT) | \ 41 (2 << SADC_CFG_CLKOUT_NUM_BIT) | \
41 SADC_CFG_XYZ1Z2 | \ 42 SADC_CFG_XYZ1Z2 | \
42 M_SADC_CFG_SNUM | \ 43 M_SADC_CFG_SNUM | \
@@ -45,20 +46,23 @@
45 SADC_CFG_CMD_INT_PEN \ 46 SADC_CFG_CMD_INT_PEN \
46 ) 47 )
47 48
48static bool pendown_flag = false;
49static short x_pos = -1, y_pos = -1, datacount = 0; 49static short x_pos = -1, y_pos = -1, datacount = 0;
50static short stable_x_pos = -1, stable_y_pos = -1; 50static bool pen_down = false;
51static int cur_touch = 0;
51 52
52bool button_hold(void) 53static enum touchscreen_mode current_mode = TOUCHSCREEN_POINT;
54static int touchscreen_buttons[3][3] =
53{ 55{
54 return (~REG_GPIO_PXPIN(3) & BTN_HOLD ? 1 : 0); 56 {BUTTON_TOPLEFT, BUTTON_TOPMIDDLE, BUTTON_TOPRIGHT},
55} 57 {BUTTON_MIDLEFT, BUTTON_CENTER, BUTTON_MIDRIGHT},
58 {BUTTON_BOTTOMLEFT, BUTTON_BOTTOMMIDDLE, BUTTON_BOTTOMRIGHT}
59};
56 60
57void button_init_device(void) 61void button_init_device(void)
58{ 62{
59 REG_SADC_ENA = 0; 63 REG_SADC_ENA = 0;
60 REG_SADC_STATE &= (~REG_SADC_STATE); 64 REG_SADC_STATE &= (~REG_SADC_STATE);
61 REG_SADC_CTRL = 0x1f; 65 REG_SADC_CTRL = 0x1F;
62 66
63 __cpm_start_sadc(); 67 __cpm_start_sadc();
64 REG_SADC_CFG = SADC_CFG_INIT; 68 REG_SADC_CFG = SADC_CFG_INIT;
@@ -71,15 +75,15 @@ void button_init_device(void)
71 REG_SADC_CTRL &= (~(SADC_CTRL_PENDM | SADC_CTRL_PENUM | SADC_CTRL_TSRDYM)); 75 REG_SADC_CTRL &= (~(SADC_CTRL_PENDM | SADC_CTRL_PENUM | SADC_CTRL_TSRDYM));
72 REG_SADC_ENA = SADC_ENA_TSEN; //| SADC_ENA_PBATEN | SADC_ENA_SADCINEN); 76 REG_SADC_ENA = SADC_ENA_TSEN; //| SADC_ENA_PBATEN | SADC_ENA_SADCINEN);
73 77
74 __gpio_port_as_input(3, 29); 78 __gpio_as_input(32*3 + 29);
75 __gpio_port_as_input(3, 27); 79 __gpio_as_input(32*3 + 27);
76 __gpio_port_as_input(3, 16); 80 __gpio_as_input(32*3 + 16);
77 __gpio_port_as_input(3, 1); 81 __gpio_as_input(32*3 + 1);
78 __gpio_port_as_input(3, 0); 82 __gpio_as_input(32*3 + 0);
79} 83}
80 84
81static int touch_to_pixels(short x, short y) 85static int touch_to_pixels(short x, short y)
82{ 86{
83 /* X:300 -> 3800 Y:300->3900 */ 87 /* X:300 -> 3800 Y:300->3900 */
84 x -= 300; 88 x -= 300;
85 y -= 300; 89 y -= 300;
@@ -102,68 +106,56 @@ static int touch_to_pixels(short x, short y)
102#endif 106#endif
103} 107}
104 108
109bool button_hold(void)
110{
111 return ((~REG_GPIO_PXPIN(3)) & BTN_HOLD ? true : false);
112}
113
105int button_read_device(int *data) 114int button_read_device(int *data)
106{ 115{
107 if(button_hold()) 116 int ret = 0, tmp;
117
118 if((~REG_GPIO_PXPIN(3)) & BTN_HOLD)
108 return 0; 119 return 0;
109 120
110 unsigned int key = ~(__gpio_get_port(3)); 121 tmp = (~REG_GPIO_PXPIN(3)) & BTN_MASK;
111 int ret = 0; 122
112 123 if(tmp & BTN_VOL_DOWN)
113 if(key & BTN_MASK) 124 ret |= BUTTON_VOL_DOWN;
125 if(tmp & BTN_VOL_UP)
126 ret |= BUTTON_VOL_UP;
127 if(tmp & BTN_MENU)
128 ret |= BUTTON_MENU;
129 if(tmp & BTN_OFF)
130 ret |= BUTTON_POWER;
131
132 if(current_mode == TOUCHSCREEN_BUTTON && cur_touch != 0)
114 { 133 {
115 if(key & BTN_VOL_DOWN) 134 int px_x = cur_touch >> 16;
116 ret |= BUTTON_VOL_DOWN; 135 int px_y = cur_touch & 0xFFFF;
117 if(key & BTN_VOL_UP) 136 ret |= touchscreen_buttons[px_y/(LCD_HEIGHT/3)]
118 ret |= BUTTON_VOL_UP; 137 [px_x/(LCD_WIDTH/3)];
119 if(key & BTN_MENU)
120 ret |= BUTTON_MENU;
121 if(key & BTN_OFF)
122 ret |= BUTTON_POWER;
123 } 138 }
124 139 else if(pen_down)
125 if(data != NULL)
126 { 140 {
127 if(pendown_flag) 141 ret |= BUTTON_TOUCH;
128 { 142 if(data != NULL)
129 *data = touch_to_pixels(stable_x_pos, stable_y_pos); 143 *data = cur_touch;
130 ret |= BUTTON_TOUCH;
131 }
132 else
133 *data = 0;
134 } 144 }
135 145
136 return ret; 146 return ret;
137} 147}
138 148
139/* 149void touchscreen_set_mode(enum touchscreen_mode mode)
140static enum touchpad_mode current_mode = TOUCHPAD_POINT;
141
142static bool touch_available = false;
143
144static int touchpad_buttons[3][3] =
145{
146 {BUTTON_TOPLEFT, BUTTON_TOPMIDDLE, BUTTON_TOPRIGHT},
147 {BUTTON_MIDLEFT, BUTTON_CENTER, BUTTON_MIDRIGHT},
148 {BUTTON_BOTTOMLEFT, BUTTON_BOTTOMMIDDLE, BUTTON_BOTTOMRIGHT}
149};
150
151void touchpad_set_mode(enum touchpad_mode mode)
152{ 150{
153 current_mode = mode; 151 current_mode = mode;
154} 152}
155 153
156enum touchpad_mode touchpad_get_mode(void) 154enum touchscreen_mode touchscreen_get_mode(void)
157{ 155{
158 return current_mode; 156 return current_mode;
159} 157}
160 158
161void button_set_touch_available(void)
162{
163 touch_available = true;
164}
165*/
166
167/* Interrupt handler */ 159/* Interrupt handler */
168void SADC(void) 160void SADC(void)
169{ 161{
@@ -179,18 +171,17 @@ void SADC(void)
179 /* Pen down IRQ */ 171 /* Pen down IRQ */
180 REG_SADC_CTRL &= (~(SADC_CTRL_PENUM | SADC_CTRL_TSRDYM)); 172 REG_SADC_CTRL &= (~(SADC_CTRL_PENUM | SADC_CTRL_TSRDYM));
181 REG_SADC_CTRL |= (SADC_CTRL_PENDM); 173 REG_SADC_CTRL |= (SADC_CTRL_PENDM);
182 pendown_flag = true; 174 pen_down = true;
183 } 175 }
184 if(state & SADC_CTRL_PENUM) 176 if(state & SADC_CTRL_PENUM)
185 { 177 {
186 /* Pen up IRQ */ 178 /* Pen up IRQ */
187 REG_SADC_CTRL &= (~SADC_CTRL_PENDM ); 179 REG_SADC_CTRL &= (~SADC_CTRL_PENDM );
188 REG_SADC_CTRL |= SADC_CTRL_PENUM; 180 REG_SADC_CTRL |= SADC_CTRL_PENUM;
189 pendown_flag = false; 181 pen_down = false;
190 x_pos = -1; 182 x_pos = -1;
191 y_pos = -1; 183 y_pos = -1;
192 stable_x_pos = -1; 184 cur_touch = 0;
193 stable_y_pos = -1;
194 } 185 }
195 if(state & SADC_CTRL_TSRDYM) 186 if(state & SADC_CTRL_TSRDYM)
196 { 187 {
@@ -200,15 +191,15 @@ void SADC(void)
200 191
201 dat = REG_SADC_TSDAT; 192 dat = REG_SADC_TSDAT;
202 193
203 xData = (dat >> 0) & 0xfff; 194 xData = (dat >> 0) & 0xFFF;
204 yData = (dat >> 16) & 0xfff; 195 yData = (dat >> 16) & 0xFFF;
205 196
206 dat = REG_SADC_TSDAT; 197 dat = REG_SADC_TSDAT;
207 tsz1Data = (dat >> 0) & 0xfff; 198 tsz1Data = (dat >> 0) & 0xFFF;
208 tsz2Data = (dat >> 16) & 0xfff; 199 tsz2Data = (dat >> 16) & 0xFFF;
209 200
210 if(!pendown_flag) 201 if( !pen_down )
211 return ; 202 return;
212 203
213 tsz1Data = tsz2Data - tsz1Data; 204 tsz1Data = tsz2Data - tsz1Data;
214 205
@@ -231,8 +222,7 @@ void SADC(void)
231 { 222 {
232 if(x_pos != -1) 223 if(x_pos != -1)
233 { 224 {
234 stable_x_pos = x_pos; 225 cur_touch = touch_to_pixels(x_pos, y_pos);
235 stable_y_pos = y_pos;
236 x_pos = -1; 226 x_pos = -1;
237 y_pos = -1; 227 y_pos = -1;
238 } 228 }
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)
497 497
498#define TXFIFOEP0 USB_FIFO_EP0 498#define TXFIFOEP0 USB_FIFO_EP0
499 499
500u32 Bulk_in_buf[BULK_IN_BUF_SIZE]; 500u8 *Bulk_in_buf;
501u32 Bulk_out_buf[BULK_OUT_BUF_SIZE]; 501u32 Bulk_out_buf[BULK_OUT_BUF_SIZE];
502u32 Bulk_in_size,Bulk_in_finish,Bulk_out_size; 502u32 Bulk_in_size,Bulk_in_finish,Bulk_out_size;
503u16 handshake_PKT[4]={0,0,0,0}; 503u16 handshake_PKT[4]={0,0,0,0};
@@ -560,12 +560,14 @@ void HW_SendPKT(int ep, const u8 *buf, int size)
560 Bulk_in_size - Bulk_in_finish); 560 Bulk_in_size - Bulk_in_finish);
561 usb_setb(USB_REG_INCSR, USB_INCSR_INPKTRDY); 561 usb_setb(USB_REG_INCSR, USB_INCSR_INPKTRDY);
562 Bulk_in_finish = Bulk_in_size; 562 Bulk_in_finish = Bulk_in_size;
563 } else 563 }
564 else
564 { 565 {
565 udcWriteFifo((u8 *)((u32)buf+Bulk_in_finish), 566 udcWriteFifo((u8 *)((u32)buf+Bulk_in_finish),
566 fifosize[ep]); 567 fifosize[ep]);
567 usb_setb(USB_REG_INCSR, USB_INCSR_INPKTRDY); 568 usb_setb(USB_REG_INCSR, USB_INCSR_INPKTRDY);
568 Bulk_in_finish += fifosize[ep]; 569 Bulk_in_finish += fifosize[ep];
570 Bulk_in_buf = (u8*)buf;
569 } 571 }
570 } 572 }
571 else //EP0 573 else //EP0
@@ -645,7 +647,7 @@ static struct {
645 (1 << 7) | 1,// endpoint 2 is IN endpoint 647 (1 << 7) | 1,// endpoint 2 is IN endpoint
646 2, /* bulk */ 648 2, /* bulk */
647 512, 649 512,
648 16 650 0
649 }, 651 },
650 { 652 {
651 sizeof(USB_EndPointDescriptor), 653 sizeof(USB_EndPointDescriptor),
@@ -653,7 +655,7 @@ static struct {
653 (0 << 7) | 1,// endpoint 5 is OUT endpoint 655 (0 << 7) | 1,// endpoint 5 is OUT endpoint
654 2, /* bulk */ 656 2, /* bulk */
655 512, /* OUT EP FIFO size */ 657 512, /* OUT EP FIFO size */
656 16 658 0
657 } 659 }
658 } 660 }
659}; 661};
@@ -822,21 +824,27 @@ void usbHandleStandDevReq(u8 *buf)
822 } 824 }
823} 825}
824 826
825extern char printfbuf[256]; 827unsigned char nandbuffer[4096];
826 828
827void usbHandleVendorReq(u8 *buf) 829void usbHandleVendorReq(u8 *buf)
828{ 830{
829 int ret_state, i;
830 USB_DeviceRequest *dreq = (USB_DeviceRequest *)buf; 831 USB_DeviceRequest *dreq = (USB_DeviceRequest *)buf;
831 switch (dreq->bRequest) 832 switch (dreq->bRequest)
832 { 833 {
834 case 0xB0:
835 memset(&nandbuffer, 0, 4096);
836 jz_nand_read(dreq->wValue, dreq->wIndex, &nandbuffer);
837 //printf("Read block %d page %d", dreq->wValue, dreq->wIndex);
838 udc_state = IDLE;
839 break;
833 case 0xAB: 840 case 0xAB:
834 //for(i=0; i<256; i+=64) 841 HW_SendPKT(1, nandbuffer, 4096);
835 HW_SendPKT(0, printfbuf, 64); 842 //printf("Send data");
836 udc_state = IDLE; 843 //udc_state = BULK_OUT;
837 break; 844 break;
838 case 0x12: 845 case 0x12:
839 HW_SendPKT(0, "TEST", 4); 846 HW_SendPKT(0, "TEST", 4);
847 //printf("Send test");
840 udc_state = IDLE; 848 udc_state = IDLE;
841 break; 849 break;
842 } 850 }
@@ -874,7 +882,7 @@ void EP0_Handler (void)
874 byCSR0 = jz_readb(USB_REG_CSR0); 882 byCSR0 = jz_readb(USB_REG_CSR0);
875 883
876/* Check for SentStall 884/* Check for SentStall
877 if sendtall is set ,clear the sendstall bit*/ 885 if sendstall is set ,clear the sendstall bit*/
878 if (byCSR0 & USB_CSR0_SENTSTALL) 886 if (byCSR0 & USB_CSR0_SENTSTALL)
879 { 887 {
880 jz_writeb(USB_REG_CSR0, (byCSR0 & ~USB_CSR0_SENDSTALL)); 888 jz_writeb(USB_REG_CSR0, (byCSR0 & ~USB_CSR0_SENDSTALL));
@@ -942,7 +950,8 @@ void EPIN_Handler(u8 EP)
942 Bulk_in_size - Bulk_in_finish); 950 Bulk_in_size - Bulk_in_finish);
943 usb_setw(USB_REG_INCSR, USB_INCSR_INPKTRDY); 951 usb_setw(USB_REG_INCSR, USB_INCSR_INPKTRDY);
944 Bulk_in_finish = Bulk_in_size; 952 Bulk_in_finish = Bulk_in_size;
945 } else 953 }
954 else
946 { 955 {
947 udcWriteFifo((u8 *)((u32)Bulk_in_buf+Bulk_in_finish), 956 udcWriteFifo((u8 *)((u32)Bulk_in_buf+Bulk_in_finish),
948 fifosize[EP]); 957 fifosize[EP]);
@@ -1030,6 +1039,8 @@ void __udc_start(void)
1030 1039
1031void usb_init_device(void) 1040void usb_init_device(void)
1032{ 1041{
1042 REG_USB_REG_POWER &= ~USB_POWER_SOFTCONN;
1043 REG_USB_REG_POWER |= USB_POWER_SOFTCONN;
1033 __udc_start(); 1044 __udc_start();
1034} 1045}
1035 1046