Skip to content

Commit 6b0a711

Browse files
committed
debug usb host. add 720x400 support
1 parent 44f133d commit 6b0a711

File tree

6 files changed

+93
-63
lines changed

6 files changed

+93
-63
lines changed

ports/raspberrypi/boards/adafruit_fruit_jam/mpconfigboard.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,8 @@
2222
#define DEFAULT_USB_HOST_5V_POWER (&pin_GPIO11)
2323

2424
#define CIRCUITPY_PSRAM_CHIP_SELECT (&pin_GPIO47)
25+
26+
#define CIRCUITPY_CONSOLE_UART_TX (&pin_GPIO10)
27+
#define CIRCUITPY_CONSOLE_UART_RX (&pin_GPIO9)
28+
29+
#define CIRCUITPY_DEBUG_TINYUSB 2

ports/raspberrypi/common-hal/picodvi/Framebuffer_RP2350.c

Lines changed: 54 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -53,16 +53,17 @@
5353
#define SYNC_V1_H0 (TMDS_CTRL_10 | (TMDS_CTRL_00 << 10) | (TMDS_CTRL_00 << 20))
5454
#define SYNC_V1_H1 (TMDS_CTRL_11 | (TMDS_CTRL_00 << 10) | (TMDS_CTRL_00 << 20))
5555

56-
#define MODE_800_H_SYNC_POLARITY 0
57-
#define MODE_800_H_FRONT_PORCH 24
58-
#define MODE_800_H_SYNC_WIDTH 72
59-
#define MODE_800_H_BACK_PORCH 96
60-
#define MODE_800_H_ACTIVE_PIXELS 800
61-
62-
#define MODE_800_V_SYNC_POLARITY 1
63-
#define MODE_800_V_FRONT_PORCH 3
64-
#define MODE_800_V_SYNC_WIDTH 10
65-
#define MODE_800_V_BACK_PORCH 7
56+
#define MODE_720_H_SYNC_POLARITY 0
57+
#define MODE_720_H_FRONT_PORCH 24
58+
#define MODE_720_H_SYNC_WIDTH 64
59+
#define MODE_720_H_BACK_PORCH 88
60+
#define MODE_720_H_ACTIVE_PIXELS 720
61+
62+
#define MODE_720_V_SYNC_POLARITY 0
63+
#define MODE_720_V_FRONT_PORCH 3
64+
#define MODE_720_V_SYNC_WIDTH 4
65+
#define MODE_720_V_BACK_PORCH 13
66+
#define MODE_720_V_ACTIVE_LINES 400
6667

6768
#define MODE_640_H_SYNC_POLARITY 0
6869
#define MODE_640_H_FRONT_PORCH 16
@@ -74,15 +75,15 @@
7475
#define MODE_640_V_FRONT_PORCH 10
7576
#define MODE_640_V_SYNC_WIDTH 2
7677
#define MODE_640_V_BACK_PORCH 33
77-
#define MODE_V_ACTIVE_LINES 480
78+
#define MODE_640_V_ACTIVE_LINES 480
7879

79-
#define MODE_800_V_TOTAL_LINES ( \
80-
MODE_800_V_FRONT_PORCH + MODE_800_V_SYNC_WIDTH + \
81-
MODE_800_V_BACK_PORCH + MODE_V_ACTIVE_LINES \
80+
#define MODE_720_V_TOTAL_LINES ( \
81+
MODE_720_V_FRONT_PORCH + MODE_720_V_SYNC_WIDTH + \
82+
MODE_720_V_BACK_PORCH + MODE_720_V_ACTIVE_LINES \
8283
)
8384
#define MODE_640_V_TOTAL_LINES ( \
8485
MODE_640_V_FRONT_PORCH + MODE_640_V_SYNC_WIDTH + \
85-
MODE_640_V_BACK_PORCH + MODE_V_ACTIVE_LINES \
86+
MODE_640_V_BACK_PORCH + MODE_640_V_ACTIVE_LINES \
8687
)
8788

8889
#define HSTX_CMD_RAW (0x0u << 12)
@@ -124,34 +125,34 @@ static uint32_t vactive_line640[] = {
124125
HSTX_CMD_TMDS | MODE_640_H_ACTIVE_PIXELS
125126
};
126127

