diff --git a/apps/iap/iap-core.c b/apps/iap/iap-core.c index e3f992924f..da58d49ff8 100644 --- a/apps/iap/iap-core.c +++ b/apps/iap/iap-core.c @@ -306,14 +306,14 @@ void iap_reset_auth(struct auth_t* auth) auth->next_section = 0; } -void iap_reset_state(int port) +void iap_reset_state(IF_IAP_MP_NONVOID(int port)) { if (!iap_running) return; /* 0 is dock, 1 is headphone. This is for when we eventually maintain independent state */ - (void)port; + IF_IAP_MP((void)port); iap_reset_device(&device); iap_bitrate_set(global_settings.serial_bitrate); @@ -593,7 +593,7 @@ void iap_send_pkt(const unsigned char * data, const int len) iap_send_tx(); } -bool iap_getc(const unsigned char x) +bool iap_getc(IF_IAP_MP(int port,) const unsigned char x) { struct state_t *s = &frame_state; static long pkt_timeout; @@ -606,7 +606,7 @@ bool iap_getc(const unsigned char x) /* Packet timeouts only make sense while not waiting for the * sync byte */ s->state = ST_SYNC; - return iap_getc(x); + return iap_getc(IF_IAP_MP(port,) x); } @@ -633,7 +633,7 @@ bool iap_getc(const unsigned char x) s->state = ST_LEN; } else { s->state = ST_SYNC; - return iap_getc(x); + return iap_getc(IF_IAP_MP(port,) x); } break; case ST_LEN: diff --git a/firmware/drivers/button.c b/firmware/drivers/button.c index b04598d995..b55bfb3192 100644 --- a/firmware/drivers/button.c +++ b/firmware/drivers/button.c @@ -109,7 +109,7 @@ static int hp_detect_callback(struct timeout *tmo) #if defined(IPOD_ACCESSORY_PROTOCOL) && (defined(IPOD_COLOR) || defined(IPOD_4G) || defined(IPOD_MINI) || defined(IPOD_MINI2G)) if (id == SYS_PHONE_UNPLUGGED) - iap_reset_state(1); + iap_reset_state(IF_IAP_MP(1)); #endif return 0; diff --git a/firmware/export/config/ipod4g.h b/firmware/export/config/ipod4g.h index 74cba5f228..6082213dd8 100644 --- a/firmware/export/config/ipod4g.h +++ b/firmware/export/config/ipod4g.h @@ -213,6 +213,7 @@ #define ICODE_ATTR_TREMOR_NOT_MDCT #define IPOD_ACCESSORY_PROTOCOL +#define HAVE_IAP_MULTIPORT #define HAVE_SERIAL #define IRAM_LCDFRAMEBUFFER IBSS_ATTR /* put the lcd frame buffer in IRAM */ diff --git a/firmware/export/config/ipodcolor.h b/firmware/export/config/ipodcolor.h index ea7162762a..071084ac8c 100644 --- a/firmware/export/config/ipodcolor.h +++ b/firmware/export/config/ipodcolor.h @@ -200,9 +200,9 @@ #define ICODE_ATTR_TREMOR_NOT_MDCT #define IPOD_ACCESSORY_PROTOCOL +#define HAVE_IAP_MULTIPORT #define HAVE_SERIAL - /* DMA is used only for reading on PP502x because although reads are ~8x faster * writes appear to be ~25% slower. */ diff --git a/firmware/export/config/ipodmini1g.h b/firmware/export/config/ipodmini1g.h index 1a1e9b4cf2..358589b413 100644 --- a/firmware/export/config/ipodmini1g.h +++ b/firmware/export/config/ipodmini1g.h @@ -206,6 +206,7 @@ #define ICODE_ATTR_TREMOR_NOT_MDCT #define IPOD_ACCESSORY_PROTOCOL +#define HAVE_IAP_MULTIPORT #define HAVE_SERIAL #define IRAM_LCDFRAMEBUFFER IBSS_ATTR /* put the lcd frame buffer in IRAM */ diff --git a/firmware/export/config/ipodmini2g.h b/firmware/export/config/ipodmini2g.h index 7dd62e716d..382612a7ca 100644 --- a/firmware/export/config/ipodmini2g.h +++ b/firmware/export/config/ipodmini2g.h @@ -210,6 +210,7 @@ #define ICODE_ATTR_TREMOR_NOT_MDCT #define IPOD_ACCESSORY_PROTOCOL +#define HAVE_IAP_MULTIPORT #define HAVE_SERIAL #define IRAM_LCDFRAMEBUFFER IBSS_ATTR /* put the lcd frame buffer in IRAM */ diff --git a/firmware/export/iap.h b/firmware/export/iap.h index 8463ecba29..cd793937d7 100644 --- a/firmware/export/iap.h +++ b/firmware/export/iap.h @@ -27,7 +27,15 @@ /* This is the entire frame length, sync, length, payload and checksum */ #define TX_BUFLEN 128 -extern bool iap_getc(unsigned char x); +#ifdef HAVE_IAP_MULTIPORT +#define IF_IAP_MP(x...) x +#define IF_IAP_MP_NONVOID(x...) x +#else +#define IF_IAP_MP(x...) +#define IF_IAP_MP_NONVOID(x...) void +#endif + +extern bool iap_getc(IF_IAP_MP(int port,) unsigned char x); extern void iap_setup(int ratenum); extern void iap_bitrate_set(int ratenum); extern void iap_periodic(void); @@ -37,6 +45,6 @@ const unsigned char *iap_get_serbuf(void); #ifdef HAVE_LINE_REC extern bool iap_record(bool onoff); #endif -void iap_reset_state(int port); /* 0 is dock, 1 is headphone */ +void iap_reset_state(IF_IAP_MP_NONVOID(int port) ); /* 0 is dock, 1 is headphone */ bool dbg_iap(void); #endif diff --git a/firmware/target/arm/pp/uart-pp.c b/firmware/target/arm/pp/uart-pp.c index e51c680053..b41e901569 100644 --- a/firmware/target/arm/pp/uart-pp.c +++ b/firmware/target/arm/pp/uart-pp.c @@ -188,11 +188,12 @@ void SERIAL_ISR(int port) static bool newpkt = true; char temp; -#if defined(IPOD_COLOR) || defined(IPOD_4G) || defined(IPOD_MINI) || defined(IPOD_MINI2G) +#ifdef HAVE_IAP_MULTIPORT if (port && SERn != &SER1) SERn = &SER1; else if (!port && SERn != &SER0) SERn = &SER0; + port = !port; /* UART0 is headphone, ie IAP1 */ #else (void)port; #endif @@ -261,7 +262,7 @@ void SERIAL_ISR(int port) } } } - bool pkt = iap_getc(temp); + bool pkt = iap_getc(IF_IAP_MP(port,) temp); if(newpkt && !pkt) SERn->autobaud = 0; /* Found good baud */ newpkt = pkt; diff --git a/firmware/target/arm/s5l8700/ipodnano2g/serial-nano2g.c b/firmware/target/arm/s5l8700/ipodnano2g/serial-nano2g.c index df7a69abee..ac30836853 100644 --- a/firmware/target/arm/s5l8700/ipodnano2g/serial-nano2g.c +++ b/firmware/target/arm/s5l8700/ipodnano2g/serial-nano2g.c @@ -180,7 +180,7 @@ void iap_rx_isr(int len, char *data, char *err, uint32_t abr_cnt) uartc_port_set_rx_mode(&ser_port, UCON_MODE_INTREQ); /* enter SOF state */ - iap_getc(0xff); + iap_getc(IF_IAP_MP(0,) 0xff); abr_status = ABR_STATUS_SYNCING; sync_retry = 2; /* we are expecting [0xff] 0x55 */ @@ -190,7 +190,7 @@ void iap_rx_isr(int len, char *data, char *err, uint32_t abr_cnt) /* process received data */ while (len--) { - bool sync_done = !iap_getc(*data++); + bool sync_done = !iap_getc(IF_IAP_MP(0,) *data++); if (abr_status == ABR_STATUS_SYNCING) { diff --git a/firmware/target/arm/s5l8702/ipod6g/serial-6g.c b/firmware/target/arm/s5l8702/ipod6g/serial-6g.c index fa74ece37c..c08107c096 100644 --- a/firmware/target/arm/s5l8702/ipod6g/serial-6g.c +++ b/firmware/target/arm/s5l8702/ipod6g/serial-6g.c @@ -220,7 +220,7 @@ static void iap_rx_isr(int len, char *data, char *err, uint32_t abr_cnt) uartc_port_set_rx_mode(&ser_port, UCON_MODE_INTREQ); /* enter SOF state */ - iap_getc(0xff); + iap_getc(IF_IAP_MP(0,) 0xff); abr_status = ABR_STATUS_SYNCING; sync_retry = 2; /* we are expecting [0xff] 0x55 */ @@ -230,7 +230,7 @@ static void iap_rx_isr(int len, char *data, char *err, uint32_t abr_cnt) /* process received data */ while (len--) { - bool sync_done = !iap_getc(*data++); + bool sync_done = !iap_getc(IF_IAP_MP(0,) *data++); if (abr_status == ABR_STATUS_SYNCING) { diff --git a/firmware/target/arm/s5l8702/ipodnano3g/serial-nano3g.c b/firmware/target/arm/s5l8702/ipodnano3g/serial-nano3g.c index fa74ece37c..c08107c096 100644 --- a/firmware/target/arm/s5l8702/ipodnano3g/serial-nano3g.c +++ b/firmware/target/arm/s5l8702/ipodnano3g/serial-nano3g.c @@ -220,7 +220,7 @@ static void iap_rx_isr(int len, char *data, char *err, uint32_t abr_cnt) uartc_port_set_rx_mode(&ser_port, UCON_MODE_INTREQ); /* enter SOF state */ - iap_getc(0xff); + iap_getc(IF_IAP_MP(0,) 0xff); abr_status = ABR_STATUS_SYNCING; sync_retry = 2; /* we are expecting [0xff] 0x55 */ @@ -230,7 +230,7 @@ static void iap_rx_isr(int len, char *data, char *err, uint32_t abr_cnt) /* process received data */ while (len--) { - bool sync_done = !iap_getc(*data++); + bool sync_done = !iap_getc(IF_IAP_MP(0,) *data++); if (abr_status == ABR_STATUS_SYNCING) { diff --git a/firmware/target/arm/s5l8702/ipodnano4g/serial-nano4g.c b/firmware/target/arm/s5l8702/ipodnano4g/serial-nano4g.c index 7e0bffa201..03b9a61024 100644 --- a/firmware/target/arm/s5l8702/ipodnano4g/serial-nano4g.c +++ b/firmware/target/arm/s5l8702/ipodnano4g/serial-nano4g.c @@ -220,7 +220,7 @@ static void iap_rx_isr(int len, char *data, char *err, uint32_t abr_cnt) uartc_port_set_rx_mode(&ser_port, UCON_MODE_INTREQ); /* enter SOF state */ - iap_getc(0xff); + iap_getc(IF_IAP_MP(0,) 0xff); abr_status = ABR_STATUS_SYNCING; sync_retry = 2; /* we are expecting [0xff] 0x55 */ @@ -230,7 +230,7 @@ static void iap_rx_isr(int len, char *data, char *err, uint32_t abr_cnt) /* process received data */ while (len--) { - bool sync_done = !iap_getc(*data++); + bool sync_done = !iap_getc(IF_IAP_MP(0,) *data++); if (abr_status == ABR_STATUS_SYNCING) { diff --git a/firmware/usb.c b/firmware/usb.c index 5894213fb7..ed8c08af66 100644 --- a/firmware/usb.c +++ b/firmware/usb.c @@ -526,7 +526,7 @@ static void NORETURN_ATTR usb_thread(void) usb_stack_enable(false); #ifdef IPOD_ACCESSORY_PROTOCOL - iap_reset_state(0); + iap_reset_state(IF_IAP_MP(0)); #endif /* Only disable the USB slave mode if we really have enabled