summaryrefslogtreecommitdiff
path: root/openpcd/firmware/src/ssc.c
diff options
context:
space:
mode:
Diffstat (limited to 'openpcd/firmware/src/ssc.c')
-rw-r--r--openpcd/firmware/src/ssc.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/openpcd/firmware/src/ssc.c b/openpcd/firmware/src/ssc.c
index c9deb79..e79eda8 100644
--- a/openpcd/firmware/src/ssc.c
+++ b/openpcd/firmware/src/ssc.c
@@ -11,7 +11,9 @@
#include <errno.h>
#include <sys/types.h>
#include <lib_AT91SAM7.h>
+#include <openpcd.h>
+#include "usb_handler.h"
#include "openpcd.h"
#include "dbgu.h"
@@ -24,6 +26,15 @@ struct ssc_state {
static struct ssc_state ssc_state;
+static struct openpcd_hdr opcd_ssc_hdr = {
+ .cmd = OPENPCD_CMD_SSC_READ,
+};
+
+static inline void init_opcdhdr(struct req_ctx *rctx)
+{
+ memcpy(&rctx->tx.data[0], rctx, sizeof(rctx));
+}
+
/* Try to refill RX dma descriptors. Return values:
* 0) no dma descriptors empty
* 1) filled next/secondary descriptor
@@ -42,6 +53,7 @@ static int8_t ssc_rx_refill(void)
}
if (AT91F_PDC_IsRxEmpty(rx_pdc)) {
+ init_opcdhdr(rctx);
DEBUGPCRF("filling primary SSC RX dma ctx");
AT91F_PDC_SetRx(rx_pdc, &rctx->rx.data[MAX_HDRSIZE],
MAX_REQSIZE);
@@ -58,6 +70,7 @@ static int8_t ssc_rx_refill(void)
if (AT91F_PDC_IsNextRxEmpty(rx_pdc)) {
DEBUGPCRF("filling secondary SSC RX dma ctx");
+ init_opcdhdr(rctx);
AT91F_PDC_SetNextRx(rx_pdc, &rctx->rx.data[MAX_HDRSIZE],
MAX_REQSIZE);
ssc_state.rx_ctx[1] = rctx;
@@ -131,6 +144,23 @@ void ssc_tx_init(void)
0);
}
+static int ssc_usb_in(struct req_ctx *rctx)
+{
+ struct openpcd_hdr *poh = (struct openpcd_hdr *) &rctx->rx.data[0];
+ struct openpcd_hdr *pih = (struct openpcd_hdr *) &rctx->tx.data[0];
+
+ /* FIXME: implement this */
+ switch (poh->cmd) {
+ case OPENPCD_CMD_SSC_READ:
+ break;
+ case OPENPCD_CMD_SSC_WRITE:
+ break;
+ }
+
+ req_ctx_put(rctx);
+ return -EINVAL;
+}
+
void ssc_rx_init(void)
{
rx_pdc = (AT91PS_PDC) &(ssc->SSC_RPR);
@@ -156,10 +186,13 @@ void ssc_rx_init(void)
AT91F_SSC_EnableIt(ssc, AT91C_SSC_OVRUN |
AT91C_SSC_ENDRX | AT91C_SSC_RXBUFF);
AT91F_PDC_EnableRx(rx_pdc);
+
+ usb_hdlr_register(&ssc_usb_in, OPENPCD_CMD_CLS_SSC);
}
void ssc_fini(void)
{
+ usb_hdlr_unregister(OPENPCD_CMD_CLS_SSC);
AT91F_PDC_DisableRx(rx_pdc);
AT91F_SSC_DisableTx(ssc);
AT91F_SSC_DisableRx(ssc);
personal git repositories of Harald Welte. Your mileage may vary