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
This commit is contained in:
Maurus Cuelenaere 2008-09-17 21:44:47 +00:00
parent 3655a32a3e
commit 9407ae838e
7 changed files with 160 additions and 177 deletions

View file

@ -42,48 +42,6 @@ static void audiotest(void)
__aic_enable_loopback(); __aic_enable_loopback();
} }
/* CP0 hazard avoidance. */
#define BARRIER __asm__ __volatile__(".set noreorder\n\t" \
"nop; nop; nop; nop; nop; nop;\n\t" \
".set reorder\n\t")
static void show_tlb(void)
{
#define ASID_MASK 0xFF
unsigned int old_ctx;
unsigned int entry;
unsigned int entrylo0, entrylo1, entryhi;
unsigned int pagemask;
cli();
/* Save old context */
old_ctx = (read_c0_entryhi() & 0xff);
printf("TLB content:");
for(entry = 0; entry < 32; entry++)
{
write_c0_index(entry);
BARRIER;
tlb_read();
BARRIER;
entryhi = read_c0_entryhi();
entrylo0 = read_c0_entrylo0();
entrylo1 = read_c0_entrylo1();
pagemask = read_c0_pagemask();
printf("%02d: ASID=%02d%s VA=0x%08x", entry, entryhi & ASID_MASK, (entrylo0 & entrylo1 & 1) ? "(G)" : " ", entryhi & ~ASID_MASK);
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" : "");
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" : "");
printf("pagemask=0x%08x entryhi=0x%08x", pagemask, entryhi);
printf("entrylo0=0x%08x entrylo1=0x%08x", entrylo0, entrylo1);
}
BARRIER;
write_c0_entryhi(old_ctx);
sti();
}
int main(void) int main(void)
{ {
kernel_init(); kernel_init();
@ -135,12 +93,15 @@ int main(void)
{ {
memset(testdata, 0, 4096); memset(testdata, 0, 4096);
reset_screen(); reset_screen();
jz_nand_read(2, j, &testdata); jz_nand_read(0, j, &testdata);
printf("Page %d", j); printf("Page %d", j);
int i; int i;
for(i=0; i<256; i+=8) for(i=0; i<768; i+=16)
{ {
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]); snprintf(msg, 30, "%02x%02x%02x%02x%02x%02x%02x%02x %02x%02x%02x%02x%02x%02x%02x%02x",
testdata[i], testdata[i+1], testdata[i+2], testdata[i+3], testdata[i+4], testdata[i+5], testdata[i+6], testdata[i+7],
testdata[i+8], testdata[i+9], testdata[i+10], testdata[i+11], testdata[i+12], testdata[i+13], testdata[i+14], testdata[i+15]
);
printf(msg); printf(msg);
} }
while(!((btn = button_read_device(&touch)) & (BUTTON_VOL_UP|BUTTON_VOL_DOWN))); while(!((btn = button_read_device(&touch)) & (BUTTON_VOL_UP|BUTTON_VOL_DOWN)));
@ -155,8 +116,12 @@ int main(void)
while(1) while(1)
{ {
#ifdef ONDA_VX747 #ifdef ONDA_VX747
#if 1
btn = button_get(false); btn = button_get(false);
touch = button_get_data(); touch = button_get_data();
#else
btn = button_read_device(&touch);
#endif
#else #else
btn = button_read_device(); btn = button_read_device();
#endif #endif
@ -174,11 +139,6 @@ int main(void)
printf("BUTTON_HOLD"); printf("BUTTON_HOLD");
asm("break 0x7"); asm("break 0x7");
} }
if(btn & BUTTON_VOL_DOWN)
{
reset_screen();
show_tlb();
}
if(btn & BUTTON_POWER) if(btn & BUTTON_POWER)
{ {
power_off(); power_off();

View file

@ -83,10 +83,10 @@
#define HAVE_BACKLIGHT_BRIGHTNESS #define HAVE_BACKLIGHT_BRIGHTNESS
/* Main LCD backlight brightness range and defaults */ /* Main LCD backlight brightness range and defaults */
#define MIN_BRIGHTNESS_SETTING 0 /* TODO */ #define MIN_BRIGHTNESS_SETTING 100
#define MAX_BRIGHTNESS_SETTING 127 #define MAX_BRIGHTNESS_SETTING 300
#define DEFAULT_BRIGHTNESS_SETTING 85 #define DEFAULT_BRIGHTNESS_SETTING 300 /* "full brightness" */
#define DEFAULT_DIMNESS_SETTING 22 #define DEFAULT_DIMNESS_SETTING 100 /* "most dim" */
/* Define this if you have a software controlled poweroff */ /* Define this if you have a software controlled poweroff */
//#define HAVE_SW_POWEROFF //#define HAVE_SW_POWEROFF

View file

@ -24,6 +24,7 @@
#include "lcd.h" #include "lcd.h"
#include "lcd-target.h" #include "lcd-target.h"
#include "system-target.h" #include "system-target.h"
#include "kernel.h"
static volatile bool _lcd_on = false; static volatile bool _lcd_on = false;
static volatile bool lcd_poweroff = 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 */ __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; REG_DMAC_DMACR = DMAC_DMACR_DMAE;
while( !(REG_DMAC_DCCSR(0) & DMAC_DCCSR_TT) ) 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. /* Update the display.

View file

@ -23,58 +23,74 @@
#include "jz4740.h" #include "jz4740.h"
#include "backlight-target.h" #include "backlight-target.h"
#define GPIO_PWM 123 #define GPIO_PWM (32*3)+31
#define PWM_CHN 7 #define PWM_CHN 7
#define PWM_FULL 101 #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) /* Taken from the OF */
__gpio_as_pwm7(); int tmp;
else tmp = (val/2 + __cpm_get_rtcclk()) / val;
{ if(tmp > 0xFFFF)
REG_TCU_TCSR(7) |= 2; tmp = 0xFFFF;
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_half_data(PWM_CHN, (tmp * val * 1374389535) >> 5);
} __tcu_set_full_data(PWM_CHN, tmp);
__tcu_set_count(7, 0); }
static void set_backlight_on(void)
{
__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) bool _backlight_init(void)
{ {
__gpio_as_pwm7(); __gpio_as_PWM_CHN();
__tcu_start_timer_clock(PWM_CHN);
__tcu_stop_counter(7);
__tcu_disable_pwm_output(7); __tcu_stop_counter(PWM_CHN);
__tcu_disable_pwm_output(PWM_CHN);
set_backlight(300, 7);
__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; return true;
} }
void _backlight_on(void) void _backlight_on(void)
{ {
set_backlight(300, 7); set_backlight_on();
} }
void _backlight_off(void) void _backlight_off(void)
{ {
set_backlight(300, 0); set_backlight_off();
} }
#ifdef HAVE_BACKLIGHT_BRIGHTNESS #ifdef HAVE_BACKLIGHT_BRIGHTNESS
void _backlight_set_brightness(int brightness) void _backlight_set_brightness(int brightness)
{ {
(void)brightness; set_backlight(brightness);
return;
} }
#endif #endif

View file

@ -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 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_CS_ACTIVE_LOW | SLCD_CFG_RS_CMD_LOW | SLCD_CFG_CLK_ACTIVE_FALLING
| SLCD_CFG_TYPE_PARALLEL); | SLCD_CFG_TYPE_PARALLEL);
REG_SLCD_CTRL = SLCD_CTRL_DMA_EN;
} }
static void _set_lcd_clock(void) static void _set_lcd_clock(void)