127-
static uint32_t vblank_line800_vsync_off[] = {
128-
HSTX_CMD_RAW_REPEAT | MODE_800_H_FRONT_PORCH,
129-
SYNC_V0_H1,
130-
HSTX_CMD_RAW_REPEAT | MODE_800_H_SYNC_WIDTH,
131-
SYNC_V0_H0,
132-
HSTX_CMD_RAW_REPEAT | (MODE_800_H_BACK_PORCH + MODE_800_H_ACTIVE_PIXELS),
133-
SYNC_V0_H1
134-
};
135-
136-
static uint32_t vblank_line800_vsync_on[] = {
137-
HSTX_CMD_RAW_REPEAT | MODE_800_H_FRONT_PORCH,
128+
static uint32_t vblank_line720_vsync_off[] = {
129+
HSTX_CMD_RAW_REPEAT | MODE_720_H_FRONT_PORCH,
138130
SYNC_V1_H1,
139-
HSTX_CMD_RAW_REPEAT | MODE_800_H_SYNC_WIDTH,
131+
HSTX_CMD_RAW_REPEAT | MODE_720_H_SYNC_WIDTH,
140132
SYNC_V1_H0,
141-
HSTX_CMD_RAW_REPEAT | (MODE_800_H_BACK_PORCH + MODE_800_H_ACTIVE_PIXELS),
133+
HSTX_CMD_RAW_REPEAT | (MODE_720_H_BACK_PORCH + MODE_720_H_ACTIVE_PIXELS),
142134
SYNC_V1_H1
143135
};
144136

145-
static uint32_t vactive_line800[] = {
146-
HSTX_CMD_RAW_REPEAT | MODE_800_H_FRONT_PORCH,
137+
static uint32_t vblank_line720_vsync_on[] = {
138+
HSTX_CMD_RAW_REPEAT | MODE_720_H_FRONT_PORCH,
139+
SYNC_V0_H1,
140+
HSTX_CMD_RAW_REPEAT | MODE_720_H_SYNC_WIDTH,
141+
SYNC_V0_H0,
142+
HSTX_CMD_RAW_REPEAT | (MODE_720_H_BACK_PORCH + MODE_720_H_ACTIVE_PIXELS),
143+
SYNC_V0_H1
144+
};
145+
146+
static uint32_t vactive_line720[] = {
147+
HSTX_CMD_RAW_REPEAT | MODE_720_H_FRONT_PORCH,
147148
SYNC_V1_H1,
148149
HSTX_CMD_NOP,
149-
HSTX_CMD_RAW_REPEAT | MODE_800_H_SYNC_WIDTH,
150+
HSTX_CMD_RAW_REPEAT | MODE_720_H_SYNC_WIDTH,
150151
SYNC_V1_H0,
151152
HSTX_CMD_NOP,
152-
HSTX_CMD_RAW_REPEAT | MODE_800_H_BACK_PORCH,
153+
HSTX_CMD_RAW_REPEAT | MODE_720_H_BACK_PORCH,
153154
SYNC_V1_H1,
154-
HSTX_CMD_TMDS | MODE_800_H_ACTIVE_PIXELS
155+
HSTX_CMD_TMDS | MODE_720_H_ACTIVE_PIXELS
155156
};
156157

157158
picodvi_framebuffer_obj_t *active_picodvi = NULL;
@@ -171,10 +172,16 @@ static void __not_in_flash_func(dma_irq_handler)(void) {
171172
}
172173

173174
static bool mode_ok(mp_uint_t width, mp_uint_t height, mp_uint_t color_depth) {
174-
if ((width == 640 || width == 800) && height == 480 && (color_depth < 8)) {
175+
if (width == 640 && height == 480 && (color_depth < 8)) {
176+
return true;
177+
}
178+
if (width == 320 && height == 240) {
179+
return true;
180+
}
181+
if (width == 720 && height == 400) {
175182
return true;
176183
}
177-
if ((width == 320 || width == 400) && height == 240) {
184+
if (width == 360 && height == 200) {
178185
return true;
179186
}
180187
return false;
@@ -195,7 +202,7 @@ void common_hal_picodvi_framebuffer_construct(picodvi_framebuffer_obj_t *self,
195202
mp_raise_ValueError_varg(MP_ERROR_TEXT("Invalid %q and %q for color depth %d"), MP_QSTR_width, MP_QSTR_height, color_depth);
196203
}
197204

198-
bool pixel_doubled = height == 240;
205+
bool pixel_doubled = height <= 240;
199206

200207
size_t all_allocated = 0;
201208
int8_t pins[8] = {
@@ -251,10 +258,9 @@ void common_hal_picodvi_framebuffer_construct(picodvi_framebuffer_obj_t *self,
251258
}
252259

253260
if (width % 320 == 0) {
254-
self->dma_commands_len = (MODE_640_V_FRONT_PORCH + MODE_640_V_SYNC_WIDTH + MODE_640_V_BACK_PORCH + 2 * MODE_V_ACTIVE_LINES + 1) * dma_command_size;
261+
self->dma_commands_len = (MODE_640_V_FRONT_PORCH + MODE_640_V_SYNC_WIDTH + MODE_640_V_BACK_PORCH + 2 * MODE_640_V_ACTIVE_LINES + 1) * dma_command_size;
255262
} else {
256-
257-
self->dma_commands_len = (MODE_800_V_FRONT_PORCH + MODE_800_V_SYNC_WIDTH + MODE_800_V_BACK_PORCH + 2 * MODE_V_ACTIVE_LINES + 1) * dma_command_size;
263+
self->dma_commands_len = (MODE_720_V_FRONT_PORCH + MODE_720_V_SYNC_WIDTH + MODE_720_V_BACK_PORCH + 2 * MODE_720_V_ACTIVE_LINES + 1) * dma_command_size;
258264
}
259265
self->dma_commands = (uint32_t *)port_malloc(self->dma_commands_len * sizeof(uint32_t), true);
260266
if (self->dma_commands == NULL || ((size_t)self->framebuffer & 0xf0000000) == 0x10000000) {
@@ -290,27 +296,27 @@ void common_hal_picodvi_framebuffer_construct(picodvi_framebuffer_obj_t *self,
290296
if (self->width % 320 == 0) {
291297
frontporch_start = MODE_640_V_TOTAL_LINES - MODE_640_V_FRONT_PORCH;
292298
} else {
293-
frontporch_start = MODE_800_V_TOTAL_LINES - MODE_800_V_FRONT_PORCH;
299+
frontporch_start = MODE_720_V_TOTAL_LINES - MODE_720_V_FRONT_PORCH;
294300
}
295301
size_t frontporch_end = frontporch_start;
296302
if (self->width % 320 == 0) {
297303
frontporch_end += MODE_640_V_FRONT_PORCH;
298304
} else {
299-
frontporch_end += MODE_800_V_FRONT_PORCH;
305+
frontporch_end += MODE_720_V_FRONT_PORCH;
300306
}
301307
size_t vsync_start = 0;
302308
size_t vsync_end = vsync_start;
303309
if (self->width % 320 == 0) {
304310
vsync_end += MODE_640_V_SYNC_WIDTH;
305311
} else {
306-
vsync_end += MODE_800_V_SYNC_WIDTH;
312+
vsync_end += MODE_720_V_SYNC_WIDTH;
307313
}
308314
size_t backporch_start = vsync_end;
309315
size_t backporch_end = backporch_start;
310316
if (self->width % 320 == 0) {
311317
backporch_end += MODE_640_V_BACK_PORCH;
312318
} else {
313-
backporch_end += MODE_800_V_BACK_PORCH;
319+
backporch_end += MODE_720_V_BACK_PORCH;
314320
}
315321
size_t active_start = backporch_end;
316322

@@ -345,15 +351,15 @@ void common_hal_picodvi_framebuffer_construct(picodvi_framebuffer_obj_t *self,
345351
dma_channel_hw_addr(self->dma_pixel_channel)->al1_write_addr = dma_write_addr;
346352
}
347353
bool is_640_based = (width == 320 || width == 640);
348-
uint32_t *vblank_line_vsync_on = is_640_based ? vblank_line640_vsync_on : vblank_line800_vsync_on;
349-
uint32_t *vblank_line_vsync_off = is_640_based ? vblank_line640_vsync_off : vblank_line800_vsync_off;
350-
uint32_t *vactive_line = is_640_based ? vactive_line640 : vactive_line800;
354+
uint32_t *vblank_line_vsync_on = is_640_based ? vblank_line640_vsync_on : vblank_line720_vsync_on;
355+
uint32_t *vblank_line_vsync_off = is_640_based ? vblank_line640_vsync_off : vblank_line720_vsync_off;
356+
uint32_t *vactive_line = is_640_based ? vactive_line640 : vactive_line720;
351357

352358
size_t mode_v_total_lines;
353359
if (is_640_based) {
354360
mode_v_total_lines = MODE_640_V_TOTAL_LINES;
355361
} else {
356-
mode_v_total_lines = MODE_800_V_TOTAL_LINES;
362+
mode_v_total_lines = MODE_720_V_TOTAL_LINES;
357363
}
358364

359365
for (size_t v_scanline = 0; v_scanline < mode_v_total_lines; v_scanline++) {
@@ -450,7 +456,7 @@ void common_hal_picodvi_framebuffer_construct(picodvi_framebuffer_obj_t *self,
450456
1 << HSTX_CTRL_EXPAND_SHIFT_RAW_N_SHIFTS_LSB |
451457
0 << HSTX_CTRL_EXPAND_SHIFT_RAW_SHIFT_LSB;
452458

453-
uint32_t clk_factor = is_640_based ? 5u : 4u;
459+
uint32_t clk_factor = is_640_based ? 5u : 5u;
454460

455461
// Serial output config: clock period of 4 or 5 cycles, pop from command
456462
// expander every 4 or 5 cycles, shift the output shiftreg by 2 every cycle.

ports/raspberrypi/common-hal/usb_host/Port.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,12 +53,12 @@ static void __not_in_flash_func(core1_main)(void) {
5353
(0x1b << MPU_RASR_SIZE_Pos); // Size is 0x10000000 which masks up to SRAM region.
5454
MPU->RNR = 7;
5555
#endif
56-
#if __CORTEX_M == 33
57-
MPU->CTRL = MPU_CTRL_PRIVDEFENA_Msk | MPU_CTRL_ENABLE_Msk;
58-
MPU->RNR = 6; // 7 is used by pico-sdk stack protection.
59-
MPU->RBAR = XIP_BASE | MPU_RBAR_XN_Msk;
60-
MPU->RLAR = XIP_SRAM_BASE | MPU_RLAR_EN_Msk;
61-
#endif
56+
// #if __CORTEX_M == 33
57+
// MPU->CTRL = MPU_CTRL_PRIVDEFENA_Msk | MPU_CTRL_ENABLE_Msk;
58+
// MPU->RNR = 6; // 7 is used by pico-sdk stack protection.
59+
// MPU->RBAR = XIP_BASE | MPU_RBAR_XN_Msk;
60+
// MPU->RLAR = XIP_SRAM_BASE | MPU_RLAR_EN_Msk;
61+
// #endif
6262

6363
_core1_ready = true;
6464

supervisor/shared/serial.c

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,24 @@ static void console_uart_write_cb(void *env, const char *str, size_t len) {
149149
}
150150

151151
const mp_print_t console_uart_print = {NULL, console_uart_write_cb};
152+
153+
int console_uart_printf(const char *fmt, ...) {
154+
#if CIRCUITPY_CONSOLE_UART
155+
// Skip prints that occur before console serial is started. It's better than
156+
// crashing.
157+
if (common_hal_busio_uart_deinited(&console_uart)) {
158+
return 0;
159+
}
160+
va_list ap;
161+
va_start(ap, fmt);
162+
int ret = mp_vprintf(&console_uart_print, fmt, ap);
163+
va_end(ap);
164+
return ret;
165+
#else
166+
return 0;
167+
#endif
168+
}
169+
152170
#endif
153171

154172
MP_WEAK void board_serial_early_init(void) {
@@ -282,12 +300,12 @@ char serial_read(void) {
282300
#endif
283301

284302
#if CIRCUITPY_CONSOLE_UART
285-
if (common_hal_busio_uart_rx_characters_available(&console_uart)) {
286-
int uart_errcode;
287-
char text;
288-
common_hal_busio_uart_read(&console_uart, (uint8_t *)&text, 1, &uart_errcode);
289-
return text;
290-
}
303+
// if (common_hal_busio_uart_rx_characters_available(&console_uart)) {
304+
// int uart_errcode;
305+
// char text;
306+
// common_hal_busio_uart_read(&console_uart, (uint8_t *)&text, 1, &uart_errcode);
307+
// return text;
308+
// }
291309
#endif
292310

293311
#if CIRCUITPY_SERIAL_BLE
@@ -345,7 +363,7 @@ uint32_t serial_bytes_available(void) {
345363
#endif
346364

347365
#if CIRCUITPY_CONSOLE_UART
348-
count += common_hal_busio_uart_rx_characters_available(&console_uart);
366+
// count += common_hal_busio_uart_rx_characters_available(&console_uart);
349367
#endif
350368

351369
#if CIRCUITPY_SERIAL_BLE
@@ -406,7 +424,7 @@ uint32_t serial_write_substring(const char *text, uint32_t length) {
406424
#endif
407425

408426
#if CIRCUITPY_CONSOLE_UART
409-
length_sent = console_uart_write(text, length);
427+
// length_sent = console_uart_write(text, length);
410428
#endif
411429

412430
#if CIRCUITPY_SERIAL_BLE

supervisor/shared/serial.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,5 +49,6 @@ uint32_t board_serial_bytes_available(void);
4949
void board_serial_write_substring(const char *text, uint32_t length);
5050

5151
extern const mp_print_t console_uart_print;
52+
int console_uart_printf(const char *fmt, ...) __attribute__((format(printf, 1, 2)));
5253

5354
void print_hexdump(const mp_print_t *printer, const char *prefix, const uint8_t *buf, size_t len);

supervisor/shared/usb/tusb_config.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ extern "C" {
5555
// When debugging TinyUSB, only output to the console UART link.
5656
#if CIRCUITPY_DEBUG_TINYUSB > 0 && defined(CIRCUITPY_CONSOLE_UART)
5757
#define CFG_TUSB_DEBUG CIRCUITPY_DEBUG_TINYUSB
58-
#if __ZEPHYR__
58+
#ifdef __ZEPHYR__
5959
#define CFG_TUSB_DEBUG_PRINTF zephyr_printk
6060
#else
6161
#define CFG_TUSB_DEBUG_PRINTF console_uart_printf

0 commit comments

Comments
 (0)