X-Git-Url: https://rtime.felk.cvut.cz/gitweb/mf6xx.git/blobdiff_plain/3651b4fa13002f0ca9bc6b4e36746ad9af0c86a9..27952a053f53f2e60a42083256942b30f9531329:/src/uio/mf624/userspace/test_application/main.c diff --git a/src/uio/mf624/userspace/test_application/main.c b/src/uio/mf624/userspace/test_application/main.c index 2265286..0e94f1e 100755 --- a/src/uio/mf624/userspace/test_application/main.c +++ b/src/uio/mf624/userspace/test_application/main.c @@ -10,16 +10,30 @@ #include // uintX_t #include -#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; @@ -58,14 +72,38 @@ static inline void mf624_write32(uint32_t val, uint32_t *ptr) *(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) { @@ -292,18 +330,31 @@ int main(int argc, char* argv[]) 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"); } }