]> rtime.felk.cvut.cz Git - mf6xx.git/commitdiff
Added function for setting DAC. Tested, Working.
authorRostislav Lisovy <lisovy@gmail.com>
Wed, 6 Apr 2011 19:30:12 +0000 (21:30 +0200)
committerRostislav Lisovy <lisovy@gmail.com>
Wed, 6 Apr 2011 19:30:12 +0000 (21:30 +0200)
src/uio/mf624/userspace/test_application/main.c

index 226528649bd713d78eb06cbfb6381b20b5f2d8d2..0e94f1e773738021e3e3776bbe589e84fbb118ac 100755 (executable)
 #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;
@@ -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");
                }
        }