summaryrefslogtreecommitdiff
path: root/firmware/target
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 /firmware/target
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
Diffstat (limited to 'firmware/target')
-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
5 files changed, 147 insertions, 124 deletions
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