View file

@ -22,21 +22,22 @@
#include "config.h" #include "config.h"
#include "system.h" #include "system.h"
#include "jz4740.h" #include "jz4740.h"
#include "button.h"
#include "button-target.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_OFF (1 << 29)
#define BTN_VOL_DOWN (1 << 27)
#define BTN_HOLD (1 << 16) #define BTN_HOLD (1 << 16)
#define BTN_MASK (BTN_VOL_DOWN | BTN_VOL_UP \ #define BTN_MENU (1 << 1)
| BTN_MENU | BTN_OFF ) #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 TS_AD_COUNT 5
#define M_SADC_CFG_SNUM ((TS_AD_COUNT - 1) << SADC_CFG_SNUM_BIT) #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) | \ (2 << SADC_CFG_CLKOUT_NUM_BIT) | \
SADC_CFG_XYZ1Z2 | \ SADC_CFG_XYZ1Z2 | \
M_SADC_CFG_SNUM | \ M_SADC_CFG_SNUM | \
@ -45,20 +46,23 @@
SADC_CFG_CMD_INT_PEN \ SADC_CFG_CMD_INT_PEN \
) )
static bool pendown_flag = false;
static short x_pos = -1, y_pos = -1, datacount = 0; 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) void button_init_device(void)
{ {
REG_SADC_ENA = 0; REG_SADC_ENA = 0;
REG_SADC_STATE &= (~REG_SADC_STATE); REG_SADC_STATE &= (~REG_SADC_STATE);
REG_SADC_CTRL = 0x1f; REG_SADC_CTRL = 0x1F;
__cpm_start_sadc(); __cpm_start_sadc();
REG_SADC_CFG = SADC_CFG_INIT; 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_CTRL &= (~(SADC_CTRL_PENDM | SADC_CTRL_PENUM | SADC_CTRL_TSRDYM));
REG_SADC_ENA = SADC_ENA_TSEN; //| SADC_ENA_PBATEN | SADC_ENA_SADCINEN); REG_SADC_ENA = SADC_ENA_TSEN; //| SADC_ENA_PBATEN | SADC_ENA_SADCINEN);
__gpio_port_as_input(3, 29); __gpio_as_input(32*3 + 29);
__gpio_port_as_input(3, 27); __gpio_as_input(32*3 + 27);
__gpio_port_as_input(3, 16); __gpio_as_input(32*3 + 16);
__gpio_port_as_input(3, 1); __gpio_as_input(32*3 + 1);
__gpio_port_as_input(3, 0); __gpio_as_input(32*3 + 0);
} }
static int touch_to_pixels(short x, short y) static int touch_to_pixels(short x, short y)
{ {
/* X:300 -> 3800 Y:300->3900 */ /* X:300 -> 3800 Y:300->3900 */
x -= 300; x -= 300;
y -= 300; y -= 300;
@ -102,68 +106,56 @@ static int touch_to_pixels(short x, short y)
#endif #endif
} }
bool button_hold(void)
{
return ((~REG_GPIO_PXPIN(3)) & BTN_HOLD ? true : false);
}
int button_read_device(int *data) int button_read_device(int *data)
{ {
if(button_hold()) int ret = 0, tmp;
if((~REG_GPIO_PXPIN(3)) & BTN_HOLD)
return 0; return 0;
unsigned int key = ~(__gpio_get_port(3)); tmp = (~REG_GPIO_PXPIN(3)) & BTN_MASK;
int ret = 0;
if(tmp & BTN_VOL_DOWN)
if(key & BTN_MASK) 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) int px_x = cur_touch >> 16;
ret |= BUTTON_VOL_DOWN; int px_y = cur_touch & 0xFFFF;
if(key & BTN_VOL_UP) ret |= touchscreen_buttons[px_y/(LCD_HEIGHT/3)]
ret |= BUTTON_VOL_UP; [px_x/(LCD_WIDTH/3)];
if(key & BTN_MENU)
ret |= BUTTON_MENU;
if(key & BTN_OFF)
ret |= BUTTON_POWER;
} }
else if(pen_down)
if(data != NULL)
{ {
if(pendown_flag) ret |= BUTTON_TOUCH;
{ if(data != NULL)
*data = touch_to_pixels(stable_x_pos, stable_y_pos); *data = cur_touch;
ret |= BUTTON_TOUCH;
}
else
*data = 0;
} }
return ret; return ret;
} }
/* void touchscreen_set_mode(enum touchscreen_mode mode)
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)
{ {
current_mode = mode; current_mode = mode;
} }
enum touchpad_mode touchpad_get_mode(void) enum touchscreen_mode touchscreen_get_mode(void)
{ {
return current_mode; return current_mode;
} }
void button_set_touch_available(void)
{
touch_available = true;
}
*/
/* Interrupt handler */ /* Interrupt handler */
void SADC(void) void SADC(void)
{ {
@ -179,18 +171,17 @@ void SADC(void)
/* Pen down IRQ */ /* Pen down IRQ */
REG_SADC_CTRL &= (~(SADC_CTRL_PENUM | SADC_CTRL_TSRDYM)); REG_SADC_CTRL &= (~(SADC_CTRL_PENUM | SADC_CTRL_TSRDYM));
REG_SADC_CTRL |= (SADC_CTRL_PENDM); REG_SADC_CTRL |= (SADC_CTRL_PENDM);
pendown_flag = true; pen_down = true;
} }
if(state & SADC_CTRL_PENUM) if(state & SADC_CTRL_PENUM)
{ {
/* Pen up IRQ */ /* Pen up IRQ */
REG_SADC_CTRL &= (~SADC_CTRL_PENDM ); REG_SADC_CTRL &= (~SADC_CTRL_PENDM );
REG_SADC_CTRL |= SADC_CTRL_PENUM; REG_SADC_CTRL |= SADC_CTRL_PENUM;
pendown_flag = false; pen_down = false;
x_pos = -1; x_pos = -1;
y_pos = -1; y_pos = -1;
stable_x_pos = -1; cur_touch = 0;
stable_y_pos = -1;
} }
if(state & SADC_CTRL_TSRDYM) if(state & SADC_CTRL_TSRDYM)
{ {
@ -200,15 +191,15 @@ void SADC(void)
dat = REG_SADC_TSDAT; dat = REG_SADC_TSDAT;
xData = (dat >> 0) & 0xfff; xData = (dat >> 0) & 0xFFF;
yData = (dat >> 16) & 0xfff; yData = (dat >> 16) & 0xFFF;
dat = REG_SADC_TSDAT; dat = REG_SADC_TSDAT;
tsz1Data = (dat >> 0) & 0xfff; tsz1Data = (dat >> 0) & 0xFFF;
tsz2Data = (dat >> 16) & 0xfff; tsz2Data = (dat >> 16) & 0xFFF;
if(!pendown_flag) if( !pen_down )
return ; return;
tsz1Data = tsz2Data - tsz1Data; tsz1Data = tsz2Data - tsz1Data;
@ -231,8 +222,7 @@ void SADC(void)
{ {
if(x_pos != -1) if(x_pos != -1)
{ {
stable_x_pos = x_pos; cur_touch = touch_to_pixels(x_pos, y_pos);
stable_y_pos = y_pos;
x_pos = -1; x_pos = -1;
y_pos = -1; y_pos = -1;
} }

View file

@ -497,7 +497,7 @@ static inline u32 jz_readl(u32 address)
#define TXFIFOEP0 USB_FIFO_EP0 #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_out_buf[BULK_OUT_BUF_SIZE];
u32 Bulk_in_size,Bulk_in_finish,Bulk_out_size; u32 Bulk_in_size,Bulk_in_finish,Bulk_out_size;
u16 handshake_PKT[4]={0,0,0,0}; 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); Bulk_in_size - Bulk_in_finish);
usb_setb(USB_REG_INCSR, USB_INCSR_INPKTRDY); usb_setb(USB_REG_INCSR, USB_INCSR_INPKTRDY);
Bulk_in_finish = Bulk_in_size; Bulk_in_finish = Bulk_in_size;
} else }
else
{ {
udcWriteFifo((u8 *)((u32)buf+Bulk_in_finish), udcWriteFifo((u8 *)((u32)buf+Bulk_in_finish),
fifosize[ep]); fifosize[ep]);
usb_setb(USB_REG_INCSR, USB_INCSR_INPKTRDY); usb_setb(USB_REG_INCSR, USB_INCSR_INPKTRDY);
Bulk_in_finish += fifosize[ep]; Bulk_in_finish += fifosize[ep];
Bulk_in_buf = (u8*)buf;
} }
} }
else //EP0 else //EP0
@ -645,7 +647,7 @@ static struct {
(1 << 7) | 1,// endpoint 2 is IN endpoint (1 << 7) | 1,// endpoint 2 is IN endpoint
2, /* bulk */ 2, /* bulk */
512, 512,
16 0
}, },
{ {
sizeof(USB_EndPointDescriptor), sizeof(USB_EndPointDescriptor),
@ -653,7 +655,7 @@ static struct {
(0 << 7) | 1,// endpoint 5 is OUT endpoint (0 << 7) | 1,// endpoint 5 is OUT endpoint
2, /* bulk */ 2, /* bulk */
512, /* OUT EP FIFO size */ 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) void usbHandleVendorReq(u8 *buf)
{ {
int ret_state, i;
USB_DeviceRequest *dreq = (USB_DeviceRequest *)buf; USB_DeviceRequest *dreq = (USB_DeviceRequest *)buf;
switch (dreq->bRequest) 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: case 0xAB:
//for(i=0; i<256; i+=64) HW_SendPKT(1, nandbuffer, 4096);
HW_SendPKT(0, printfbuf, 64); //printf("Send data");
udc_state = IDLE; //udc_state = BULK_OUT;
break; break;
case 0x12: case 0x12:
HW_SendPKT(0, "TEST", 4); HW_SendPKT(0, "TEST", 4);
//printf("Send test");
udc_state = IDLE; udc_state = IDLE;
break; break;
} }
@ -874,7 +882,7 @@ void EP0_Handler (void)
byCSR0 = jz_readb(USB_REG_CSR0); byCSR0 = jz_readb(USB_REG_CSR0);
/* Check for SentStall /* Check for SentStall
if sendtall is set ,clear the sendstall bit*/ if sendstall is set ,clear the sendstall bit*/
if (byCSR0 & USB_CSR0_SENTSTALL) if (byCSR0 & USB_CSR0_SENTSTALL)
{ {
jz_writeb(USB_REG_CSR0, (byCSR0 & ~USB_CSR0_SENDSTALL)); jz_writeb(USB_REG_CSR0, (byCSR0 & ~USB_CSR0_SENDSTALL));
@ -942,7 +950,8 @@ void EPIN_Handler(u8 EP)
Bulk_in_size - Bulk_in_finish); Bulk_in_size - Bulk_in_finish);
usb_setw(USB_REG_INCSR, USB_INCSR_INPKTRDY); usb_setw(USB_REG_INCSR, USB_INCSR_INPKTRDY);
Bulk_in_finish = Bulk_in_size; Bulk_in_finish = Bulk_in_size;
} else }
else
{ {
udcWriteFifo((u8 *)((u32)Bulk_in_buf+Bulk_in_finish), udcWriteFifo((u8 *)((u32)Bulk_in_buf+Bulk_in_finish),
fifosize[EP]); fifosize[EP]);
@ -1030,6 +1039,8 @@ void __udc_start(void)
void usb_init_device(void) void usb_init_device(void)
{ {
REG_USB_REG_POWER &= ~USB_POWER_SOFTCONN;
REG_USB_REG_POWER |= USB_POWER_SOFTCONN;
__udc_start(); __udc_start();
} }