#define SET_ANALOG_MODE()
+#define SET_COUPLING(x)
+
+#define SET_CALIBRATION_PULSE(x)
+
/* Toggle the 1kHz calibration pin, only accurate up to ca. 8MHz. */
#define TOGGLE_CALIBRATION_PIN() PA7 = !PA7
return TRUE;
}
+/**
+ * Each LSB in the nibble of the byte controls the coupling per channel.
+ *
+ * Setting PE3 disables AC coupling capacitor on CH0.
+ * Setting PE0 disables AC coupling capacitor on CH1.
+ */
+static void set_coupling(BYTE coupling_cfg)
+{
+ if (coupling_cfg & 0x01)
+ IOE |= 0x08;
+ else
+ IOE &= ~0x08;
+
+ if (coupling_cfg & 0x10)
+ IOE |= 0x01;
+ else
+ IOE &= ~0x01;
+}
+
static BOOL set_numchannels(BYTE numchannels)
{
if (numchannels == 1 || numchannels == 2) {
return TRUE;
}
+static BOOL set_calibration_pulse(BYTE fs)
+{
+ switch (fs) {
+ case 0: // 100Hz
+ RCAP2L = -10000 & 0xff;
+ RCAP2H = (-10000 & 0xff00) >> 8;
+ return TRUE;
+ case 1: // 1kHz
+ RCAP2L = -1000 & 0xff;
+ RCAP2H = (-1000 & 0xff00) >> 8;
+ return TRUE;
+ case 10: // 1kHz
+ RCAP2L = (BYTE)(-100 & 0xff);
+ RCAP2H = 0xff;
+ return TRUE;
+ case 50: // 50kHz
+ RCAP2L = (BYTE)(-20 & 0xff);
+ RCAP2H = 0xff;
+ return TRUE;
+ default:
+ return FALSE;
+ }
+}
+
/* Set *alt_ifc to the current alt interface for ifc. */
BOOL handle_get_interface(BYTE ifc, BYTE *alt_ifc)
{
ledcounter = 1000;
/* Clear EP0BCH/L for each valid command. */
- if (cmd >= 0xe0 && cmd <= 0xe4) {
+ if (cmd >= 0xe0 && cmd <= 0xe6) {
EP0BCH = 0;
EP0BCL = 0;
while (EP0CS & bmEPBUSY);
case 0xe4:
set_numchannels(EP0BUF[0]);
return TRUE;
+ case 0xe5:
+ SET_COUPLING(EP0BUF[0]);
+ return TRUE;
+ case 0xe6:
+ SET_CALIBRATION_PULSE(EP0BUF[0]);
+ return TRUE;
}
return FALSE; /* Not handled by handlers. */
#define SET_ANALOG_MODE() PA7 = 1
+#define SET_COUPLING(x)
+
+#define SET_CALIBRATION_PULSE(x)
+
/* Toggle the 1kHz calibration pin, only accurate up to ca. 8MHz. */
#define TOGGLE_CALIBRATION_PIN() PC2 = !PC2
return TRUE;
}
+/**
+ * Each LSB in the nibble of the byte controls the coupling per channel.
+ *
+ * Setting PE3 disables AC coupling capacitor on CH0.
+ * Setting PE0 disables AC coupling capacitor on CH1.
+ */
+static void set_coupling(BYTE coupling_cfg)
+{
+ if (coupling_cfg & 0x01)
+ IOE |= 0x08;
+ else
+ IOE &= ~0x08;
+
+ if (coupling_cfg & 0x10)
+ IOE |= 0x01;
+ else
+ IOE &= ~0x01;
+}
+
static BOOL set_numchannels(BYTE numchannels)
{
if (numchannels == 1 || numchannels == 2) {
return TRUE;
}
+static BOOL set_calibration_pulse(BYTE fs)
+{
+ switch (fs) {
+ case 0: // 100Hz
+ RCAP2L = -10000 & 0xff;
+ RCAP2H = (-10000 & 0xff00) >> 8;
+ return TRUE;
+ case 1: // 1kHz
+ RCAP2L = -1000 & 0xff;
+ RCAP2H = (-1000 & 0xff00) >> 8;
+ return TRUE;
+ case 10: // 1kHz
+ RCAP2L = (BYTE)(-100 & 0xff);
+ RCAP2H = 0xff;
+ return TRUE;
+ case 50: // 50kHz
+ RCAP2L = (BYTE)(-20 & 0xff);
+ RCAP2H = 0xff;
+ return TRUE;
+ default:
+ return FALSE;
+ }
+}
+
/* Set *alt_ifc to the current alt interface for ifc. */
BOOL handle_get_interface(BYTE ifc, BYTE *alt_ifc)
{
ledcounter = 1000;
/* Clear EP0BCH/L for each valid command. */
- if (cmd >= 0xe0 && cmd <= 0xe4) {
+ if (cmd >= 0xe0 && cmd <= 0xe6) {
EP0BCH = 0;
EP0BCL = 0;
while (EP0CS & bmEPBUSY);
case 0xe4:
set_numchannels(EP0BUF[0]);
return TRUE;
+ case 0xe5:
+ SET_COUPLING(EP0BUF[0]);
+ return TRUE;
+ case 0xe6:
+ SET_CALIBRATION_PULSE(EP0BUF[0]);
+ return TRUE;
}
return FALSE; /* Not handled by handlers. */
#define SET_ANALOG_MODE() PA7 = 1
+#define SET_COUPLING(x) set_coupling(x)
+
+#define SET_CALIBRATION_PULSE(x) set_calibration_pulse(x)
+
/* Toggle the 1kHz calibration pin, only accurate up to ca. 8MHz. */
/* Note: There's no PE2 as IOE is not bit-addressable (see TRM 15.2). */
#define TOGGLE_CALIBRATION_PIN() IOE = IOE ^ 0x04
set_numchannels(EP0BUF[0]);
return TRUE;
case 0xe5:
- set_coupling(EP0BUF[0]);
+ SET_COUPLING(EP0BUF[0]);
return TRUE;
case 0xe6:
- set_calibration_pulse(EP0BUF[0]);
+ SET_CALIBRATION_PULSE(EP0BUF[0]);
return TRUE;
}