#include <stdint.h> // uintX_t
#include <unistd.h>
-#define BUFF_SMALL 32
-#define BUFF_MID 256
-#define min(a, b) ((a) > (b) ? (b) : (a))
+#define BUFF_SMALL 32
+#define BUFF_MID 256
+#define min(a, b) ((a) > (b) ? (b) : (a))
/* Hardware specific */
-#define DOUT_reg 0x10
-
-#define BAR0_offset (0 * sysconf(_SC_PAGESIZE))
-#define BAR2_offset (1 * sysconf(_SC_PAGESIZE))
-#define BAR4_offset (2 * sysconf(_SC_PAGESIZE))
+#define GPIOC_reg 0x54
+#define DOUT_reg 0x10
+#define DA0_reg 0x20
+#define DA1_reg 0x22
+#define DA2_reg 0x24
+#define DA3_reg 0x26
+#define DA4_reg 0x28
+#define DA5_reg 0x2A
+#define DA6_reg 0x2C
+#define DA7_reg 0x2E
+
+#define GPIOC_DACEN_mask (1 << 26)
+#define GPIOC_LDAC_mask (1 << 23)
+
+#define BAR0_offset (0 * sysconf(_SC_PAGESIZE))
+#define BAR2_offset (1 * sysconf(_SC_PAGESIZE))
+#define BAR4_offset (2 * sysconf(_SC_PAGESIZE))
+
+typedef enum {DA0, DA1} dac_channel_t;
int status;
void* mf624_BAR0 = NULL;
*(volatile uint32_t*) ptr = val;
}
-void DIO_set(int16_t val)
+void DIO_write(int16_t val)
{
- mf624_write16(val, ((uint16_t*) mf624_BAR2) + (DOUT_reg/2));
+ mf624_write16(val, mf624_BAR2 + DOUT_reg);
}
uint16_t DIO_read()
{
- return mf624_read16(((uint16_t*) mf624_BAR2) + (DOUT_reg/2)) & 0xF;
+ return mf624_read16(mf624_BAR2 + DOUT_reg) & 0xF;
+}
+
+void DAC_enable()
+{
+ mf624_write16(mf624_read16(mf624_BAR2 + GPIOC_reg)
+ | GPIOC_DACEN_mask
+ & ~GPIOC_LDAC_mask,
+ mf624_BAR2 + GPIOC_reg);
+}
+
+void DAC_write(dac_channel_t channel, int val) {
+ switch (channel) {
+ case DA0:
+ mf624_write16(val, mf624_BAR2 + DA0_reg);
+ break;
+ case DA1:
+ mf624_write16(val, mf624_BAR2 + DA1_reg);
+ break;
+ default:
+ printf("FFFUUU!\n");
+ }
+
+
+
}
int open_device(char* path) {
mmap_regions(device_fd, argv[1]);
if (device_fd != -1) {
+ DAC_enable();
+
while (1){
printf("Reading DIO = ");
print_8bin(DIO_read());
-
+ sleep(1);
+
+ printf("Setting DA0 to 10 V\n");
+ DAC_write(DA0, 0x3FFF);
+ sleep(1);
+
printf("Setting DIO to 0xff\n");
- DIO_set(0xff);
+ DIO_write(0xff);
sleep(1);
printf("Setting DIO to 0x00\n");
- DIO_set(0x00);
+ DIO_write(0x00);
+ sleep(1);
+
+ printf("Setting DA0 to 5 V\n");
+ DAC_write(DA0, 0x3000);
sleep(1);
+
+ printf("----------------------\n\n");
}
}