From ac50e6ad8f2b22280368106e148b4e32214ea04d Mon Sep 17 00:00:00 2001 From: krecmich Date: Mon, 10 Jun 2013 12:21:12 +0200 Subject: [PATCH 1/1] First version of s-functions needed for opertaing mf624. Signed-off-by: krecmich --- mf624.c | 530 +++++++++++++++++++++++++++ mf624.c~ | 530 +++++++++++++++++++++++++++ mf624.h | 82 +++++ mf624.h~ | 80 ++++ mf624.mexa64 | Bin 0 -> 36939 bytes sfAnalogInput.c | 224 +++++++++++ sfAnalogInput.mexa64 | Bin 0 -> 36939 bytes sfAnalogOutput.c | 258 +++++++++++++ sfAnalogOutput.mexa64 | Bin 0 -> 35975 bytes sfuntmpl_basic.c | 221 +++++++++++ slprj/ert/test/tmwinternal/minfo.mat | Bin 0 -> 1471 bytes slprj/sl_proj.tmw | 2 + test | Bin 0 -> 191851 bytes test.mat | Bin 0 -> 2600 bytes test.slx | Bin 0 -> 10823 bytes test_ert_rtw/build_exception.mat | Bin 0 -> 1733 bytes 16 files changed, 1927 insertions(+) create mode 100644 mf624.c create mode 100644 mf624.c~ create mode 100644 mf624.h create mode 100644 mf624.h~ create mode 100755 mf624.mexa64 create mode 100644 sfAnalogInput.c create mode 100755 sfAnalogInput.mexa64 create mode 100644 sfAnalogOutput.c create mode 100755 sfAnalogOutput.mexa64 create mode 100644 sfuntmpl_basic.c create mode 100644 slprj/ert/test/tmwinternal/minfo.mat create mode 100644 slprj/sl_proj.tmw create mode 100755 test create mode 100644 test.mat create mode 100644 test.slx create mode 100644 test_ert_rtw/build_exception.mat diff --git a/mf624.c b/mf624.c new file mode 100644 index 0000000..2575756 --- /dev/null +++ b/mf624.c @@ -0,0 +1,530 @@ +/* + * Application using MF624 UIO driver + * + * Copyright (C) 2011 Rostislav Lisovy + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include // uintX_t +#include +#include +#include + +#include "mf624.h" + +/****************************************************************/ + + +int bar_mapping_fill(bar_mapping_t *barmap, const char *uio_dev, int map_nr) +{ + FILE *file; + void *s; + int ssiz; + static size_t page_size; + + page_size = sysconf(_SC_PAGESIZE); + + ssiz = snprintf(NULL, 0, "/sys/class/uio/%s/maps/map%i/", uio_dev, map_nr); + if (ssiz < 0) + return -1; + /* add reserve to store each size addr, name, offset, size */ + ssiz += 6 + 1; + s = alloca(ssiz); + + snprintf(s, ssiz, "/sys/class/uio/%s/maps/map%i/addr", uio_dev, map_nr); + file = fopen(s, "rb"); + if (file == NULL) + return -1; + fscanf(file, "%"SCNiPTR, &barmap->phys_addr); + fclose(file); + + snprintf(s, ssiz, "/sys/class/uio/%s/maps/map%i/offset", uio_dev, map_nr); + file = fopen(s, "rb"); + if (file == NULL) { + barmap->offset = barmap->phys_addr & (page_size - 1); + } else { + fscanf(file, "%"SCNi32, &barmap->offset); + fclose(file); + } + + snprintf(s, ssiz, "/sys/class/uio/%s/maps/map%i/size", uio_dev, map_nr); + file = fopen(s, "rb"); + if (file == NULL) + return -1; + fscanf(file, "%"SCNi32, &barmap->size); + fclose(file); + + barmap->mmap_offset = page_size * map_nr + barmap->offset; + + return 0; +} + +int bar_mapping_setup(bar_mapping_t *barmap, int device_fd) +{ + static size_t page_mask = 0; + off_t mmap_start; + size_t mmap_size; + + if (!page_mask) + page_mask = sysconf(_SC_PAGESIZE) - 1; + + mmap_start = barmap->mmap_offset & ~page_mask; + mmap_size = barmap->mmap_offset + barmap->size + page_mask - mmap_start; + mmap_size &= ~page_mask; + + barmap->mmap_addr = mmap(0, mmap_size, PROT_READ | PROT_WRITE, MAP_SHARED, device_fd, mmap_start); + if (barmap->mmap_addr == MAP_FAILED) { + return -1; + } + + barmap->virt_addr = (uintptr_t)barmap->mmap_addr; + barmap->virt_addr += barmap->mmap_offset & page_mask; + + return 0; +} + +/****************************************************************/ + +#define BUFF_SMALL 32 +#define BUFF_MID 256 +#define min(a, b) ((a) > (b) ? (b) : (a)) + +/* Hardware specific */ +/* BAR0 */ +#define GPIOC_reg 0x54 + +/* BAR2 */ +#define ADCTRL_reg 0x00 +#define ADDATA0_reg 0x00 +#define ADDATA1_reg 0x02 +#define ADDATA2_reg 0x04 +#define ADDATA3_reg 0x06 +#define ADDATA4_reg 0x08 +#define ADDATA5_reg 0x0a +#define ADDATA6_reg 0x0c +#define ADDATA7_reg 0x0e +#define ADSTART_reg 0x20 + +#define DOUT_reg 0x10 +#define DIN_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 GPIOC_EOLC_mask (1 << 17) + + + + +static uint32_t dac_channel2reg[] = { + [DA0] = DA0_reg, + [DA1] = DA1_reg, + [DA2] = DA2_reg, + [DA3] = DA3_reg, + [DA4] = DA4_reg, + [DA5] = DA5_reg, + [DA6] = DA6_reg, + [DA7] = DA7_reg, +}; + +static uint32_t adc_channel2reg[] = { + [AD0] = ADDATA0_reg, + [AD1] = ADDATA1_reg, + [AD2] = ADDATA2_reg, + [AD3] = ADDATA3_reg, + [AD4] = ADDATA4_reg, + [AD5] = ADDATA5_reg, + [AD6] = ADDATA6_reg, + [AD7] = ADDATA7_reg, +}; + + + +#define MFST2REG(mfst, bar_num, reg_offs) \ + ((void *)(mfst->bar##bar_num.virt_addr + (reg_offs))) + +mf624_state_t mf624_state; + +/* Print one byte as binary number */ +void print_8bin(int nr) +{ + int i; + for (i = 7; i >= 0; i--) { + printf("%d" , ((nr & (1 << i)) > 0)); + } + + printf("\n"); +} + + + +void DIO_write(mf624_state_t* mfst, int16_t val) +{ + mf624_write16(val, MFST2REG(mfst, 2, DOUT_reg)); +} + +uint16_t DIO_read(mf624_state_t* mfst) +{ + return mf624_read16(MFST2REG(mfst, 2, DIN_reg)) & 0xFF; +} + +void DAC_enable(mf624_state_t* mfst) +{ + // Setting DACEN and LDAC bits in GPIO register influences all DACs + mf624_write32((mf624_read32(MFST2REG(mfst, 0, GPIOC_reg)) + | GPIOC_DACEN_mask) // enable output + & ~GPIOC_LDAC_mask, // enable conversion + MFST2REG(mfst, 0, GPIOC_reg)); +} + + + +int DAC_write(mf624_state_t* mfst, dac_channel_t channel, int val) +{ + if (channel > sizeof(dac_channel2reg)/sizeof(*dac_channel2reg)) + return -1; + + mf624_write16(val, MFST2REG(mfst, 2, dac_channel2reg[channel])); + return 0; +} + +int ADC_enable(mf624_state_t* mfst, adc_channel_t channel) +{ + mfst->ADC_enabled = 0; + + if (channel > sizeof(adc_channel2reg)/sizeof(*adc_channel2reg)) + return -1; + + mfst->ADC_enabled = (1 << channel); + + mfst->ADC_enabled &= 0xFF; + mf624_write16(mfst->ADC_enabled, MFST2REG(mfst, 2, ADCTRL_reg)); + //print_8bin(ADC_enabled); + + return 0; +} + +/* This function blocks until conversion is finished */ +double ADC_read(mf624_state_t* mfst, adc_channel_t channel) +{ + volatile int i; + int result; + + // Activate trigger to start conversion + mf624_read16(MFST2REG(mfst, 2, ADSTART_reg)); + + // Check if conversion has finished + while((mf624_read32(MFST2REG(mfst, 0, GPIOC_reg)) & GPIOC_EOLC_mask)) { + for (i = 0; i < 1000; i++) {} // small wait + } + + ADC_enable(mfst, channel); + result = mf624_read16(MFST2REG(mfst, 2, ADDATA0_reg)); + + return 10.0 * ((int16_t) (result << 2)) / (double) 0x8000; +} + + +int open_device(char* path) { + int device_fd; + + device_fd = open(path, O_RDWR | O_SYNC); + if (device_fd == -1) { + perror("open()"); + return -1; + } + + return device_fd; +} + +void wait_for_interrupts(int device_fd) +{ + read(device_fd, NULL, 1); +} + +int disable_interrupts(int device_fd) +{ + uint32_t control_value = 0; + int status; + + status = write(device_fd, &control_value, sizeof(uint32_t)); + if (status == -1) { + perror("write()"); + return -1; + } + + return status; +} + +int enable_interrupts(int device_fd) +{ + uint32_t control_value = 1; + int status; + + status = write(device_fd, &control_value, sizeof(uint32_t)); + if (status == -1) { + perror("write()"); + return -1; + } + + return status; +} + +void list_available_mem_regions(char* device) +{ + int status; + char path[] = "/sys/class/uio/"; + char subdir[] = "/maps/"; + char directory[BUFF_MID]; + memset(directory, '\0', BUFF_MID); + + DIR *dip; + struct dirent *dit; + + strncat(directory, path, strlen(path)); + strncat(directory, device, min(strlen(device), 8)); + strncat(directory, subdir, strlen(subdir)); + + dip = opendir(directory); + if (dip == NULL) { + perror("opendir"); + return; + } + + while ((dit = readdir(dip)) != NULL) { + if (strcmp(dit->d_name, ".") && strcmp(dit->d_name, "..")) { + printf(" %s\n", dit->d_name); + } + } + + status = closedir(dip); + if (status == -1) { + perror("closedir()"); + return; + } + +} + + +void list_available_io_ports(char *device) +{ + int status; + char path[] = "/sys/class/uio/"; + char subdir[] = "/portio/"; + char directory[BUFF_MID]; + memset(directory, '\0', BUFF_MID); + + DIR *dip; + struct dirent *dit; + + strncat(directory, path, strlen(path)); + strncat(directory, device, min(strlen(device), 8)); + strncat(directory, subdir, strlen(subdir)); + + status = access(directory, F_OK); + if (status == -1) { + printf(" There are no IO port available\n"); + return; + } + + dip = opendir(directory); + if (dip == NULL) { + perror("opendir"); + return; + } + + while ((dit = readdir(dip)) != NULL) { + if (strcmp(dit->d_name, ".") && strcmp(dit->d_name, "..")) { + printf(" %s\n", dit->d_name); + } + } + + status = closedir(dip); + if (status == -1) { + perror("closedir()"); + return; + } + +} + + +void run_simple_tests(char* dev_name) +{ + int status; + int device_fd; + char buff[BUFF_SMALL]; + memset(buff, '\0', BUFF_SMALL); + + strncat(buff, "/dev/", 5); + strncat(buff, dev_name, min(strlen(dev_name), 8)); + + printf("Opening %s\n", buff); + + device_fd = open_device(buff); + if (device_fd != -1) { + printf("Tring to enable interrupts\n"); + status = enable_interrupts(device_fd); + if (status != -1) { + printf(" Probably OK\n"); + } + + printf("Tring to disable interrupts\n"); + status = disable_interrupts(device_fd); + if (status != -1) { + printf(" Probably OK\n"); + } + } + + + printf("Checking for available memory regions exported by the UIO driver\n"); + list_available_mem_regions(dev_name); + + printf("Checking for available IO ports exported by the UIO driver\n"); + list_available_io_ports(dev_name); +} + +int mmap_regions(mf624_state_t* mfst) +{ + if (bar_mapping_fill(&mfst->bar0, mfst->uio_dev, 0) < 0) { + fprintf(stderr, "%s bar0 mapping fill failed\n", mfst->uio_dev); + return -1; + } + + if (bar_mapping_fill(&mfst->bar2, mfst->uio_dev, 1) < 0) { + fprintf(stderr, "%s bar2 mapping fill failed\n", mfst->uio_dev); + return -1; + } + + if (bar_mapping_fill(&mfst->bar4, mfst->uio_dev, 2) < 0) { + fprintf(stderr, "%s bar4 mapping fill failed\n", mfst->uio_dev); + return -1; + } + + if (bar_mapping_setup(&mfst->bar0, mfst->device_fd) < 0) { + fprintf(stderr, "%s bar0 mapping setup failed\n", mfst->uio_dev); + return -1; + } + + if (bar_mapping_setup(&mfst->bar2, mfst->device_fd) < 0) { + fprintf(stderr, "%s bar2 mapping setup failed\n", mfst->uio_dev); + return -1; + } + + if (bar_mapping_setup(&mfst->bar4, mfst->device_fd) < 0) { + fprintf(stderr, "%s bar4 mapping setup failed\n", mfst->uio_dev); + return -1; + } + +#if 1 + printf("bar0.phys_addr = %"PRIxPTR"\n", mfst->bar0.phys_addr); + printf("bar2.phys_addr = %"PRIxPTR"\n", mfst->bar2.phys_addr); + printf("bar4.phys_addr = %"PRIxPTR"\n", mfst->bar4.phys_addr); + + printf("bar0.virt_addr = %"PRIxPTR"\n", mfst->bar0.virt_addr); + printf("bar2.virt_addr = %"PRIxPTR"\n", mfst->bar2.virt_addr); + printf("bar4.virt_addr = %"PRIxPTR"\n", mfst->bar4.virt_addr); +#endif + + return 0; +} + + +/*int main(int argc, char* argv[]) +{ + mf624_state_t* mfst = &mf624_state; + char buff[BUFF_SMALL]; + memset(buff, '\0', BUFF_SMALL); + + if (argc < 2) { + printf("Usage: %s UIO_DEVICE\n UIO_DEVICE\tname of uio device in /dev\n", argv[0]); + return 1; + } + + mfst->uio_dev = argv[1]; + + strncat(buff, "/dev/", 5); + strncat(buff, mfst->uio_dev, sizeof(buff) - 6); + + mfst->device_fd = open_device(buff); + if (mfst->device_fd < 0) { + fprintf(stderr, "%s open failed (%s)!\n", mfst->uio_dev, strerror(errno)); + return 2; + } + if (mmap_regions(mfst) < 0) { + fprintf(stderr, "%s mmap_regions failed (%s)!\n", mfst->uio_dev, strerror(errno)); + return 2; + } + + DAC_enable(mfst); + + while (1){ + printf("Reading DIO: "); + print_8bin(DIO_read(mfst)); + sleep(1); + + printf("Setting DA1 to 10 V\n"); + DAC_write(mfst, DA1, 0x3FFF); + sleep(1); + + printf("Reading ADC0: "); + printf("%f V\n", ADC_read(mfst, AD0)); + sleep(1); + + printf("Reading ADC1: "); + printf("%f V\n", ADC_read(mfst, AD1)); + sleep(1); + + printf("Setting DIO to 0xff\n"); + DIO_write(mfst, 0xff); + sleep(1); + + printf("Setting DIO to 0x00\n"); + DIO_write(mfst, 0x00); + sleep(1); + + printf("Setting DA1 to 5 V\n"); + DAC_write(mfst, DA1, 0x3000); + sleep(1); + + printf("Reading ADC0: "); + printf("%f V\n", ADC_read(mfst, AD0)); + sleep(1); + + printf("Reading ADC1: "); + printf("%f V\n", ADC_read(mfst, AD1)); + sleep(1); + printf("----------------------\n\n"); + } + + + return 0; +}*/ diff --git a/mf624.c~ b/mf624.c~ new file mode 100644 index 0000000..6ce3d5b --- /dev/null +++ b/mf624.c~ @@ -0,0 +1,530 @@ +/* + * Application using MF624 UIO driver + * + * Copyright (C) 2011 Rostislav Lisovy + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include // uintX_t +#include +#include +#include + +#include "mf624.h" + +/****************************************************************/ + + +int bar_mapping_fill(bar_mapping_t *barmap, const char *uio_dev, int map_nr) +{ + FILE *file; + void *s; + int ssiz; + static size_t page_size; + + page_size = sysconf(_SC_PAGESIZE); + + ssiz = snprintf(NULL, 0, "/sys/class/uio/%s/maps/map%i/", uio_dev, map_nr); + if (ssiz < 0) + return -1; + /* add reserve to store each size addr, name, offset, size */ + ssiz += 6 + 1; + s = alloca(ssiz + 6 + 1); + + snprintf(s, ssiz, "/sys/class/uio/%s/maps/map%i/addr", uio_dev, map_nr); + file = fopen(s, "rb"); + if (file == NULL) + return -1; + fscanf(file, "%"SCNiPTR, &barmap->phys_addr); + fclose(file); + + snprintf(s, ssiz, "/sys/class/uio/%s/maps/map%i/offset", uio_dev, map_nr); + file = fopen(s, "rb"); + if (file == NULL) { + barmap->offset = barmap->phys_addr & (page_size - 1); + } else { + fscanf(file, "%"SCNi32, &barmap->offset); + fclose(file); + } + + snprintf(s, ssiz, "/sys/class/uio/%s/maps/map%i/size", uio_dev, map_nr); + file = fopen(s, "rb"); + if (file == NULL) + return -1; + fscanf(file, "%"SCNi32, &barmap->size); + fclose(file); + + barmap->mmap_offset = page_size * map_nr + barmap->offset; + + return 0; +} + +int bar_mapping_setup(bar_mapping_t *barmap, int device_fd) +{ + static size_t page_mask = 0; + off_t mmap_start; + size_t mmap_size; + + if (!page_mask) + page_mask = sysconf(_SC_PAGESIZE) - 1; + + mmap_start = barmap->mmap_offset & ~page_mask; + mmap_size = barmap->mmap_offset + barmap->size + page_mask - mmap_start; + mmap_size &= ~page_mask; + + barmap->mmap_addr = mmap(0, mmap_size, PROT_READ | PROT_WRITE, MAP_SHARED, device_fd, mmap_start); + if (barmap->mmap_addr == MAP_FAILED) { + return -1; + } + + barmap->virt_addr = (uintptr_t)barmap->mmap_addr; + barmap->virt_addr += barmap->mmap_offset & page_mask; + + return 0; +} + +/****************************************************************/ + +#define BUFF_SMALL 32 +#define BUFF_MID 256 +#define min(a, b) ((a) > (b) ? (b) : (a)) + +/* Hardware specific */ +/* BAR0 */ +#define GPIOC_reg 0x54 + +/* BAR2 */ +#define ADCTRL_reg 0x00 +#define ADDATA0_reg 0x00 +#define ADDATA1_reg 0x02 +#define ADDATA2_reg 0x04 +#define ADDATA3_reg 0x06 +#define ADDATA4_reg 0x08 +#define ADDATA5_reg 0x0a +#define ADDATA6_reg 0x0c +#define ADDATA7_reg 0x0e +#define ADSTART_reg 0x20 + +#define DOUT_reg 0x10 +#define DIN_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 GPIOC_EOLC_mask (1 << 17) + + + + +static uint32_t dac_channel2reg[] = { + [DA0] = DA0_reg, + [DA1] = DA1_reg, + [DA2] = DA2_reg, + [DA3] = DA3_reg, + [DA4] = DA4_reg, + [DA5] = DA5_reg, + [DA6] = DA6_reg, + [DA7] = DA7_reg, +}; + +static uint32_t adc_channel2reg[] = { + [AD0] = ADDATA0_reg, + [AD1] = ADDATA1_reg, + [AD2] = ADDATA2_reg, + [AD3] = ADDATA3_reg, + [AD4] = ADDATA4_reg, + [AD5] = ADDATA5_reg, + [AD6] = ADDATA6_reg, + [AD7] = ADDATA7_reg, +}; + + + +#define MFST2REG(mfst, bar_num, reg_offs) \ + ((void *)(mfst->bar##bar_num.virt_addr + (reg_offs))) + +mf624_state_t mf624_state; + +/* Print one byte as binary number */ +void print_8bin(int nr) +{ + int i; + for (i = 7; i >= 0; i--) { + printf("%d" , ((nr & (1 << i)) > 0)); + } + + printf("\n"); +} + + + +void DIO_write(mf624_state_t* mfst, int16_t val) +{ + mf624_write16(val, MFST2REG(mfst, 2, DOUT_reg)); +} + +uint16_t DIO_read(mf624_state_t* mfst) +{ + return mf624_read16(MFST2REG(mfst, 2, DIN_reg)) & 0xFF; +} + +void DAC_enable(mf624_state_t* mfst) +{ + // Setting DACEN and LDAC bits in GPIO register influences all DACs + mf624_write32((mf624_read32(MFST2REG(mfst, 0, GPIOC_reg)) + | GPIOC_DACEN_mask) // enable output + & ~GPIOC_LDAC_mask, // enable conversion + MFST2REG(mfst, 0, GPIOC_reg)); +} + + + +int DAC_write(mf624_state_t* mfst, dac_channel_t channel, int val) +{ + if (channel > sizeof(dac_channel2reg)/sizeof(*dac_channel2reg)) + return -1; + + mf624_write16(val, MFST2REG(mfst, 2, dac_channel2reg[channel])); + return 0; +} + +int ADC_enable(mf624_state_t* mfst, adc_channel_t channel) +{ + mfst->ADC_enabled = 0; + + if (channel > sizeof(adc_channel2reg)/sizeof(*adc_channel2reg)) + return -1; + + mfst->ADC_enabled = (1 << channel); + + mfst->ADC_enabled &= 0xFF; + mf624_write16(mfst->ADC_enabled, MFST2REG(mfst, 2, ADCTRL_reg)); + //print_8bin(ADC_enabled); + + return 0; +} + +/* This function blocks until conversion is finished */ +double ADC_read(mf624_state_t* mfst, adc_channel_t channel) +{ + volatile int i; + int result; + + // Activate trigger to start conversion + mf624_read16(MFST2REG(mfst, 2, ADSTART_reg)); + + // Check if conversion has finished + while((mf624_read32(MFST2REG(mfst, 0, GPIOC_reg)) & GPIOC_EOLC_mask)) { + for (i = 0; i < 1000; i++) {} // small wait + } + + ADC_enable(mfst, channel); + result = mf624_read16(MFST2REG(mfst, 2, ADDATA0_reg)); + + return 10.0 * ((int16_t) (result << 2)) / (double) 0x8000; +} + + +int open_device(char* path) { + int device_fd; + + device_fd = open(path, O_RDWR | O_SYNC); + if (device_fd == -1) { + perror("open()"); + return -1; + } + + return device_fd; +} + +void wait_for_interrupts(int device_fd) +{ + read(device_fd, NULL, 1); +} + +int disable_interrupts(int device_fd) +{ + uint32_t control_value = 0; + int status; + + status = write(device_fd, &control_value, sizeof(uint32_t)); + if (status == -1) { + perror("write()"); + return -1; + } + + return status; +} + +int enable_interrupts(int device_fd) +{ + uint32_t control_value = 1; + int status; + + status = write(device_fd, &control_value, sizeof(uint32_t)); + if (status == -1) { + perror("write()"); + return -1; + } + + return status; +} + +void list_available_mem_regions(char* device) +{ + int status; + char path[] = "/sys/class/uio/"; + char subdir[] = "/maps/"; + char directory[BUFF_MID]; + memset(directory, '\0', BUFF_MID); + + DIR *dip; + struct dirent *dit; + + strncat(directory, path, strlen(path)); + strncat(directory, device, min(strlen(device), 8)); + strncat(directory, subdir, strlen(subdir)); + + dip = opendir(directory); + if (dip == NULL) { + perror("opendir"); + return; + } + + while ((dit = readdir(dip)) != NULL) { + if (strcmp(dit->d_name, ".") && strcmp(dit->d_name, "..")) { + printf(" %s\n", dit->d_name); + } + } + + status = closedir(dip); + if (status == -1) { + perror("closedir()"); + return; + } + +} + + +void list_available_io_ports(char *device) +{ + int status; + char path[] = "/sys/class/uio/"; + char subdir[] = "/portio/"; + char directory[BUFF_MID]; + memset(directory, '\0', BUFF_MID); + + DIR *dip; + struct dirent *dit; + + strncat(directory, path, strlen(path)); + strncat(directory, device, min(strlen(device), 8)); + strncat(directory, subdir, strlen(subdir)); + + status = access(directory, F_OK); + if (status == -1) { + printf(" There are no IO port available\n"); + return; + } + + dip = opendir(directory); + if (dip == NULL) { + perror("opendir"); + return; + } + + while ((dit = readdir(dip)) != NULL) { + if (strcmp(dit->d_name, ".") && strcmp(dit->d_name, "..")) { + printf(" %s\n", dit->d_name); + } + } + + status = closedir(dip); + if (status == -1) { + perror("closedir()"); + return; + } + +} + + +void run_simple_tests(char* dev_name) +{ + int status; + int device_fd; + char buff[BUFF_SMALL]; + memset(buff, '\0', BUFF_SMALL); + + strncat(buff, "/dev/", 5); + strncat(buff, dev_name, min(strlen(dev_name), 8)); + + printf("Opening %s\n", buff); + + device_fd = open_device(buff); + if (device_fd != -1) { + printf("Tring to enable interrupts\n"); + status = enable_interrupts(device_fd); + if (status != -1) { + printf(" Probably OK\n"); + } + + printf("Tring to disable interrupts\n"); + status = disable_interrupts(device_fd); + if (status != -1) { + printf(" Probably OK\n"); + } + } + + + printf("Checking for available memory regions exported by the UIO driver\n"); + list_available_mem_regions(dev_name); + + printf("Checking for available IO ports exported by the UIO driver\n"); + list_available_io_ports(dev_name); +} + +int mmap_regions(mf624_state_t* mfst) +{ + if (bar_mapping_fill(&mfst->bar0, mfst->uio_dev, 0) < 0) { + fprintf(stderr, "%s bar0 mapping fill failed\n", mfst->uio_dev); + return -1; + } + + if (bar_mapping_fill(&mfst->bar2, mfst->uio_dev, 1) < 0) { + fprintf(stderr, "%s bar2 mapping fill failed\n", mfst->uio_dev); + return -1; + } + + if (bar_mapping_fill(&mfst->bar4, mfst->uio_dev, 2) < 0) { + fprintf(stderr, "%s bar4 mapping fill failed\n", mfst->uio_dev); + return -1; + } + + if (bar_mapping_setup(&mfst->bar0, mfst->device_fd) < 0) { + fprintf(stderr, "%s bar0 mapping setup failed\n", mfst->uio_dev); + return -1; + } + + if (bar_mapping_setup(&mfst->bar2, mfst->device_fd) < 0) { + fprintf(stderr, "%s bar2 mapping setup failed\n", mfst->uio_dev); + return -1; + } + + if (bar_mapping_setup(&mfst->bar4, mfst->device_fd) < 0) { + fprintf(stderr, "%s bar4 mapping setup failed\n", mfst->uio_dev); + return -1; + } + +#if 1 + printf("bar0.phys_addr = %"PRIxPTR"\n", mfst->bar0.phys_addr); + printf("bar2.phys_addr = %"PRIxPTR"\n", mfst->bar2.phys_addr); + printf("bar4.phys_addr = %"PRIxPTR"\n", mfst->bar4.phys_addr); + + printf("bar0.virt_addr = %"PRIxPTR"\n", mfst->bar0.virt_addr); + printf("bar2.virt_addr = %"PRIxPTR"\n", mfst->bar2.virt_addr); + printf("bar4.virt_addr = %"PRIxPTR"\n", mfst->bar4.virt_addr); +#endif + + return 0; +} + + +/*int main(int argc, char* argv[]) +{ + mf624_state_t* mfst = &mf624_state; + char buff[BUFF_SMALL]; + memset(buff, '\0', BUFF_SMALL); + + if (argc < 2) { + printf("Usage: %s UIO_DEVICE\n UIO_DEVICE\tname of uio device in /dev\n", argv[0]); + return 1; + } + + mfst->uio_dev = argv[1]; + + strncat(buff, "/dev/", 5); + strncat(buff, mfst->uio_dev, sizeof(buff) - 6); + + mfst->device_fd = open_device(buff); + if (mfst->device_fd < 0) { + fprintf(stderr, "%s open failed (%s)!\n", mfst->uio_dev, strerror(errno)); + return 2; + } + if (mmap_regions(mfst) < 0) { + fprintf(stderr, "%s mmap_regions failed (%s)!\n", mfst->uio_dev, strerror(errno)); + return 2; + } + + DAC_enable(mfst); + + while (1){ + printf("Reading DIO: "); + print_8bin(DIO_read(mfst)); + sleep(1); + + printf("Setting DA1 to 10 V\n"); + DAC_write(mfst, DA1, 0x3FFF); + sleep(1); + + printf("Reading ADC0: "); + printf("%f V\n", ADC_read(mfst, AD0)); + sleep(1); + + printf("Reading ADC1: "); + printf("%f V\n", ADC_read(mfst, AD1)); + sleep(1); + + printf("Setting DIO to 0xff\n"); + DIO_write(mfst, 0xff); + sleep(1); + + printf("Setting DIO to 0x00\n"); + DIO_write(mfst, 0x00); + sleep(1); + + printf("Setting DA1 to 5 V\n"); + DAC_write(mfst, DA1, 0x3000); + sleep(1); + + printf("Reading ADC0: "); + printf("%f V\n", ADC_read(mfst, AD0)); + sleep(1); + + printf("Reading ADC1: "); + printf("%f V\n", ADC_read(mfst, AD1)); + sleep(1); + printf("----------------------\n\n"); + } + + + return 0; +}*/ diff --git a/mf624.h b/mf624.h new file mode 100644 index 0000000..b574765 --- /dev/null +++ b/mf624.h @@ -0,0 +1,82 @@ +#ifndef MF624 +#define MF624 + +#include +#include // uintX_t +#include + + +typedef struct bar_mapping_t { + uintptr_t virt_addr; + void * mmap_addr; + off_t mmap_offset; + uintptr_t phys_addr; + uint32_t size; + uint32_t offset; +} bar_mapping_t; + + +typedef enum {DA0, DA1, DA2, DA3, DA4, DA5, DA6, DA7} dac_channel_t; +typedef enum {AD0, AD1, AD2, AD3, AD4, AD5, AD6, AD7} adc_channel_t; + +typedef struct mf624_state_t { + int device_fd; + char *uio_dev; + bar_mapping_t bar0; + bar_mapping_t bar2; + bar_mapping_t bar4; + int status; + int ADC_enabled; // Which ADCs are enabled +} mf624_state_t; + +extern mf624_state_t mf624_state; + +extern void print_8bin(int nr); + +static inline int16_t mf624_read16(void *ptr) +{ + return *(volatile uint16_t*)ptr; +} + +static inline int32_t mf624_read32(void *ptr) +{ + return *(volatile uint32_t*) ptr; +} + +static inline void mf624_write16(uint16_t val, void *ptr) +{ + *(volatile uint16_t*) ptr = val; +} + +static inline void mf624_write32(uint32_t val, void *ptr) +{ + *(volatile uint32_t*) ptr = val; +} + +extern void DIO_write(mf624_state_t* mfst, int16_t val); + +extern uint16_t DIO_read(mf624_state_t* mfst); + +extern void DAC_enable(mf624_state_t* mfst); + +extern int DAC_write(mf624_state_t* mfst, dac_channel_t channel, int val); + +extern int ADC_enable(mf624_state_t* mfst, adc_channel_t channel); + +extern double ADC_read(mf624_state_t* mfst, adc_channel_t channel); + +extern int open_device(char* path); + +extern void wait_for_interrupts(int device_fd); + +extern int disable_interrupts(int device_fd); + +extern int enable_interrupts(int device_fd); + +extern void list_available_mem_regions(char* device); + +extern void list_available_io_ports(char *device); + +extern int mmap_regions(mf624_state_t* mfst); + +#endif diff --git a/mf624.h~ b/mf624.h~ new file mode 100644 index 0000000..13a2739 --- /dev/null +++ b/mf624.h~ @@ -0,0 +1,80 @@ +#ifndef MF624 +#define MF624 + +#include +#include // uintX_t +#include + + +typedef struct bar_mapping_t { + uintptr_t virt_addr; + void * mmap_addr; + uintptr_t phys_addr; + uint32_t size; + uint32_t offset; +} bar_mapping_t; + +typedef enum {DA0, DA1, DA2, DA3, DA4, DA5, DA6, DA7} dac_channel_t; +typedef enum {AD0, AD1, AD2, AD3, AD4, AD5, AD6, AD7} adc_channel_t; + +typedef struct mf624_state_t { + int device_fd; + char *uio_dev; + bar_mapping_t bar0; + bar_mapping_t bar2; + bar_mapping_t bar4; + int status; + int ADC_enabled; // Which ADCs are enabled +} mf624_state_t; + +extern mf624_state_t mf624_state; + +extern void print_8bin(int nr); + +static inline int16_t mf624_read16(void *ptr) +{ + return *(volatile uint16_t*)ptr; +} + +static inline int32_t mf624_read32(void *ptr) +{ + return *(volatile uint32_t*) ptr; +} + +static inline void mf624_write16(uint16_t val, void *ptr) +{ + *(volatile uint16_t*) ptr = val; +} + +static inline void mf624_write32(uint32_t val, void *ptr) +{ + *(volatile uint32_t*) ptr = val; +} + +extern void DIO_write(mf624_state_t* mfst, int16_t val); + +extern uint16_t DIO_read(mf624_state_t* mfst); + +extern void DAC_enable(mf624_state_t* mfst); + +extern int DAC_write(mf624_state_t* mfst, dac_channel_t channel, int val); + +extern int ADC_enable(mf624_state_t* mfst, adc_channel_t channel); + +extern double ADC_read(mf624_state_t* mfst, adc_channel_t channel); + +extern int open_device(char* path); + +extern void wait_for_interrupts(int device_fd); + +extern int disable_interrupts(int device_fd); + +extern int enable_interrupts(int device_fd); + +extern void list_available_mem_regions(char* device); + +extern void list_available_io_ports(char *device); + +extern int mmap_regions(mf624_state_t* mfst); + +#endif diff --git a/mf624.mexa64 b/mf624.mexa64 new file mode 100755 index 0000000000000000000000000000000000000000..c6751687f1938d006694625d42cb6cc78b92e871 GIT binary patch literal 36939 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Π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 = "uio0"; + + strncat(buff, "/dev/", 5); + strncat(buff, mfst->uio_dev, sizeof(buff) - 6); + + mfst->device_fd = open_device(buff); + if (mfst->device_fd < 0) { + ssSetErrorStatus(S,"open failed"); + return; + } + if (mmap_regions(mfst) < 0) { + ssSetErrorStatus(S,"mmap_regions failed"); + return; + } + + DAC_enable(mfst); + ssSetPWorkValue(S, 0, mfst); + #endif + } +#endif /* MDL_START */ + + + +/* Function: mdlOutputs ======================================================= + * Abstract: + * In this function, you compute the outputs of your S-function + * block. + */ +static void mdlOutputs(SimStruct *S, int_T tid) +{ + const real_T *u = (const real_T*) ssGetInputPortSignal(S,0); + mf624_state_t* mfst = ssGetPWorkValue(S,0); + int out; + if(u[0] > 9.9988){ + out = 0x3FFF; + } + else if(u[0] < -10){ + out = 0; + } + else { + out = (int) ((u[0] + 10) * 8192 / 10 + 0.5); + } + DAC_write(mfst, DA0, out); +} + + + +#define MDL_UPDATE /* Change to #undef to remove function */ +#if defined(MDL_UPDATE) + /* Function: mdlUpdate ====================================================== + * Abstract: + * This function is called once for every major integration time step. + * Discrete states are typically updated here, but this function is useful + * for performing any tasks that should only take place once per + * integration step. + */ + static void mdlUpdate(SimStruct *S, int_T tid) + { + } +#endif /* MDL_UPDATE */ + + + +#define MDL_DERIVATIVES /* Change to #undef to remove function */ +#if defined(MDL_DERIVATIVES) + /* Function: mdlDerivatives ================================================= + * Abstract: + * In this function, you compute the S-function block's derivatives. + * The derivatives are placed in the derivative vector, ssGetdX(S). + */ + static void mdlDerivatives(SimStruct *S) + { + } +#endif /* MDL_DERIVATIVES */ + + + +/* Function: mdlTerminate ===================================================== + * Abstract: + * In this function, you should perform any actions that are necessary + * at the termination of a simulation. For example, if memory was + * allocated in mdlStart, this is the place to free it. + */ +static void mdlTerminate(SimStruct *S) +{ + #if defined(TEST) + free(ssGetPWorkValue(S,0)); + #endif + +} + + +/*======================================================* + * See sfuntmpl_doc.c for the optional S-function methods * + *======================================================*/ + +/*=============================* + * Required S-function trailer * + *=============================*/ + +#ifdef MATLAB_MEX_FILE /* Is this file being compiled as a MEX-file? */ +#include "simulink.c" /* MEX-file interface mechanism */ +#else +#include "cg_sfun.h" /* Code generation registration function */ +#endif diff --git a/sfAnalogOutput.mexa64 b/sfAnalogOutput.mexa64 new file mode 100755 index 0000000000000000000000000000000000000000..718991a9a3ce6851384634ac24c6588ad5b7c43d GIT binary patch literal 35975 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 literal 0 HcmV?d00001 diff --git a/sfuntmpl_basic.c b/sfuntmpl_basic.c new file mode 100644 index 0000000..13a0d8b --- /dev/null +++ b/sfuntmpl_basic.c @@ -0,0 +1,221 @@ +/* + * sfuntmpl_basic.c: Basic 'C' template for a level 2 S-function. + * + * ------------------------------------------------------------------------- + * | See matlabroot/simulink/src/sfuntmpl_doc.c for a more detailed template | + * ------------------------------------------------------------------------- + * + * Copyright 1990-2002 The MathWorks, Inc. + * $Revision: 1.27.4.2 $ + */ + + +/* + * You must specify the S_FUNCTION_NAME as the name of your S-function + * (i.e. replace sfuntmpl_basic with the name of your S-function). + */ + +#define S_FUNCTION_NAME sfuntmpl_basic +#define S_FUNCTION_LEVEL 2 + +/* + * Need to include simstruc.h for the definition of the SimStruct and + * its associated macro definitions. + */ +#include "simstruc.h" + + + +/* Error handling + * -------------- + * + * You should use the following technique to report errors encountered within + * an S-function: + * + * ssSetErrorStatus(S,"Error encountered due to ..."); + * return; + * + * Note that the 2nd argument to ssSetErrorStatus must be persistent memory. + * It cannot be a local variable. For example the following will cause + * unpredictable errors: + * + * mdlOutputs() + * { + * char msg[256]; {ILLEGAL: to fix use "static char msg[256];"} + * sprintf(msg,"Error due to %s", string); + * ssSetErrorStatus(S,msg); + * return; + * } + * + * See matlabroot/simulink/src/sfuntmpl_doc.c for more details. + */ + +/*====================* + * S-function methods * + *====================*/ + +/* Function: mdlInitializeSizes =============================================== + * Abstract: + * The sizes information is used by Simulink to determine the S-function + * block's characteristics (number of inputs, outputs, states, etc.). + */ +static void mdlInitializeSizes(SimStruct *S) +{ + /* See sfuntmpl_doc.c for more details on the macros below */ + + ssSetNumSFcnParams(S, 0); /* Number of expected parameters */ + if (ssGetNumSFcnParams(S) != ssGetSFcnParamsCount(S)) { + /* Return if number of expected != number of actual parameters */ + return; + } + + ssSetNumContStates(S, 0); + ssSetNumDiscStates(S, 0); + + if (!ssSetNumInputPorts(S, 1)) return; + ssSetInputPortWidth(S, 0, 1); + ssSetInputPortRequiredContiguous(S, 0, true); /*direct input signal access*/ + /* + * Set direct feedthrough flag (1=yes, 0=no). + * A port has direct feedthrough if the input is used in either + * the mdlOutputs or mdlGetTimeOfNextVarHit functions. + * See matlabroot/simulink/src/sfuntmpl_directfeed.txt. + */ + ssSetInputPortDirectFeedThrough(S, 0, 1); + + if (!ssSetNumOutputPorts(S, 1)) return; + ssSetOutputPortWidth(S, 0, 1); + + ssSetNumSampleTimes(S, 1); + ssSetNumRWork(S, 0); + ssSetNumIWork(S, 0); + ssSetNumPWork(S, 0); + ssSetNumModes(S, 0); + ssSetNumNonsampledZCs(S, 0); + + /* Specify the sim state compliance to be same as a built-in block */ + ssSetSimStateCompliance(S, USE_DEFAULT_SIM_STATE); + + ssSetOptions(S, 0); +} + + + +/* Function: mdlInitializeSampleTimes ========================================= + * Abstract: + * This function is used to specify the sample time(s) for your + * S-function. You must register the same number of sample times as + * specified in ssSetNumSampleTimes. + */ +static void mdlInitializeSampleTimes(SimStruct *S) +{ + ssSetSampleTime(S, 0, CONTINUOUS_SAMPLE_TIME); + ssSetOffsetTime(S, 0, 0.0); + +} + + + +#define MDL_INITIALIZE_CONDITIONS /* Change to #undef to remove function */ +#if defined(MDL_INITIALIZE_CONDITIONS) + /* Function: mdlInitializeConditions ======================================== + * Abstract: + * In this function, you should initialize the continuous and discrete + * states for your S-function block. The initial states are placed + * in the state vector, ssGetContStates(S) or ssGetRealDiscStates(S). + * You can also perform any other initialization activities that your + * S-function may require. Note, this routine will be called at the + * start of simulation and if it is present in an enabled subsystem + * configured to reset states, it will be call when the enabled subsystem + * restarts execution to reset the states. + */ + static void mdlInitializeConditions(SimStruct *S) + { + } +#endif /* MDL_INITIALIZE_CONDITIONS */ + + + +#define MDL_START /* Change to #undef to remove function */ +#if defined(MDL_START) + /* Function: mdlStart ======================================================= + * Abstract: + * This function is called once at start of model execution. If you + * have states that should be initialized once, this is the place + * to do it. + */ + static void mdlStart(SimStruct *S) + { + } +#endif /* MDL_START */ + + + +/* Function: mdlOutputs ======================================================= + * Abstract: + * In this function, you compute the outputs of your S-function + * block. + */ +static void mdlOutputs(SimStruct *S, int_T tid) +{ + const real_T *u = (const real_T*) ssGetInputPortSignal(S,0); + real_T *y = ssGetOutputPortSignal(S,0); + y[0] = u[0]; +} + + + +#define MDL_UPDATE /* Change to #undef to remove function */ +#if defined(MDL_UPDATE) + /* Function: mdlUpdate ====================================================== + * Abstract: + * This function is called once for every major integration time step. + * Discrete states are typically updated here, but this function is useful + * for performing any tasks that should only take place once per + * integration step. + */ + static void mdlUpdate(SimStruct *S, int_T tid) + { + } +#endif /* MDL_UPDATE */ + + + +#define MDL_DERIVATIVES /* Change to #undef to remove function */ +#if defined(MDL_DERIVATIVES) + /* Function: mdlDerivatives ================================================= + * Abstract: + * In this function, you compute the S-function block's derivatives. + * The derivatives are placed in the derivative vector, ssGetdX(S). + */ + static void mdlDerivatives(SimStruct *S) + { + } +#endif /* MDL_DERIVATIVES */ + + + +/* Function: mdlTerminate ===================================================== + * Abstract: + * In this function, you should perform any actions that are necessary + * at the termination of a simulation. For example, if memory was + * allocated in mdlStart, this is the place to free it. + */ +static void mdlTerminate(SimStruct *S) +{ +} + + +/*======================================================* + * See sfuntmpl_doc.c for the optional S-function methods * + *======================================================*/ + +/*=============================* + * Required S-function trailer * + *=============================*/ + +#ifdef MATLAB_MEX_FILE /* Is this file being compiled as a MEX-file? */ +#include "simulink.c" /* MEX-file interface mechanism */ +#else +#include "cg_sfun.h" /* Code generation registration function */ +#endif diff --git a/slprj/ert/test/tmwinternal/minfo.mat b/slprj/ert/test/tmwinternal/minfo.mat new file mode 100644 index 0000000000000000000000000000000000000000..a86ab52b062999770a727c7a3ee3000919cd571c GIT binary patch literal 1471 zcmV;w1wi^uK~zjZLLfCRFd$7qR4ry{Y-KDUP;6mzW^ZzBIv__(PFO)UG%O%Pa%Ew3 zWn>_4ZaN@Fa%mt5ihjwS z{|Nv^IX3K)o?P1B@HEp`bQ45 zkSfId$aiYftO;R0JQg}ZI2ppjm()KWQvs#; z99#C8LRlja-5C7sG@Mvsd(|ai(ln%sJ0>X4yOTq{6_zQq2;T>HWc3N|Sm`CM~R31ThZkvLyxCBnB?jg*n#X zM5y4Np^+!~WhF4D1t^`$3UJN*{7SxFiZ2bHr3yF-VmlSV7wMLhz)hVvd z_UY{Qm8#f1CM~oZQ9HzdUNXlvaUHHLG~M5>X1^Erx69exwhidDTJy=R&d9AID5=KE zy={>DVMZ?P@3gkyuf6l)>9fK1*7NP*uT%S<74$8Y^yMx8{eS$;<6S%`<2UA%tK!|U zyr1)56#u4S-Vf2Nzii*;4s0h{xS;1Y{C?MRmGuSRKRf4@TWgS8z9({b;g_$e^ROHK zn4V@n#`ZYV8c+4zw>zF6A@} zzsi40+5C1I#`|t&ytMz@;qiyg>zB7yZ_4(rfaK@T_lqZG{9W_@4RXhA1I@ znxdAXok#QXbEK|9F)3pTH$12lmNVhl$?5 z9eT_5SiL`HeR~gmZcn>#uFl@kXYU)V-oF;q`ylJvyNzo@9*yP+nv4V z`}@7u`<>mF-QC^Ji*~#Hs@HzC*WTW?djD9^pO3Tt@r*yMvDeYGqogzkCtmV~3i;Sz z&q$R#mi8@04ofPP+Md!FtH!q(6{lvDEAn- z<<`IsyZ-+JT=+5V4*&oFHUIzsc%0*7U|{e7Vm2V=fYKnq3gyE9BM=J%ab{jxesD=q ZX>y5keqLH;dT?q9Se^;04gl7z2tmV6$(R5D literal 0 HcmV?d00001 diff --git a/slprj/sl_proj.tmw b/slprj/sl_proj.tmw new file mode 100644 index 0000000..5e270e4 --- /dev/null +++ b/slprj/sl_proj.tmw @@ -0,0 +1,2 @@ +Simulink Coder project marker file. Please don't change it. +slprjVersion: 8.0_41_001 \ No newline at end of file diff --git a/test b/test new file mode 100755 index 0000000000000000000000000000000000000000..f093376e5c4bb762852be6be3cefd45cf9750f97 GIT binary patch literal 191851 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 literal 0 HcmV?d00001 diff --git a/test.mat b/test.mat new file mode 100644 index 0000000000000000000000000000000000000000..63b3204b01ba4cd9ecdd2070460e4e3d14eb9447 GIT binary patch literal 2600 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 YBa0NIVd4Jy3H$e!``go9>VMw;8-5ar^Z)<= literal 0 HcmV?d00001 diff --git a/test_ert_rtw/build_exception.mat b/test_ert_rtw/build_exception.mat new file mode 100644 index 0000000000000000000000000000000000000000..52f0a7e565d22e208e6233be75e977d17caa64b8 GIT binary patch literal 1733 zcmV;$20HmoK~zjZLLfCRFd$7qR4ry{Y-KDUP;6mzW^ZzBIv__(PFO)UG%O%Pa%Ew3 zWn>_4ZaN@Fa%mtHSD9Oyv1F7Q!Vh<$!yionDP(B;j zEC^UrOlEM<;+!T73k{0HYTaxR@x1gsSdg!soJVK8-<`McBeT?#Nr8O;k zC2fJmz!D&KKaw-^&2ad)2>|%#J^(B7yC&;8Fy#x2Jy}2AH(ynjEC${|Tj5Pvw{!AK zQ{=O1+Lv{oXUDW#uR58YzrUU6`O1#>#@}TQj&vq=Wsj*TwQKo z)0Y)*3eLB!gUj*B@U0wPw%;Wi+pK>j*S`uT`H;=sO3udW6n>kz@Aj?v@^8c9eObF| zMr>)DpdUP&{Ok68NJ4B!y@VndF9u+I|| zs4V5a7$U#cmHCH+PvuIKR>{EU=Ukw;=0on+rV*+6eMVy|jARQGvW=rarL9lqYhRxGfJk?NoOLu?-t0Pgqi{Xttd3~_alPH_9ya&tM-O)&JUpojO7RID)tPv! ztH41o*ohb2-?ca>xvm=hhLRr@*l#-aoAdbDIO-nP8!FvRZ`OLSK9AC3+xXa`@_ZjZgj?f z=6>Em;+ejWODGt{7_qv!ptm5#ConiQ`{sTDzpovB3Y$AP$`rkztP2NI;yqWq)_%Vc z@oE(C+jRITd{Ix?_4IS2ddF1nnCcxFlI9jpvfa$qa7}ox$eRXUQav1|Y6tLRq9j!5O8%@pzpel#WO^ zYcA>tp{q7sjXpRSVAZTWI{KL4@so*TJO@*s}$&YmR`-|S5|%R zX#U5Zex^=8I>s{Pn6i*i9CU{d-5!2ww=UWvEEuCBw#5H9ug;$S>P~+;&g&dGCv?A> z)49d>9DZh5euY2z8Sgvw-2VK6{!mV*w8j7Qck?}me`ew@<-j@PFA^l6yam_G5Ede4 zNmINopzy_%q&O|C>}#1;z~5NF$Vr)#YuQReTH+BB?OY zKi$)T_?CsQ`FXrMXWyJ$p1a3xoyHIK4&fd8UAy+r#TV`0vHUlSUvu~x_l)ehu4Clg b1sUJ|ul{EL%O=*(p#M0?bhLc~zDdPK$Q@d| literal 0 HcmV?d00001 -- 2.39.2