/**************************************************************************** * apps/platform/mikroe-stm32f4/mikroe_configdata.c * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. The * ASF licenses this file to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. * ****************************************************************************/ /**************************************************************************** * Included Files ****************************************************************************/ #include #include #include #include #include #include #include #include "platform/configdata.h" #include #include #ifdef CONFIG_PLATFORM_CONFIGDATA /**************************************************************************** * Public Functions ****************************************************************************/ /**************************************************************************** * Name: platform_setconfig * * Description: * Save platform-specific configuration data * * Input Parameter: * id - Defines the class of configuration data * instance - Defines which instance of configuration data. For example, * if a board has two networks, then there would be two MAC * addresses: instance 0 and instance 1 * configdata - The new configuration data to be saved * datalen - The size of the configuration data in bytes. * * Returned Value: * This is an end-user function, so it follows the normal convention: * Returns the OK (zero) on success. On failure, it.returns -1 (ERROR) and * sets errno appropriately. * * Values for the errno would include: * * EINVAL - The configdata point is invalid * ENOSYS - The request ID/instance is not supported on this platform * * Other errors may be returned from lower level drivers on failure to * write to the underlying media (if applicable) * ****************************************************************************/ int platform_setconfig(enum config_data_e id, int instance, FAR const uint8_t *configdata, size_t datalen) { #ifdef CONFIG_MIKROE_STM32F4_CONFIGDATA_FS FILE *fd; #endif #ifdef CONFIG_MIKROE_STM32F4_CONFIGDATA_PART struct config_data_s config; int ret; int fd; /* Try to open the /dev/config device file */ if ((fd = open("/dev/config", O_RDOK)) == -1) { /* Error opening the config device */ return -1; } /* Setup structure for the SETCONFIG ioctl */ config.id = (enum config_data_e)id; config.instance = instance; config.configdata = (FAR uint8_t *) configdata; config.len = datalen; ret = ioctl(fd, CFGDIOC_SETCONFIG, (unsigned long) &config); close(fd); return ret; #else /* CONFIG_MIKROE_STM32F4_CONFIGDATA_PART */ switch (id) { case CONFIGDATA_TSCALIBRATION: #ifdef CONFIG_MIKROE_STM32F4_CONFIGDATA_FS /* Save config data in a file on the filesystem. Try to open * the file. */ fd = fopen(CONFIG_MIKROE_STM32F4_CONFIGDATA_FILENAME, "w+"); if (fd == NULL) { /* Error opening the file */ errno = ENOENT; return -1; } /* Write data to the file. For now, we only support one entry, but * may / will expand it later. */ fwrite(&id, sizeof(id), 1, fd); fwrite(&instance, sizeof(instance), 1, fd); fwrite(configdata, 1, datalen, fd); /* CLose the file and exit */ fclose(fd); return OK; #elif defined(CONFIG_MIKROE_STM32F4_CONFIGDATA_ROM) /* We are reading from a read-only system, so nothing to do. */ return OK; #else break; #endif /* CONFIG_MIKROE_STM32F4_CONFIGDATA_ROM */ default: break; } errno = ENOSYS; return -1; #endif /* CONFIG_MIKROE_STM32F4_CONFIGDATA_PART */ } /**************************************************************************** * Name: platform_getconfig * * Description: * Get platform-specific configuration data * * Input Parameter: * id - Defines the class of configuration data * instance - Defines which instance of configuration data. For example, * if a board has two networks, then there would be two MAC * addresses: instance 0 and instance 1 * configdata - The new configuration data to be saved * datalen - The size of the configuration data in bytes. * * Returned Value: * This is an end-user function, so it follows the normal convention: * Returns the OK (zero) on success. On failure, it.returns -1 (ERROR) and * sets errno appropriately. * * Values for the errno would include: * * EINVAL - The configdata point is invalid * ENOSYS - The request ID/instance is not supported on this platform * * Other errors may be returned from lower level drivers on failure to * write to the underlying media (if applicable) * ****************************************************************************/ int platform_getconfig(enum config_data_e id, int instance, FAR uint8_t *configdata, size_t datalen) { #ifdef CONFIG_MIKROE_STM32F4_CONFIGDATA_FS FILE *fd; size_t bytes; enum config_data_e saved_id; int saved_instance; #elif defined(CONFIG_MIKROE_STM32F4_CONFIGDATA_ROM) static const uint8_t touch_cal_data[] = { 0x9a, 0x2f, 0x00, 0x00, 0x40, 0xbc, 0x69, 0xfe, 0x70, 0x2e, 0x00, 0x00, 0xb8, 0x2d, 0xdb, 0xff }; #endif #ifdef CONFIG_MIKROE_STM32F4_CONFIGDATA_PART struct config_data_s config; int ret; int fd; /* Try to open the /dev/config device file */ if ((fd = open("/dev/config", O_RDOK)) == -1) { /* Error opening the config device */ return -1; } /* Setup structure for the SETCONFIG ioctl */ config.id = (enum config_data_e)id; config.instance = instance; config.configdata = configdata; config.len = datalen; ret = ioctl(fd, CFGDIOC_GETCONFIG, (unsigned long) &config); close(fd); return ret; #else /* CONFIG_MIKROE_STM32F4_CONFIGDATA_PART */ switch (id) { case CONFIGDATA_TSCALIBRATION: #ifdef CONFIG_MIKROE_STM32F4_CONFIGDATA_FS /* Load config data fram a file on the filesystem. Try to open * the file. */ fd = fopen(CONFIG_MIKROE_STM32F4_CONFIGDATA_FILENAME, "r"); if (fd == NULL) { /* Error opening the file */ errno = ENOENT; return -1; } /* Write data to the file. For now, we only support one entry, but * may / will expand it later. */ bytes = fread(&saved_id, sizeof(saved_id), 1, fd); bytes += fread(&saved_instance, sizeof(saved_instance), 1, fd); bytes += fread(configdata, 1, datalen, fd); if (bytes != sizeof(saved_id) + sizeof(saved_instance) + datalen) { /* Error! Not enough data in the file */ errno = EINVAL; fclose(fd); return -1; } /* Close the file and exit */ fclose(fd); return OK; #elif defined(CONFIG_MIKROE_STM32F4_CONFIGDATA_ROM) memcpy(configdata, touch_cal_data, datalen); return OK; #else break; #endif default: break; } errno = ENOSYS; return -1; #endif /* CONFIG_MIKROE_STM32F4_CONFIGDATA_PART */ } #endif /* CONFIG_PLATFORM_CONFIGDATA */