diff --git a/include/keypad.h b/include/keypad.h index 3dbebdf..5263a0d 100644 --- a/include/keypad.h +++ b/include/keypad.h @@ -28,6 +28,7 @@ * Starts a task to poll the buttons. Must be called before any keypad reading. */ void keypad_init(void); +void keypad_start(void); /** * Reads the last pressed key on the keypad. diff --git a/libinterp.a b/libinterp.a index c135dfc..f009932 100644 Binary files a/libinterp.a and b/libinterp.a differ diff --git a/link.ld b/link.ld index be1c523..b7adb78 100644 --- a/link.ld +++ b/link.ld @@ -35,31 +35,45 @@ SECTIONS { . = ALIGN(8); } > FLASH - /* code sections */ + /* other code sections */ .text : { . = ALIGN(8); *(.text) + *(.text*) + + *(.init) + *(.fini) . = ALIGN(8); } > FLASH - /* readonly data */ + /* read-only data sections */ .rodata : { . = ALIGN(8); *(.rodata) + *(.rodata*) + + *(.eh_frame) . = ALIGN(8); } > FLASH + /* ARM stuff */ + .ARM.exidx : { + *(.ARM.exidx) + } > FLASH + /* init_array/fini_array (TODO understand this) */ .init_array : { - PROVIDE_HIDDEN(__init_array_start = .); - KEEP(*(.init_array)) - PROVIDE_HIDDEN(__init_array_end = .); + __init_array_start = .; + KEEP(*(SORT(.init_array.*))) + KEEP(*(.init_array*)) + __init_array_end = .; } > FLASH .fini_array : { - PROVIDE_HIDDEN(__fini_array_start = .); - KEEP(*(.fini_array)) - PROVIDE_HIDDEN(__fini_array_end = .); + __fini_array_start = .; + KEEP(*(SORT(.fini_array.*))) + KEEP(*(.fini_array*)) + __fini_array_end = .; } > FLASH /* initialized data */ @@ -74,9 +88,10 @@ SECTIONS { /* uninitialized data */ .bss : { - . = ALIGN(8); + . = ALIGN(4); __bss_start__ = .; *(.bss) + . = ALIGN(4); __bss_end__ = .; } > RAM } diff --git a/src/keypad.c b/src/keypad.c index 06cef51..20a67c2 100644 --- a/src/keypad.c +++ b/src/keypad.c @@ -49,12 +49,12 @@ static const port_t keypad_cols[COLS] = { { COL_0 }, { COL_1 }, { COL_2 }, { COL_3 }, { COL_4 } }; -static const int keypad_map[ROWS][COLS] = { - { '7', '8', '9', 'x', '/' }, - { '4', '5', '6', 'y', '*' }, - { '3', '2', '1', 'z', '-' }, - { '.', '0', '\b', '\n', '+' } -}; +//static const int keypad_map[ROWS][COLS] = { +// { '7', '8', '9', 'x', '/' }, +// { '4', '5', '6', 'y', '*' }, +// { '3', '2', '1', 'z', '-' }, +// { '.', '0', '\b', '\n', '+' } +//}; #define BUFFER_SIZE 8 static char keypad_buffer = 'A';//[BUFFER_SIZE]; @@ -62,22 +62,22 @@ static char keypad_buffer = 'A';//[BUFFER_SIZE]; void keypad_task(void) { - unsigned int col = 0; + //unsigned int col = 0; while (1) { - gpio_dout(keypad_cols[col].port, keypad_cols[col].pin, 1); - for (unsigned int row = 0; row < ROWS; row++) { - if (gpio_din(keypad_rows[row].port, keypad_rows[row].pin)) { - //if (keypad_buffer_pos < BUFFER_SIZE) - keypad_buffer/*[++keypad_buffer_pos]*/ = keypad_map[row][col]; - while (gpio_din(keypad_rows[row].port, keypad_rows[row].pin)) - delay(1); - break; - } - } - gpio_dout(keypad_cols[col].port, keypad_cols[col].pin, 0); - col++; - if (col == COLS) - col = 0; + // gpio_dout(keypad_cols[col].port, keypad_cols[col].pin, 1); + // for (unsigned int row = 0; row < ROWS; row++) { + // if (gpio_din(keypad_rows[row].port, keypad_rows[row].pin)) { + // //if (keypad_buffer_pos < BUFFER_SIZE) + // keypad_buffer/*[++keypad_buffer_pos]*/ = keypad_map[row][col]; + // while (gpio_din(keypad_rows[row].port, keypad_rows[row].pin)) + // delay(1); + // break; + // } + // } + // gpio_dout(keypad_cols[col].port, keypad_cols[col].pin, 0); + // col++; + // if (col == COLS) + // col = 0; delay(10); } @@ -102,7 +102,10 @@ void keypad_init(void) gpio_speed(p, pin, VERYHIGH); gpio_dout(p, pin, 0); } +} +void keypad_start(void) +{ task_start(keypad_task, 1024); } diff --git a/src/main.c b/src/main.c index 1e9b58d..65fa1d3 100644 --- a/src/main.c +++ b/src/main.c @@ -74,7 +74,7 @@ void kmain(void) dsp_init(); dsp_rect(0, 0, LCD_WIDTH, LCD_HEIGHT, dsp_color(0, 0, 0)); dsp_cursoron(); - keypad_init(); + keypad_start(); task_start(task_interpreter, 4096); /*char buf[2];