aboutsummaryrefslogtreecommitdiffstats
path: root/src/pru
diff options
context:
space:
mode:
authorKevin O'Connor <kevin@koconnor.net>2017-07-12 20:02:23 -0400
committerKevin O'Connor <kevin@koconnor.net>2017-07-17 11:16:55 -0400
commit3ac60b31a2efe736a9bb4bcb245ff81845fa902e (patch)
tree1ecc24f3fa049df406fd43769599afa72b796215 /src/pru
parentc105ff1c51136d43c054ccedd81ed8a557e60804 (diff)
downloadkutter-3ac60b31a2efe736a9bb4bcb245ff81845fa902e.tar.gz
kutter-3ac60b31a2efe736a9bb4bcb245ff81845fa902e.tar.xz
kutter-3ac60b31a2efe736a9bb4bcb245ff81845fa902e.zip
pru: Move peripheral init from pru0 to pru1
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Diffstat (limited to 'src/pru')
-rw-r--r--src/pru/adc.c36
-rw-r--r--src/pru/main.c2
-rw-r--r--src/pru/pru0.c44
3 files changed, 37 insertions, 45 deletions
diff --git a/src/pru/adc.c b/src/pru/adc.c
index 64d4fcb4..8f5874c8 100644
--- a/src/pru/adc.c
+++ b/src/pru/adc.c
@@ -18,14 +18,46 @@
DECL_CONSTANT(ADC_MAX, 4095);
+static void
+adc_full_reset(void)
+{
+ static uint8_t have_done_reset;
+ if (have_done_reset)
+ return;
+ have_done_reset = 1;
+
+ // Disable ADC
+ ADC->ctrl = (1<<2);
+ barrier();
+ // Clear registers
+ ADC->irqstatus = 0xffffffff;
+ ADC->irqenable_clr = 0xffffffff;
+ ADC->dmaenable_clr = 0xffffffff;
+ ADC->adc_clkdiv = 0;
+ ADC->stepenable = 0;
+ ADC->idleconfig = 0;
+ int i;
+ for (i=0; i<8; i++) {
+ ADC->step[i].config = i<<19;
+ ADC->step[i].delay = 0;
+ }
+ // Enable ADC
+ writel(&ADC->ctrl, 0x07);
+ // Drain fifo
+ while (readl(&ADC->fifo0count))
+ readl(&ADC->fifo0data);
+
+ if (!readl(&ADC->ctrl))
+ shutdown("ADC module not enabled");
+}
+
struct gpio_adc
gpio_adc_setup(uint8_t pin)
{
uint8_t chan = pin - 4 * 32;
if (chan >= 8)
shutdown("Not an adc channel");
- if (!readl(&ADC->ctrl))
- shutdown("ADC module not enabled");
+ adc_full_reset();
return (struct gpio_adc){ .chan = chan };
}
diff --git a/src/pru/main.c b/src/pru/main.c
index 40327b39..3ead0bde 100644
--- a/src/pru/main.c
+++ b/src/pru/main.c
@@ -89,6 +89,8 @@ DECL_SHUTDOWN(timer_shutdown);
void
timer_init(void)
{
+ CT_IEP.TMR_CMP_CFG = 0x01 << 1;
+ CT_IEP.TMR_GLB_CFG = 0x11;
CT_IEP.TMR_CNT = 0;
timer_shutdown();
}
diff --git a/src/pru/pru0.c b/src/pru/pru0.c
index ae33ad6b..3a8fd421 100644
--- a/src/pru/pru0.c
+++ b/src/pru/pru0.c
@@ -9,7 +9,6 @@
#include <string.h> // memset
#include <pru/io.h> // write_r31
#include <pru_cfg.h> // CT_CFG
-#include <pru_iep.h> // CT_IEP
#include <pru_intc.h> // CT_INTC
#include <pru_rpmsg.h> // pru_rpmsg_send
#include <pru_virtio_ids.h> // VIRTIO_ID_RPMSG
@@ -188,43 +187,6 @@ console_sendf(const struct command_encoder *ce, va_list args)
/****************************************************************
- * Peripheral reset
- ****************************************************************/
-
-static void
-timer_reset(void)
-{
- CT_IEP.TMR_CMP_CFG = 0x01 << 1;
- CT_IEP.TMR_GLB_CFG = 0x11;
-}
-
-static void
-adc_reset(void)
-{
- // Disable ADC
- ADC->ctrl = (1<<2);
- barrier();
- // Clear registers
- ADC->irqstatus = 0xffffffff;
- ADC->irqenable_clr = 0xffffffff;
- ADC->dmaenable_clr = 0xffffffff;
- ADC->adc_clkdiv = 0;
- ADC->stepenable = 0;
- ADC->idleconfig = 0;
- int i;
- for (i=0; i<8; i++) {
- ADC->step[i].config = i<<19;
- ADC->step[i].delay = 0;
- }
- // Enable ADC
- writel(&ADC->ctrl, 0x07);
- // Drain fifo
- while (readl(&ADC->fifo0count))
- readl(&ADC->fifo0data);
-}
-
-
-/****************************************************************
* Resource table
****************************************************************/
@@ -365,12 +327,8 @@ main(void)
, CHAN_DESC, CHAN_PORT) != PRU_RPMSG_SUCCESS)
;
- // Reset peripherals
- memset(SHARED_MEM, 0, sizeof(*SHARED_MEM));
- timer_reset();
- adc_reset();
-
// Wait for PRU1 to be ready
+ memset(SHARED_MEM, 0, sizeof(*SHARED_MEM));
writel(&SHARED_MEM->signal, SIGNAL_PRU0_WAITING);
while (readl(&SHARED_MEM->signal) != SIGNAL_PRU1_READY)
;