From 073f5093ddecf5f982c44cd6b3b868739ac91470 Mon Sep 17 00:00:00 2001 From: tkl Date: Mon, 15 Aug 2016 22:25:35 +0200 Subject: [PATCH] gpio toggle works --- .../include/stm32f4-discovery.h | 70 ++++-- .../stm32f4xx/driver/include/stm32_sys_tick.h | 49 ---- .../stm32f4xx/driver/include/stm32f4_gpio.h | 2 - .../stm32f4xx/driver/include/stm32f4_pwm.h | 40 ---- .../stm32f4xx/driver/include/stm32f4_uart.h | 65 ------ source/firmware/kernel/driver/driver.c | 16 +- source/firmware/kernel/driver/driver.mk | 4 +- source/firmware/kernel/driver/include/rtc.h | 161 ------------- source/firmware/kernel/driver/rtc.c | 218 ------------------ .../kernel/driver/{uart.c => uart._c} | 0 source/firmware/kernel/include/sys_tick.h | 2 +- source/firmware/kernel/interface/driver.h | 13 +- source/firmware/kernel/shell.c | 10 +- source/firmware/kernel/shell_commands.c | 26 +-- source/firmware/kernel/sys_tick.c | 3 +- source/test/src/main.c | 13 +- 16 files changed, 99 insertions(+), 593 deletions(-) delete mode 100755 source/firmware/arch/stm32f4xx/driver/include/stm32_sys_tick.h delete mode 100644 source/firmware/arch/stm32f4xx/driver/include/stm32f4_pwm.h delete mode 100644 source/firmware/arch/stm32f4xx/driver/include/stm32f4_uart.h delete mode 100755 source/firmware/kernel/driver/include/rtc.h delete mode 100755 source/firmware/kernel/driver/rtc.c rename source/firmware/kernel/driver/{uart.c => uart._c} (100%) diff --git a/source/firmware/arch/stm32f4xx/board/stm32f4-discovery/include/stm32f4-discovery.h b/source/firmware/arch/stm32f4xx/board/stm32f4-discovery/include/stm32f4-discovery.h index c715c95..01260a3 100755 --- a/source/firmware/arch/stm32f4xx/board/stm32f4-discovery/include/stm32f4-discovery.h +++ b/source/firmware/arch/stm32f4xx/board/stm32f4-discovery/include/stm32f4-discovery.h @@ -6,25 +6,48 @@ #ifndef BSP_STM32F4_DISCOVERY_H_ #define BSP_STM32F4_DISCOVERY_H_ -#define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */ - #include #include - -#include "driver.h" -#include "gpio.h" +#if 0 +#include "../../../../../kernel/include/sys_tick.h" +#include "../../../driver/include/stm32_sys_tick.h" +#include "../../../driver/include/stm32f4_pwm.h" +#include "../../../driver/include/stm32f4_uart.h" #include "pwm.h" #include "timer.h" #include "uart.h" #include "ringbuffer.h" -#include "sys_tick.h" +#endif #include "stm32f4xx.h" +#include "gpio.h" #include "stm32f4_gpio.h" -#include "stm32f4_pwm.h" -#include "stm32f4_uart.h" -#include "stm32_sys_tick.h" +#include "driver.h" + +// GPIO_D12 +static const GPIO_InitTypeDef port_cfg_d12 = { + .Pin = GPIO_PIN_12, + .Mode = GPIO_MODE_OUTPUT_PP, + .Speed = GPIO_SPEED_FREQ_HIGH, + .Pull = GPIO_PULLUP, +}; + +static const struct stm32f4_gpio stm32_f4_gpio_d12 = { + .port = GPIOD, + .pin = &port_cfg_d12, +}; + +static const struct gpio __gpio_d12 = { + (void*)&stm32_f4_gpio_d12, + &gpio_fp +}; + +const struct driver gpio_d12 = { + DRIVER_TYPE_GPIO, + &__gpio_d12, +}; +#if 0 // SYSTEM TICK static const enum stm32_sys_tick_time_base stm23_sys_tick_time_base = STM32_SYS_TICK_TIME_BASE_MS; @@ -38,7 +61,8 @@ static const struct loki_timer timer_1 = { (void*)&stm32_sys_tick, &timer_fp }; - +#endif +#if 0 // PWM CHANNEL 4 /* apb1 clock = 84MHz */ /* period_reg = src_clk / presc / cnt_clk */ @@ -93,7 +117,8 @@ const struct driver pwm_4 = { DRIVER_TYPE_PWM, &pwm_ch4, }; - +#endif +#if 0 // PWM Channel 3 static const GPIO_InitTypeDef port_cfg_D14 = { .GPIO_Pin = GPIO_Pin_14, @@ -126,7 +151,8 @@ const struct driver pwm_3 = { DRIVER_TYPE_PWM, &pwm_ch3, }; - +#endif +#if 0 // PWM Channel 2 static const GPIO_InitTypeDef port_cfg_D13 = { .GPIO_Pin = GPIO_Pin_13, @@ -159,7 +185,8 @@ const struct driver pwm_2 = { DRIVER_TYPE_PWM, &pwm_ch2, }; - +#endif +#if 0 // PWM Channel 1 static const GPIO_InitTypeDef port_cfg_D12 = { .GPIO_Pin = GPIO_Pin_12, @@ -192,7 +219,8 @@ const struct driver pwm_1 = { DRIVER_TYPE_PWM, &pwm_ch1, }; - +#endif +#if 0 // UART 1 static char console_linear_buffer[80]; static struct ringbuffer console_buffer = { @@ -252,7 +280,8 @@ const struct driver uart_1 = { DRIVER_TYPE_UART, &__uart_1, }; - +#endif +#if 0 // GPIOC0 static const GPIO_InitTypeDef port_cfg_C0 = { GPIO_Pin_0, @@ -284,7 +313,8 @@ const struct driver gpio_c0 = { DRIVER_TYPE_GPIO, &__gpio_c0, }; - +#endif +#if 0 // GPIO_C1 static const GPIO_InitTypeDef port_cfg_C1 = { GPIO_Pin_1, @@ -316,7 +346,8 @@ const struct driver gpio_c1 = { DRIVER_TYPE_GPIO, &__gpio_c1, }; - +#endif +#if 0 // GPIO_C2 static const GPIO_InitTypeDef port_cfg_C2 = { GPIO_Pin_2, @@ -348,7 +379,8 @@ const struct driver gpio_c2 = { DRIVER_TYPE_GPIO, &__gpio_c2, }; - +#endif +#if 0 // GPIO_C3 static const GPIO_InitTypeDef port_cfg_C3 = { GPIO_Pin_3, @@ -380,7 +412,7 @@ const struct driver gpio_c3 = { DRIVER_TYPE_GPIO, &__gpio_c3, }; - +#endif //! \brief Setup the hardware of the stm32f4-discovery board. void board_init(void); diff --git a/source/firmware/arch/stm32f4xx/driver/include/stm32_sys_tick.h b/source/firmware/arch/stm32f4xx/driver/include/stm32_sys_tick.h deleted file mode 100755 index 3535975..0000000 --- a/source/firmware/arch/stm32f4xx/driver/include/stm32_sys_tick.h +++ /dev/null @@ -1,49 +0,0 @@ -//! \file stm32_sys_tick.h -//! \author tkl -//! \date Feb 15, 2012 -//! \brief Header file of the stm32f10x architecture dependent sys tick timer implementation. -#ifndef STM32_SYS_TICK_H_ -#define STM32_SYS_TICK_H_ - -#include "timer.h" - -typedef void* (*stm32_sys_tick_cb_t)(void*); //!< callback for the external interrupt - -//! \brief Type of sys tick base time. -enum stm32_sys_tick_time_base { - STM32_SYS_TICK_TIME_BASE_NONE = 0, //!< Not init - STM32_SYS_TICK_TIME_BASE_US, //!< Tick time = 1 us. - STM32_SYS_TICK_TIME_BASE_MS //!< Tick time = 1 ms. -}; - -//! \brief The sys tick device. -struct stm32_sys_tick { - const enum stm32_sys_tick_time_base *tick_time_base; //!< time base for the system tick - stm32_sys_tick_cb_t sys_tick_cb; //!< callback for the sys tick interrupt - void *sys_tick_cb_param; //!< parameter for the callback -}; - -//! \brief Open a sys tick timer. -//! \param sys_tick The sys tick to open. Must be of type const stm32_sys_tick_t*. -//! \return -1 in error case. -int stm32_sys_tick_open(const void *sys_tick); - -//! \brief Close a sys tick timer. -//! \param sys_tick The sys tick to close. Must be of type const stm32_sys_tick_t*. -//! \return -1 in error case. -int stm32_sys_tick_close(const void *sys_tick); - -//! \brief Set the call back for a sys tick timer. -//! \param sys_tick The sys tick to open. Mus be of type const stm32_sys_tick_t*. -//! \param callback The function pointer of the call back function. -//! \param param The parameter for the call back function. -//! \return -1 in error case. -int stm32_sys_tick_set_cb(const void *sys_tick, const void *callback, const void *param); - -static const struct timer_fp timer_fp = { - stm32_sys_tick_open, - stm32_sys_tick_close, - stm32_sys_tick_set_cb -}; - -#endif /* STM32_SYS_TICK_H_ */ diff --git a/source/firmware/arch/stm32f4xx/driver/include/stm32f4_gpio.h b/source/firmware/arch/stm32f4xx/driver/include/stm32f4_gpio.h index f4e2e50..70b1ac1 100755 --- a/source/firmware/arch/stm32f4xx/driver/include/stm32f4_gpio.h +++ b/source/firmware/arch/stm32f4xx/driver/include/stm32f4_gpio.h @@ -12,8 +12,6 @@ typedef void* (*gpio_ext_it_cb_t)(void*); struct stm32f4_gpio { GPIO_TypeDef *port; //!< Gpio port const GPIO_InitTypeDef *pin; //!< Gpio pin - gpio_ext_it_cb_t ext_it_cb; //!< Gpio ext it callback (could be NULL) - void *param; //!< Parameter for the callback }; //! \brief Open a gpio. diff --git a/source/firmware/arch/stm32f4xx/driver/include/stm32f4_pwm.h b/source/firmware/arch/stm32f4xx/driver/include/stm32f4_pwm.h deleted file mode 100644 index c46174f..0000000 --- a/source/firmware/arch/stm32f4xx/driver/include/stm32f4_pwm.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * stm32f4_pwm.h - * - * Created on: Aug 9, 2016 - * Author: tkl - */ - -#ifndef SOURCE_FIRMWARE_ARCH_STM32F4XX_DRIVER_INCLUDE_STM32F4_PWM_H_ -#define SOURCE_FIRMWARE_ARCH_STM32F4XX_DRIVER_INCLUDE_STM32F4_PWM_H_ - -enum stm32f4_pwm_channel { - channel_1 = 1, - channel_2, - channel_3, - channel_4 -}; - -struct stm32f4_pwm { - TIM_TypeDef *timer; - const TIM_TimeBaseInitTypeDef *timer_cfg; - const TIM_OCInitTypeDef *output_compare_cfg; - const TIM_BDTRInitTypeDef *bdtr_cfg; - GPIO_TypeDef *port; - uint8_t pin_src; - const GPIO_InitTypeDef *port_cfg; - enum stm32f4_pwm_channel channel; -}; - - -int stm32f4_pwm_open(const void *pwm); -int stm32f4_pwm_close(const void *pwm); -int stm32f4_pwm_set_duty_cycle(const void *pwm, unsigned int duty_cycle_percent); - -static const struct pwm_fp stm32f4_pwm_fp = { - .open = stm32f4_pwm_open, - .close = stm32f4_pwm_close, - .set_duty_cycle = stm32f4_pwm_set_duty_cycle, -}; - -#endif /* SOURCE_FIRMWARE_ARCH_STM32F4XX_DRIVER_INCLUDE_STM32F4_PWM_H_ */ diff --git a/source/firmware/arch/stm32f4xx/driver/include/stm32f4_uart.h b/source/firmware/arch/stm32f4xx/driver/include/stm32f4_uart.h deleted file mode 100644 index ac3aa1d..0000000 --- a/source/firmware/arch/stm32f4xx/driver/include/stm32f4_uart.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - * stm32_uart.h - * - * Created on: Jul 24, 2016 - * Author: tkl - */ - -#ifndef SOURCE_FIRMWARE_ARCH_STM32F4XX_DRIVER_UART_STM32_UART_H_ -#define SOURCE_FIRMWARE_ARCH_STM32F4XX_DRIVER_UART_STM32_UART_H_ - -#include "driver.h" -#include "uart.h" - -//! \brief Stm32f4 uart device. -struct stm32f4_uart { - const GPIO_InitTypeDef *gpio_init; - GPIO_TypeDef *gpio_port; - uint8_t pin_src_rx; - uint8_t pin_src_tx; - const USART_InitTypeDef *usart_init; - USART_TypeDef *usart_port; - uint16_t usart_it_select; - const NVIC_InitTypeDef *nvic_init; -}; - -//! \brief Open an uart device. -//! \param this The uart to open. -//! \retval -1 in error case. -int stm32f4_uart_open(const void *this); - -//! \brief Close an uart device. -//! \param this The uart to close. -//! \retval -1 in error case. -int stm32f4_uart_close(const void *this); - -//! \brief Read from an uart device. -//! \param this The uart to read from. -//! \param buffer The buffer to read to. -//! \param len The length of the buffer. -//! \retval -1 in error case, otherwise number of read characters. -int stm32f4_uart_read(const void *this, char *buffer, int len); - -//! \brief Write to an uart device. -//! \param this The uart to write to. -//! \param buffer The buffer to write. -//! \param len The number of characters to write. -//! \retval -1 in error case, otherwise number of written characters. -int stm32f4_uart_write(const void *this, const char *buffer, int len); - -//! \brief Set a callback for interrupt handling of the uart. -//! \param this The uart. -//! \param callback The callback to execute in interrupt case. -//! \param param The argument for the callback. -//! \retval -1 in error case. -int stm32f4_uart_set_cb(const void *this, const void *callback, const void *param); - -static const struct uart_fp stm32f4_uart_fp = { - stm32f4_uart_open, - stm32f4_uart_close, - stm32f4_uart_read, - stm32f4_uart_write, - stm32f4_uart_set_cb -}; - -#endif /* SOURCE_FIRMWARE_ARCH_STM32F4XX_DRIVER_UART_STM32_UART_H_ */ diff --git a/source/firmware/kernel/driver/driver.c b/source/firmware/kernel/driver/driver.c index 654c647..9eb7bb3 100644 --- a/source/firmware/kernel/driver/driver.c +++ b/source/firmware/kernel/driver/driver.c @@ -16,7 +16,7 @@ #include "spi.h" #include "uart.h" -int open(const struct driver *driver) +int drv_open(const struct driver *driver) { int ret = -1; if(NULL == driver) @@ -35,19 +35,19 @@ int open(const struct driver *driver) ret = pwm_open((const struct pwm *)(driver->device_driver)); break; case DRIVER_TYPE_RTC: - ret = rtc_open((const struct rtc *)(driver->device_driver)); +// ret = rtc_open((const struct rtc *)(driver->device_driver)); break; case DRIVER_TYPE_SPI: ret = spi_open((const struct spi *)(driver->device_driver)); break; case DRIVER_TYPE_UART: - ret = uart_open((const struct uart *)(driver->device_driver)); +// ret = uart_open((const struct uart *)(driver->device_driver)); break; } return ret; } -int close(const struct driver *driver) +int drv_close(const struct driver *driver) { int ret = -1; if(NULL == driver) @@ -78,7 +78,7 @@ int close(const struct driver *driver) return ret; } -int read(const struct driver *driver, char *buffer, int len) +int drv_read(const struct driver *driver, char *buffer, int len) { int ret = -1; if(NULL == driver) @@ -109,7 +109,7 @@ int read(const struct driver *driver, char *buffer, int len) return ret; } -int write(const struct driver *driver, const char *buffer, int len) +int drv_write(const struct driver *driver, const char *buffer, int len) { int ret = -1; if(NULL == driver) @@ -136,13 +136,13 @@ int write(const struct driver *driver, const char *buffer, int len) case DRIVER_TYPE_SPI: break; case DRIVER_TYPE_UART: - ret = uart_write((const struct uart *)(driver->device_driver), buffer, len); +// ret = uart_write((const struct uart *)(driver->device_driver), buffer, len); break; } return ret; } -int ioctl(const struct driver *driver, unsigned int cmd, const void *data) +int drv_ioctl(const struct driver *driver, unsigned int cmd, const void *data) { int ret = -1; if(NULL == driver) diff --git a/source/firmware/kernel/driver/driver.mk b/source/firmware/kernel/driver/driver.mk index a26ed25..8ca3108 100755 --- a/source/firmware/kernel/driver/driver.mk +++ b/source/firmware/kernel/driver/driver.mk @@ -1,4 +1,2 @@ -CHECK_FOLDER += source/firmware/kernel/driver -SUB_FOLDER += source/firmware/kernel/driver +SRC_DIR += source/firmware/kernel/driver INCLUDES += source/firmware/kernel/driver/include -DOC_SRC += source/firmware/kernel/driver diff --git a/source/firmware/kernel/driver/include/rtc.h b/source/firmware/kernel/driver/include/rtc.h deleted file mode 100755 index 30add14..0000000 --- a/source/firmware/kernel/driver/include/rtc.h +++ /dev/null @@ -1,161 +0,0 @@ -//! \file rtc.h -//! \author tkl -//! \date Jul 8, 2012 -//! \brief Header file of the architecture independent rtc implementation. -#ifndef RTC_H_ -#define RTC_H_ - -#include - -//----------------------------------------------------------------------------- -//! \brief Loki time container. -struct loki_time { - uint32_t sec; //!< Seconds. [0-60] - uint32_t min; //!< Minutes. [0-59] - uint32_t hour; //!< Hours. [0-23] - uint32_t day; //!< Day. [1-31] - uint32_t mon; //!< Month. [0-11] - uint32_t year; //!< Year. -}; - - -//----------------------------------------------------------------------------- -//! \brief Rtc interrupt interval. -enum rtc_interval { - RTC_INTERVAL_MINUTE = 0, //!< rtc interrupt every minute. - RTC_INTERVAL_HOUR, //!< rtc interrupt every hour. - RTC_INTERVAL_MIDNIGHT, //!< rtc interrupt every day at 00:00. - RTC_INTERVAL_NOON //!< rtc interrupt every day at 12:00. -}; - -//----------------------------------------------------------------------------- -//! \brief Rtc alarm mask. -enum rtc_alarm_mask { - RTC_ALARM_DISABLED = 0x00, //!< Alarm mask disabled. - RTC_ALARM_MINUTE = 0x01, //!< Alarm mask minute. - RTC_ALARM_HOUR = 0x02, //!< Alarm mask hour. - RTC_ALARM_DAY_OF_WEEK = 0x04, //!< Alarm mask day of week. - RTC_ALARM_DAY_OF_MONTH = 0x08 //!< Alarm mask day of month. -}; - -//----------------------------------------------------------------------------- -//! Callback for the open function of the arch depended rtc driver. -typedef int (*rtc_fp_open_t)(const void*); - -//! Callback for the close function of the arch depended rtc driver. -typedef int (*rtc_fp_close_t)(const void*); - -//! Callback for the time set function of the arch depended rtc driver. -typedef void (*rtc_fp_set_time_t)(const void*, const struct loki_time*); - -//! Callback for the time get function of the arch depended rtc driver. -typedef struct loki_time *(*rtc_fp_get_time_t)(const void*, struct loki_time*); - -//! Callback for the start interval event function. -typedef int (*rtc_fp_start_interval_event) - (const void *, enum rtc_interval, const void *, const void *); - -//! Callback for the stop interval event. -typedef int (*rtc_fp_stop_interval_event)(const void *); - -//! Callback for the start alarm event. -typedef int (*rtc_fp_start_alarm_event) - (const void *, const struct loki_time*, enum rtc_alarm_mask, const void *, const void *); - -//! Callback for the stop alarm event. -typedef int (*rtc_fp_stop_alarm_event)(const void *); - -//----------------------------------------------------------------------------- -//! \brief Function pointer to access the rct driver. -struct rtc_fp { - const rtc_fp_open_t open; //!< Function pointer to the open function. - const rtc_fp_close_t close; //!< Function pointer to the close function. - const rtc_fp_set_time_t set_time; //!< Function pointer to the set_time function. - const rtc_fp_get_time_t get_time; //!< Function pointer to the get_time function. - const rtc_fp_start_interval_event start_interval; //!< Function pointer to the start_interval function. - const rtc_fp_stop_interval_event stop_interval; //!< Function pointer to the stop_interval function. - const rtc_fp_start_alarm_event start_alarm; //!< Function pointer to the start_alarm function. - const rtc_fp_stop_alarm_event stop_alarm; //!< Function pointer to the stop_alarm function. -}; - -//----------------------------------------------------------------------------- -//! \brief Contains the architecture depended device and the access functions to the rtc driver. -struct rtc { - const void *arch_dep_device; //!< Architecture depended rtc device (i.e. msp430_rtc_t). - const struct rtc_fp *fp; //!< Function pointer for the rtc driver access. -}; - -//----------------------------------------------------------------------------- -//! \brief Open a rtc device. -//! \param device The rtc device to open. -//! \retval -1 in error case. -int rtc_open(const struct rtc *device); - -//----------------------------------------------------------------------------- -//! \brief Close a rtc device. -//! \param device The rtc device to close. -//! \retval -1 in error case. -int rtc_close(const struct rtc *device); - -//----------------------------------------------------------------------------- -//! \brief Set rtc time. -//! \param device The rtc device. -//! \param time The time to set. -void rtc_set_time(const struct rtc *device, const struct loki_time *time); - -//----------------------------------------------------------------------------- -//! \brief Get rtc time. -//! \param device The rtc device. -//! \param time The time to get. -//! \retval NULL in error case, otherwise points to time. -struct loki_time *rtc_get_time(const struct rtc *device, - struct loki_time *time); - -//----------------------------------------------------------------------------- -//! \brief Converts a Unix timestamp to a loki_time. -//! \param tick The Unix timestamp. -//! \return the converted time. -struct loki_time tick_to_time(uint32_t tick); - -//----------------------------------------------------------------------------- -//! \brief Converts a loki_time to aunix timestamp. -//! \param time The time to convert. -//! \return The converted unix timestamp. -uint32_t time_to_tick(const struct loki_time *time); - -//----------------------------------------------------------------------------- -//! \brief Starts a rtc interval event. -//! On every occurance of interval the rtc event gets fired. -//! \param device The rtc device. -//! \param interval The interval of rtc event occurance. -//! \param callback The callback is executed in case of interval event. -//! \param argument The argument for the callback. -//! \retval -1 in error case. -int rtc_start_interval_event(const struct rtc *device, enum rtc_interval interval, - const void * callback, const void *argument); - -//----------------------------------------------------------------------------- -//! \brief Stops a rtc interval event. -//! \param device The rtc device. -//! \retval -1 in error case. -int rtc_stop_interval_event(const struct rtc *device); - -//----------------------------------------------------------------------------- -//! \brief Starts a rtc alarm event. -//! \param device The rtc device. -//! \param alarm_time The time to fire the alarm. -//! \param alarm_mask The mask to filter the alarm time. -//! \param callback The callback is executed in case of alarm. -//! \param argument The argument for the callback. -//! \retval -1 in error case. -int rtc_start_alarm_event(const struct rtc *device, - const struct loki_time *alarm_time, enum rtc_alarm_mask alarm_mask, - const void * callback, const void *argument); - -//----------------------------------------------------------------------------- -//! \brief Stops a rtc alarm. -//! \param device The rtc device. -//! \retval -1 in error case. -int rtc_stop_alarm_event(const struct rtc *device); - -#endif /* RTC_H_ */ diff --git a/source/firmware/kernel/driver/rtc.c b/source/firmware/kernel/driver/rtc.c deleted file mode 100755 index cb1a4b4..0000000 --- a/source/firmware/kernel/driver/rtc.c +++ /dev/null @@ -1,218 +0,0 @@ -//! \file rtc.c -//! \author tkl -//! \date Jul 8, 2012 -//! \brief Source file of the architecture independent rtc implementation. -#include -#include -#include -#include "rtc.h" - -//----------------------------------------------------------------------------- -int rtc_open(const struct rtc *device) { - if(NULL == device) { - return (-1); - } - - rtc_fp_open_t open = device->fp->open; - return (open(device->arch_dep_device)); -} - -//----------------------------------------------------------------------------- -int rtc_close(const struct rtc *device) { - if(NULL == device) { - return (-1); - } - - rtc_fp_close_t close = device->fp->close; - return (close(device->arch_dep_device)); -} - -//----------------------------------------------------------------------------- -void rtc_set_time(const struct rtc *device, const struct loki_time *time) { - if(NULL == device) { - return; - } - - rtc_fp_set_time_t set_time = device->fp->set_time; - set_time(device->arch_dep_device, time); -} - -//----------------------------------------------------------------------------- -struct loki_time *rtc_get_time(const struct rtc *device, struct loki_time *time) { - if(NULL == device) { - return (NULL); - } - - rtc_fp_get_time_t get_time = device->fp->get_time; - return (get_time(device->arch_dep_device, time)); -} - -#ifndef __isleap -//! Nonzero if YEAR is a leap year (every 4 years, except every 100th isn't, and every 400th is). -#define __isleap(year) \ - ((year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0)) -#endif - -//! Seconds per hour. -#define SECS_PER_HOUR (long)(60 * 60) - -//! Seconds per day. -#define SECS_PER_DAY (long)(SECS_PER_HOUR * 24) - -//! Clocks per sec. -#define CLOCKS_PER_SEC 1000 - - -static const uint8_t __mon_lengths[2][12] = { - { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }, /* Normal years. */ - { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 } /* Leap years. */ -}; - -//----------------------------------------------------------------------------- -uint32_t time_to_tick(const struct loki_time *time) { - if(NULL == time) { - return (0); - } - uint32_t ret = 0; - uint32_t year = time->year - 1970; - ret = time->sec + time->min * 60 + time->hour * 3600; - uint32_t days_in_year = 0; - switch(time->mon) { - case 1: - days_in_year = time->day; - break; - case 2: - days_in_year = time->day + 31; - break; - case 3: - days_in_year = time->day + 31 + 28; - break; - case 4: - days_in_year = time->day + 31 + 28 + 31; - break; - case 5: - days_in_year = time->day + 31 + 28 + 31 + 30; - break; - case 6: - days_in_year = time->day + 31 + 28 + 31 + 30 + 31; - break; - case 7: - days_in_year = time->day + 31 + 28 + 31 + 30 + 31 + 30; - break; - case 8: - days_in_year = time->day + 31 + 28 + 31 + 30 + 31 + 30 + 31; - break; - case 9: - days_in_year = time->day + 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31; - break; - case 10: - days_in_year = time->day + 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30; - break; - case 11: - days_in_year = time->day + 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31; - break; - case 12: - days_in_year = time->day + 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30; - break; - } - if(days_in_year > 0) { - days_in_year--; - } - uint32_t leap_days = 0; - uint32_t y = time->year; - while(y >= 1970) { - leap_days += __isleap(y) ? 1 : 0; - y--; - } - if(__isleap(time->year)) { - if(days_in_year < 59) { - if(leap_days > 0) { - leap_days--; - } - } - } - ret += (days_in_year + leap_days) * 60 * 60 * 24; - ret += (year * 60 * 60 * 24 * 365); - return (ret); -} - -//----------------------------------------------------------------------------- -struct loki_time tick_to_time(uint32_t tick) { - struct loki_time ret; - uint32_t days, rem; - uint32_t y; - char *ip; - - days = tick / SECS_PER_DAY; - rem = tick % SECS_PER_DAY; - while (rem < 0) { - rem += SECS_PER_DAY; - --days; - } - while (rem >= SECS_PER_DAY) { - rem -= SECS_PER_DAY; - ++days; - } - ret.hour = rem / SECS_PER_HOUR; - rem %= SECS_PER_HOUR; - ret.min = rem / 60; - ret.sec = rem % 60; - y = 1970; - while (days >= (rem = __isleap(y) ? 366 : 365)) { - ++y; - days -= rem; - } - while (days < 0) { - --y; - days += __isleap(y) ? 366 : 365; - } - ret.year = y; - ip = (char *)__mon_lengths[__isleap(y)]; - for (y = 0; days >= ip[y]; ++y) - days -= ip[y]; - ret.mon = y + 1; - ret.day = days + 1; - return (ret); -} - - -//----------------------------------------------------------------------------- -int rtc_start_interval_event(const struct rtc *device, enum rtc_interval interval, - const void *callback, const void *argument) { - if(NULL == device) { - return (-1); - } - rtc_fp_start_interval_event start_interval = device->fp->start_interval; - return (start_interval(device->arch_dep_device, interval, callback, argument)); -} - -//----------------------------------------------------------------------------- -int rtc_stop_interval_event(const struct rtc *device) { - if(NULL == device) { - return (-1); - } - rtc_fp_stop_interval_event stop_interval = device->fp->stop_interval; - return (stop_interval(device->arch_dep_device)); -} - -//----------------------------------------------------------------------------- -int rtc_start_alarm_event(const struct rtc *device, - const struct loki_time *alarm_time, enum rtc_alarm_mask alarm_mask, - const void *callback, const void *argument) -{ - if(NULL == device) { - return (-1); - } - rtc_fp_start_alarm_event start_alarm = device->fp->start_alarm; - return (start_alarm(device->arch_dep_device, alarm_time, alarm_mask, - callback, argument)); -} - -//----------------------------------------------------------------------------- -int rtc_stop_alarm_event(const struct rtc *device) { - if(NULL == device) { - return (-1); - } - rtc_fp_stop_alarm_event stop_alarm = device->fp->stop_alarm; - return (stop_alarm(device->arch_dep_device)); -} diff --git a/source/firmware/kernel/driver/uart.c b/source/firmware/kernel/driver/uart._c similarity index 100% rename from source/firmware/kernel/driver/uart.c rename to source/firmware/kernel/driver/uart._c diff --git a/source/firmware/kernel/include/sys_tick.h b/source/firmware/kernel/include/sys_tick.h index 31e15bf..2a6d94f 100644 --- a/source/firmware/kernel/include/sys_tick.h +++ b/source/firmware/kernel/include/sys_tick.h @@ -8,6 +8,6 @@ #ifndef SYS_TICK_H_ #define SYS_TICK_H_ -void sys_tick_init(const struct loki_timer *hw_timer); +//void sys_tick_init(const struct loki_timer *hw_timer); #endif /* SYS_TICK_H_ */ diff --git a/source/firmware/kernel/interface/driver.h b/source/firmware/kernel/interface/driver.h index 14923d9..e91349d 100644 --- a/source/firmware/kernel/interface/driver.h +++ b/source/firmware/kernel/interface/driver.h @@ -20,15 +20,18 @@ enum driver_type { DRIVER_TYPE_UART }; +#pragma pack(push) +#pragma pack(1) struct driver { enum driver_type driver_type; const void *device_driver; }; +#pragma pack(pop) -int open(const struct driver *driver); -int close(const struct driver *driver); -int read(const struct driver *driver, char *buffer, int len); -int write(const struct driver *driver, const char *buffer, int len); -int ioctl(const struct driver *driver, unsigned int cmd, const void *data); +int drv_open(const struct driver *driver); +int drv_close(const struct driver *driver); +int drv_read(const struct driver *driver, char *buffer, int len); +int drv_write(const struct driver *driver, const char *buffer, int len); +int drv_ioctl(const struct driver *driver, unsigned int cmd, const void *data); #endif /* SOURCE_FIRMWARE_KERNEL_DRIVER_INCLUDE_DRIVER_H_ */ diff --git a/source/firmware/kernel/shell.c b/source/firmware/kernel/shell.c index ba8957c..835d31e 100644 --- a/source/firmware/kernel/shell.c +++ b/source/firmware/kernel/shell.c @@ -43,20 +43,20 @@ static void rx_func(void *arg) char buffer[81]; unsigned int index = 0; int ret = 0; - open(shell_object.shell_device); + drv_open(shell_object.shell_device); while(1) { - ret = read(shell_object.shell_device, &buffer[index], + ret = drv_read(shell_object.shell_device, &buffer[index], sizeof(buffer) / sizeof(buffer[0]) - index - 1); if(ret) { if(shell_object.echo_on) { if((buffer[index + ret - 1] == '\n') && (buffer[index + ret -2] != '\r')) { - write(shell_object.shell_device, "\r\n", 2); + drv_write(shell_object.shell_device, "\r\n", 2); } else if((buffer[index + ret - 1] == '\r') && (buffer[index + ret -2] != '\n')) { - write(shell_object.shell_device, "\r\n", 2); + drv_write(shell_object.shell_device, "\r\n", 2); } else { - write(shell_object.shell_device, &buffer[index], ret); // echo + drv_write(shell_object.shell_device, &buffer[index], ret); // echo } } if((buffer[index + ret - 1] == '\n') || (buffer[index + ret - 1] == '\r')) { diff --git a/source/firmware/kernel/shell_commands.c b/source/firmware/kernel/shell_commands.c index 324e526..81674ce 100644 --- a/source/firmware/kernel/shell_commands.c +++ b/source/firmware/kernel/shell_commands.c @@ -49,14 +49,14 @@ static void *cmd_kosmos_version_cb(const char *cmd) { char *greeter = "Kosmos Version: "; - write(shell_object.shell_device, greeter, strlen(greeter)); - write(shell_object.shell_device, KERNEL_VERSION, strlen(KERNEL_VERSION)); - write(shell_object.shell_device, ".", 1); - write(shell_object.shell_device, MAJOR_VERSION, strlen(MAJOR_VERSION)); - write(shell_object.shell_device, ".", 1); - write(shell_object.shell_device, MINOR_VERSION, strlen(MINOR_VERSION)); - write(shell_object.shell_device, ".", 1); - write(shell_object.shell_device, BUILD_NUMBER, strlen(BUILD_NUMBER)); + drv_write(shell_object.shell_device, greeter, strlen(greeter)); + drv_write(shell_object.shell_device, KERNEL_VERSION, strlen(KERNEL_VERSION)); + drv_write(shell_object.shell_device, ".", 1); + drv_write(shell_object.shell_device, MAJOR_VERSION, strlen(MAJOR_VERSION)); + drv_write(shell_object.shell_device, ".", 1); + drv_write(shell_object.shell_device, MINOR_VERSION, strlen(MINOR_VERSION)); + drv_write(shell_object.shell_device, ".", 1); + drv_write(shell_object.shell_device, BUILD_NUMBER, strlen(BUILD_NUMBER)); return NULL; } @@ -66,14 +66,14 @@ static void *cmd_list_all_commands_cb(const char *cmd) struct list_node *it = shell_object.command_list.front; int i, len = list_get_len(&shell_object.command_list); - write(shell_object.shell_device, greeter, strlen(greeter)); + drv_write(shell_object.shell_device, greeter, strlen(greeter)); for(i = 0; i < (len - 1); i++) { if(NULL != it) { struct command *cmd = (struct command *)it->data; - write(shell_object.shell_device, cmd->command, strlen(cmd->command)); - write(shell_object.shell_device, " - ", 3); - write(shell_object.shell_device, cmd->description, strlen(cmd->description)); - write(shell_object.shell_device, "\r\n", 2); + drv_write(shell_object.shell_device, cmd->command, strlen(cmd->command)); + drv_write(shell_object.shell_device, " - ", 3); + drv_write(shell_object.shell_device, cmd->description, strlen(cmd->description)); + drv_write(shell_object.shell_device, "\r\n", 2); it = it->next; } } diff --git a/source/firmware/kernel/sys_tick.c b/source/firmware/kernel/sys_tick.c index cf18330..c3ec040 100644 --- a/source/firmware/kernel/sys_tick.c +++ b/source/firmware/kernel/sys_tick.c @@ -4,6 +4,8 @@ * Created on: Sep 25, 2015 * Author: tkl */ +#include "include/sys_tick.h" + #include #include @@ -14,7 +16,6 @@ #include "thread.h" #include "schedule.h" #include "kernel.h" -#include "sys_tick.h" struct sys_tick_obj { diff --git a/source/test/src/main.c b/source/test/src/main.c index 865c61a..1cf1eba 100644 --- a/source/test/src/main.c +++ b/source/test/src/main.c @@ -10,6 +10,9 @@ #include "Timer.h" #include "BlinkLed.h" +#include "board.h" +#include "driver.h" + // Keep the LED on for 2/3 of a second. #define BLINK_ON_TICKS (TIMER_FREQUENCY_HZ * 3 / 4) #define BLINK_OFF_TICKS (TIMER_FREQUENCY_HZ - BLINK_ON_TICKS) @@ -26,12 +29,16 @@ int main(int argc, char* argv[]) trace_puts("Hello ARM World!"); trace_printf("System clock: %u Hz\n", SystemCoreClock); timer_start(); - blink_led_init(); +// blink_led_init(); uint32_t seconds = 0; + drv_open(&gpio_d12); + drv_write(&gpio_d12, "1", 1); while(1) { - blink_led_on(); +// blink_led_on(); + drv_write(&gpio_d12, "1", 1); timer_sleep(seconds == 0 ? TIMER_FREQUENCY_HZ : BLINK_ON_TICKS); - blink_led_off(); +// blink_led_off(); + drv_write(&gpio_d12, "0", 1); timer_sleep(BLINK_OFF_TICKS); ++seconds; trace_printf("Second %u\n", seconds);