RP2040: fix exception with memcpy
Signed-off-by: Mahyar Koshkouei <mk@deltabeard.com>
This commit is contained in:
+16
-10
@@ -30,6 +30,7 @@
|
|||||||
#include <pico/stdio.h>
|
#include <pico/stdio.h>
|
||||||
#include <pico/stdlib.h>
|
#include <pico/stdlib.h>
|
||||||
#include <pico/multicore.h>
|
#include <pico/multicore.h>
|
||||||
|
#include <sys/unistd.h>
|
||||||
|
|
||||||
/* Project headers */
|
/* Project headers */
|
||||||
#include "hedley.h"
|
#include "hedley.h"
|
||||||
@@ -65,6 +66,8 @@ union core_cmd {
|
|||||||
|
|
||||||
static uint8_t pixels_buffer[LCD_WIDTH];
|
static uint8_t pixels_buffer[LCD_WIDTH];
|
||||||
|
|
||||||
|
#define putstdio(x) write(1, x, strlen(x))
|
||||||
|
|
||||||
void mk_ili9225_set_rst(bool state)
|
void mk_ili9225_set_rst(bool state)
|
||||||
{
|
{
|
||||||
gpio_put(GPIO_RST, state);
|
gpio_put(GPIO_RST, state);
|
||||||
@@ -125,15 +128,14 @@ void gb_cart_ram_write(struct gb_s *gb, const uint_fast32_t addr,
|
|||||||
*/
|
*/
|
||||||
void gb_error(struct gb_s *gb, const enum gb_error_e gb_err, const uint16_t val)
|
void gb_error(struct gb_s *gb, const enum gb_error_e gb_err, const uint16_t val)
|
||||||
{
|
{
|
||||||
#if 0
|
#if 1
|
||||||
const char* gb_err_str[4] =
|
const char* gb_err_str[4] = {
|
||||||
{
|
|
||||||
"UNKNOWN",
|
"UNKNOWN",
|
||||||
"INVALID OPCODE",
|
"INVALID OPCODE",
|
||||||
"INVALID READ",
|
"INVALID READ",
|
||||||
"INVALID WRITE"
|
"INVALID WRITE"
|
||||||
};
|
};
|
||||||
fprintf(stderr, "Error %d occurred: %s\n. Abort.\n",
|
printf("Error %d occurred: %s\n. Abort.\n",
|
||||||
gb_err,
|
gb_err,
|
||||||
gb_err >= GB_INVALID_MAX ?
|
gb_err >= GB_INVALID_MAX ?
|
||||||
gb_err_str[0] : gb_err_str[gb_err]);
|
gb_err_str[0] : gb_err_str[gb_err]);
|
||||||
@@ -219,7 +221,8 @@ void main_core1(void)
|
|||||||
mk_ili9225_write_pixels_end();
|
mk_ili9225_write_pixels_end();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
sleep_ms(1000);
|
// Sleep used for debugging LCD window.
|
||||||
|
//sleep_ms(1000);
|
||||||
|
|
||||||
while(1)
|
while(1)
|
||||||
{
|
{
|
||||||
@@ -272,8 +275,7 @@ void lcd_draw_line(struct gb_s *gb, const uint8_t pixels[LCD_WIDTH],
|
|||||||
cmd.data = line;
|
cmd.data = line;
|
||||||
|
|
||||||
__atomic_store_n(&lcd_line_busy, 1, __ATOMIC_SEQ_CST);
|
__atomic_store_n(&lcd_line_busy, 1, __ATOMIC_SEQ_CST);
|
||||||
__aeabi_memcpy4(pixels_buffer, pixels, LCD_WIDTH);
|
memcpy(pixels_buffer, pixels, LCD_WIDTH);
|
||||||
//memcpy(pixels_buffer, pixels, LCD_WIDTH);
|
|
||||||
multicore_fifo_push_blocking(cmd.full);
|
multicore_fifo_push_blocking(cmd.full);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -298,7 +300,7 @@ int main(void)
|
|||||||
/* Initialise USB serial connection for debugging. */
|
/* Initialise USB serial connection for debugging. */
|
||||||
stdio_init_all();
|
stdio_init_all();
|
||||||
//(void) getchar();
|
//(void) getchar();
|
||||||
puts_raw("Starting");
|
putstdio("INIT: ");
|
||||||
|
|
||||||
/* Initialise GPIO pins. */
|
/* Initialise GPIO pins. */
|
||||||
gpio_set_function(GPIO_CS, GPIO_FUNC_SIO);
|
gpio_set_function(GPIO_CS, GPIO_FUNC_SIO);
|
||||||
@@ -321,14 +323,15 @@ int main(void)
|
|||||||
spi_set_format(spi0, 16, SPI_CPOL_0, SPI_CPHA_0, SPI_MSB_FIRST);
|
spi_set_format(spi0, 16, SPI_CPOL_0, SPI_CPHA_0, SPI_MSB_FIRST);
|
||||||
|
|
||||||
/* Start Core1, which processes requests to the LCD. */
|
/* Start Core1, which processes requests to the LCD. */
|
||||||
puts_raw("Launching Core 1");
|
//puts_raw("Launching Core 1");
|
||||||
|
putstdio("CORE1 ");
|
||||||
multicore_launch_core1(main_core1);
|
multicore_launch_core1(main_core1);
|
||||||
|
|
||||||
/* Initialise GB context. */
|
/* Initialise GB context. */
|
||||||
memcpy(rom_bank0, rom, sizeof(rom_bank0));
|
memcpy(rom_bank0, rom, sizeof(rom_bank0));
|
||||||
ret = gb_init(&gb, &gb_rom_read, &gb_cart_ram_read,
|
ret = gb_init(&gb, &gb_rom_read, &gb_cart_ram_read,
|
||||||
&gb_cart_ram_write, &gb_error, NULL);
|
&gb_cart_ram_write, &gb_error, NULL);
|
||||||
puts_raw("GB INIT");
|
putstdio("GB ");
|
||||||
|
|
||||||
if(ret != GB_INIT_NO_ERROR)
|
if(ret != GB_INIT_NO_ERROR)
|
||||||
{
|
{
|
||||||
@@ -338,12 +341,15 @@ int main(void)
|
|||||||
|
|
||||||
#if ENABLE_LCD
|
#if ENABLE_LCD
|
||||||
gb_init_lcd(&gb, &lcd_draw_line);
|
gb_init_lcd(&gb, &lcd_draw_line);
|
||||||
|
putstdio("LCD ");
|
||||||
//gb.direct.interlace = 1;
|
//gb.direct.interlace = 1;
|
||||||
#endif
|
#endif
|
||||||
#if ENABLE_SOUND
|
#if ENABLE_SOUND
|
||||||
audio_init();
|
audio_init();
|
||||||
|
putstdio("AUDIO ");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
putstdio("\n> ");
|
||||||
uint_fast32_t frames = 0;
|
uint_fast32_t frames = 0;
|
||||||
uint64_t start_time = time_us_64();
|
uint64_t start_time = time_us_64();
|
||||||
while(1)
|
while(1)
|
||||||
|
|||||||
Reference in New Issue
Block a user