X-Git-Url: https://rtime.felk.cvut.cz/gitweb/mf624-simulink.git/blobdiff_plain/24a28c6465f225e89664a92dc9eae156efa93da9..13cde8a33f64c7b6d64c456a133efe6525e8a4a7:/mf624_SIMULINK.c diff --git a/mf624_SIMULINK.c b/mf624_SIMULINK.c index 54406d8..94c3e04 100644 --- a/mf624_SIMULINK.c +++ b/mf624_SIMULINK.c @@ -1,21 +1,35 @@ -/* - * 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. +/* + * Common Humusoft MF624 card Simulink code for use with Linux UIO driver * - * 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. + * Copyright (C) 2011-2014 Rostislav Lisovy + * Copyright (C) 2013 Michal Kreč + * Copyright (C) 2013 Michal Sojka * - * 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. + * Department of Control Engineering + * Faculty of Electrical Engineering + * Czech Technical University in Prague (CTU) + * + * The ERT Linux support code can be distributed in compliance + * with GNU General Public License (GPL) version 2 or later. + * Other licence can negotiated with CTU. + * + * Next exception is granted in addition to GPL. + * Instantiating or linking compiled version of this code + * to produce an application image/executable, does not + * by itself cause the resulting application image/executable + * to be covered by the GNU General Public License. + * This exception does not however invalidate any other reasons + * why the executable file might be covered by the GNU Public License. + * Publication of enhanced or derived S-function files is required + * although. + * + * Linux ERT code is available from + * http://rtime.felk.cvut.cz/gitweb/ert_linux.git + * More CTU Linux target for Simulink components are available at + * http://lintarget.sourceforge.net/ + * + * sfuntmpl_basic.c by The MathWorks, Inc. has been used to accomplish + * required S-function structure. */ #include @@ -117,7 +131,7 @@ static int bar_mapping_destroy(bar_mapping_t *barmap) off_t mmap_start; size_t mmap_size; size_t 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; @@ -169,7 +183,7 @@ void DAC_enable(mf624_state_t* mfst) MFST2REG(mfst, 0, GPIOC_reg)); } - + int DAC_write(mf624_state_t* mfst, dac_channel_t channel, int val) { @@ -206,7 +220,7 @@ double ADC_read(mf624_state_t* mfst, adc_channel_t channel) mf624_read16(MFST2REG(mfst, 2, ADSTART_reg)); // Check if conversion has finished - while((mf624_read32(MFST2REG(mfst, 0, GPIOC_reg)) & GPIOC_EOLC_mask)) { + while((mf624_read32(MFST2REG(mfst, 0, GPIOC_reg)) & GPIOC_EOLC_mask)) { for (i = 0; i < 1000; i++) {} // small wait } @@ -216,6 +230,16 @@ double ADC_read(mf624_state_t* mfst, adc_channel_t channel) return 10.0 * ((int16_t) (result << 2)) / (double) 0x8000; } +extern uint32_t IRC_mode_change(mf624_state_t* mfst, uint32_t change_mask, uint32_t change_val) +{ + /* This sequence should be protected by mutex to protect changes in multirate systems */ + mfst->IRC_mode = (mfst->IRC_mode & ~change_mask) | (change_val & change_mask); + mf624_write32(mfst->IRC_mode, MFST2REG(mfst, 4, IRCCTRL_reg)); + /*printf("change_mask 0x%08x, change_val 0x%08x\n", change_mask, change_val);*/ + /*printf("IRC mode set to %08lx\n", mfst->IRC_mode);*/ + return mfst->IRC_mode; +} + static int open_device(char* path) { int device_fd; @@ -359,7 +383,7 @@ static void run_simple_tests(char* dev_name) if (status != -1) { printf(" Probably OK\n"); } - + printf("Tring to disable interrupts\n"); status = disable_interrupts(device_fd); if (status != -1) { @@ -422,15 +446,15 @@ static int mmap_regions(mf624_state_t* mfst) -/** +/** * Try to initialize the MF624 UIO driver. * * If and only if S is not NULL and initialization fails, then * ssSetErrorStatus() gets called to report the error via Simulink * interface. - * + * * @param S Pointer to SimStruct for error reporting or NULL. - * + * * @return Zero in case of success, -1 in case of error. */ int mf624_init(SimStruct *S) @@ -473,14 +497,16 @@ int mf624_done() mfst = NULL; } } + + return 0; } -/** +/** * Check whether MF624 card is initialized. - * - * @param S - * + * + * @param S + * * @return Zero if MF624 is initialized, -1 othewise. */ int mf624_check(SimStruct *S) @@ -549,7 +575,7 @@ int mf624_check(SimStruct *S) 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);