serial: Disable optimization to fix code

Building with -O2 or -Os causes serial to not work.

Signed-off-by: Sean Cross <xobs@kosagi.com>
This commit is contained in:
Sean Cross 2014-12-30 17:14:11 +08:00
parent 8fe8d061f4
commit b4232c3641

View file

@ -96,7 +96,8 @@ static void uart_setreg(int regnum, uint8_t val)
int serial_putc(uint8_t c) int serial_putc(uint8_t c)
{ {
/* Wait for UART to be empty */ /* Wait for UART to be empty */
while (! (uart_getreg(UART_LSR) & 0x20)); while (! (uart_getreg(UART_LSR) & 0x20))
asm("");
uart_setreg(UART_RBR, c); uart_setreg(UART_RBR, c);
return 0; return 0;
@ -104,7 +105,8 @@ int serial_putc(uint8_t c)
uint8_t serial_getc(void) uint8_t serial_getc(void)
{ {
while (! (uart_getreg(UART_LSR) & 0x01)); while (! (uart_getreg(UART_LSR) & 0x01))
asm("");
return uart_getreg(UART_RBR); return uart_getreg(UART_RBR);
} }
@ -155,10 +157,12 @@ void serial_init(void)
#include "fernvale-usb.h" #include "fernvale-usb.h"
static uint8_t *recv_bfr = (uint8_t *)0x70000000; static volatile uint8_t *recv_bfr = (uint8_t *)0x70000000;
static int recv_size = 0; static int recv_size = 0;
static int recv_offset = 0; static int recv_offset = 0;
#pragma GCC optimize ("-O1")
static void usb_receive_wait(uint8_t endpoint_number) static void usb_receive_wait(uint8_t endpoint_number)
{ {
/* Wait for data to exist, ignoring other USB IRQs */ /* Wait for data to exist, ignoring other USB IRQs */
@ -172,7 +176,8 @@ static void usb_receive_wait(uint8_t endpoint_number)
writeb(readb(USB_CTRL_EP_INCSR2) & ~USB_CTRL_EP_INCSR2_MODE, writeb(readb(USB_CTRL_EP_INCSR2) & ~USB_CTRL_EP_INCSR2_MODE,
USB_CTRL_EP_INCSR2); USB_CTRL_EP_INCSR2);
while (!readb(USB_CTRL_EP_OUTCSR1 & USB_CTRL_EP_OUTCSR1_RXPKTRDY)); while (!readb(USB_CTRL_EP_OUTCSR1 & USB_CTRL_EP_OUTCSR1_RXPKTRDY))
asm("");
recv_size = (readb(USB_CTRL_EP_COUNT1) << 0) & 0x00ff; recv_size = (readb(USB_CTRL_EP_COUNT1) << 0) & 0x00ff;
recv_size |= (readb(USB_CTRL_EP_COUNT2) << 8) & 0xff00; recv_size |= (readb(USB_CTRL_EP_COUNT2) << 8) & 0xff00;
@ -217,7 +222,7 @@ int serial_putc(uint8_t c)
{ {
/* Wait for the bus to be idle, so we don't double-xmit */ /* Wait for the bus to be idle, so we don't double-xmit */
while (readb(USB_CTRL_INTRIN)) while (readb(USB_CTRL_INTRIN))
; asm("");
/* Select EP1 */ /* Select EP1 */
writeb(1, USB_CTRL_INDEX); writeb(1, USB_CTRL_INDEX);
@ -228,7 +233,7 @@ int serial_putc(uint8_t c)
/* Wait for the character to transmit, so we don't double-xmit */ /* Wait for the character to transmit, so we don't double-xmit */
while (!readb(USB_CTRL_INTRIN)) while (!readb(USB_CTRL_INTRIN))
; asm("");
return 0; return 0;
} }