From 9439c6f1caffd938673018f3af7460b33a12528e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karel=20Ko=C4=8D=C3=AD?= Date: Sun, 20 Mar 2016 16:39:30 +0100 Subject: Another work progress --- Kconfig | 127 ++++++++++++++++++++++++++- Makefile | 13 +-- conffile | 65 -------------- docs/index.md | 17 ++-- docs/miscellanoues/jobs_vs_tasks.md | 17 ++++ docs/modules/ioport.md | 153 --------------------------------- docs/modules/spi.md | 69 --------------- docs/modules/tasks.md | 37 -------- docs/modules/timer.md | 0 docs/modules/usart.md | 0 docs/modules/utils/buffer.md | 105 ----------------------- docs/modules/utils/narray.md | 64 -------------- docs/parts/ioport.md | 167 ++++++++++++++++++++++++++++++++++++ docs/parts/jobs.md | 15 ++++ docs/parts/spi.md | 80 +++++++++++++++++ docs/parts/tasks.md | 38 ++++++++ docs/parts/timer.md | 0 docs/parts/usart.md | 23 +++++ docs/parts/utils/buffer.md | 105 +++++++++++++++++++++++ docs/parts/utils/narray.md | 64 ++++++++++++++ docs/usage.md | 1 + examples/blink/Makefile | 8 +- include/can/global.h | 20 ----- include/can/mcp2515.h | 36 -------- include/can/software.h | 9 -- include/spi.h | 10 ++- include/usart.h | 10 +-- include/usi_spi.h | 66 -------------- mkdocs.yml | 19 ++-- src/base.c | 0 src/spi.c | 4 +- src/usart.c | 76 ++++------------ 32 files changed, 694 insertions(+), 724 deletions(-) delete mode 100644 conffile create mode 100644 docs/miscellanoues/jobs_vs_tasks.md delete mode 100644 docs/modules/ioport.md delete mode 100644 docs/modules/spi.md delete mode 100644 docs/modules/tasks.md delete mode 100644 docs/modules/timer.md delete mode 100644 docs/modules/usart.md delete mode 100644 docs/modules/utils/buffer.md delete mode 100644 docs/modules/utils/narray.md create mode 100644 docs/parts/ioport.md create mode 100644 docs/parts/jobs.md create mode 100644 docs/parts/spi.md create mode 100644 docs/parts/tasks.md create mode 100644 docs/parts/timer.md create mode 100644 docs/parts/usart.md create mode 100644 docs/parts/utils/buffer.md create mode 100644 docs/parts/utils/narray.md delete mode 100644 include/can/global.h delete mode 100644 include/can/mcp2515.h delete mode 100644 include/can/software.h delete mode 100644 include/usi_spi.h create mode 100644 src/base.c diff --git a/Kconfig b/Kconfig index b748514..ebafb5b 100644 --- a/Kconfig +++ b/Kconfig @@ -23,6 +23,59 @@ config CONFCFLAGS endmenu +# Tracing and error handling #################################################### + +menu "Tracing and error handling" + +config CONFIG_ERRORS + bool "Errors support" + +if CONFIG_ERRORS + +menu "Errors handling" + +config CONFIG_EH_RESTART + bool "Restart MCU on error detection" + +config CONFIG_EH_MEMORY + bool "TODO: Write error code and possible stack trase to EEPROM" + +config CONFIG_EH_LED + bool "Signal error detection by LED" + depends on CONFIG_IOPORTS + +config CONFIG_EH_LED_IOPIN + string "Error detection led output pin" + depends on CONFIG_EH_LED + default "IO_B0" + ---help--- + Specifies IO pin which will be pulled up on error detection. + This string should be valid IO port (for example "IO_B0") or pair of group + mask divided by comma (for example "IO_B, _BV(0)"). + +config CONFIG_EH_USART + bool "Send error informations by UART" + depends on CONFIG_USART && CONFIG_USART_OUTPUT_BUFFER + +endmenu + +config CONFIG_CHECK_ARGUMENTS + bool "Check arguments for all functions in library" + +endif + +config CONFIG_TRACING + bool "TODO: Tracing support" + +if CONFIG_TRACING + +config CONFIG_TRACE_FUNCTIONCALL + bool "TODO: Trace all function calls in library" + +endif + +endmenu + # IO Ports ###################################################################### config MCUSUPPORT_IOPORTS @@ -92,6 +145,7 @@ config CONFIG_USART_PARITY config CONFIG_USART_DATABITS int "Data bits" default 8 + range 5 8 choice USART_STOPBIT_C prompt "Stop bit" @@ -111,7 +165,8 @@ config CONFIG_USART_OUTPUT_BUFFER config CONFIG_USART_OUTBUFFER_SIZE int "Output buffer size in bytes." if CONFIG_USART_OUTPUT_BUFFER - default 0 if CONFIG_USART_OUTPUT_BUFFER + default 0 if ! CONFIG_USART_OUTPUT_BUFFER + range 1 512000 if CONFIG_USART_OUTPUT_BUFFER default 32 choice USART_OUTBUFFER_MODE_C @@ -134,7 +189,8 @@ config CONFIG_USART_INPUT_BUFFER config CONFIG_USART_INBUFFER_SIZE int "Input buffer size in bytes." if CONFIG_USART_INPUT_BUFFER - default 0 if CONFIG_USART_INPUT_BUFFER + default 0 if ! CONFIG_USART_INPUT_BUFFER + range 1 512000 if CONFIG_USART_INPUT_BUFFER default 32 choice USART_INBUFFER_MODE_C @@ -152,4 +208,71 @@ config CONFIG_USART_INBUFFER_MODE default 2 if USART_INBUFFER_MODE_C_DROP default 0 +config CONFIG_USART_OUTFILE + bool "STD FILE support for output" + depends on CONFIG_USART_OUTPUT_BUFFER + +config CONFIG_USART_INFILE + bool "STD FILE support for input" + depends on CONFIG_USART_INPUT_BUFFER + endif + +# Timers ######################################################################## + +config CONFIG_TIMERS + bool "Timers" + +# Tasks ######################################################################### + +menuconfig CONFIG_TASKS + bool "Taks support" + depends on CONFIG_TIMERS + +if CONFIG_TASKS + +config CONFIG_TASKS_TIME + bool "Measure approximate real time" + +choice TASKS_TIMER + prompt "Timer used for tasks planning and interrupts" + default TASKS_TIMER_2 + +config TASKS_TIMER_0 + bool "Timer0 (8-bit)" + +config TASKS_TIMER_1 + bool "Timer1 (16-bit)" + +config TASKS_TIMER_2 + bool "Timer2 (8-bit asynchronous)" + +endchoice + +endif + +# Jobs ########################################################################## + +menuconfig CONFIG_JOBS + bool "Jobs support" + ---help--- + Job support allows you to plan and execute functions periodically. This is + designed for realtime control. + +if CONFIG_JOBS + +choice JOBS_DURATION + prompt "Jobs duration source" + +config JOBS_DURATION_CONSTANT + bool "Predefined constants" + +config JOBS_DURATION_PREV + bool "Previous execution time" + +config JOBS_DURATION_MAX + bool "Maximum previous time" + +endchoice + +endif diff --git a/Makefile b/Makefile index 0ddb6d8..67aaf49 100644 --- a/Makefile +++ b/Makefile @@ -22,7 +22,7 @@ ifeq (,$(filter clean help docs serve-docs clean-docs config oldconfig \ allyesconfig menuconfig, \ $(MAKECMDGOALS))) # Ignore build targets if goal is not building --include $(O)/build/config.mk # include configuration +include $(CONFIG) # include configuration ### Source files list ########################### SRC = base.c @@ -56,20 +56,15 @@ $(OBJ): $(O)/build/%.o: src/%.c @echo " CC $@" $(Q)$(GCC) $(CFLAGS) -c -o $@ $< -$(DEP): $(O)/build/%.d: src/%.c $(O)/build/config.mk +$(DEP): $(O)/build/%.d: src/%.c $(Q)mkdir -p "$(@D)" @echo " DEP $@" $(Q)$(GCC) -MM -MG -MT '$*.o $@' $(CFLAGS) -c -o $@ $< -$(O)/build/config.mk: $(CONFIG) - $(Q)mkdir -p "$(@D)" - @echo " GEN $(CONFIG).mk" - $(Q)sed 's/="\(.*\)"/=\1/' $(CONFIG) > "$@" - $(O)/build/config.h: $(CONFIG) $(Q)mkdir -p "$(@D)" - @echo " GEN $(CONFIG).h" - $(Q)grep -v "^#" $(CONFIG) | grep "CONFIG_" | sed 's/=/ /;s/^/#define /' > $@ + @echo " GEN $@" + $(Q)grep -v "^#" $(CONFIG) | grep "CONFIG_" | sed 's/="\(.*\)"/=\1/;s/=/ /;s/^/#define /' > $@ # This is not optimal because configuration change results to complete project # rebuild instead of only rebuilding required files. diff --git a/conffile b/conffile deleted file mode 100644 index 6342804..0000000 --- a/conffile +++ /dev/null @@ -1,65 +0,0 @@ -MCU:: - type string - default "atmega328p" - menu "MCU name" - -F_CPU:: - type float - default 16 - menu "CPU frequency" -################################################################################# - -if MCU == "atmega328p" -MCUSUPPORT_SPI: -MCUSUPPORT_USART: -endif - -################################################################################# - -IOE_SPI: MCUSUPPORT_USART - menu "SPI interface" - -group IOE_USART: MCUSUPPORT_SPI - type bool - menu "USART interface" - -IOE_USART_BAUD: - type int<0,> - menu "Baud" - -IOE_USART_PARITY: - type {!None("USART_PARITY_NONE"), Odd("USART_PARITY_ODD"), Even("USART_PARITY_EVEN")} - menu "Parity" - -IOE_USART_STOPBIT: - type {!Single("USART_STOPBIT_SINGLE"), Double("USART_STOPBIT_DOUBLE")} - menu "Number of stop bits" - -IOE_USART_DATABITS: - type int<5,8> - default 8 - menu "Number of data bits" - -IOE_USART_INBUFFER_SIZE: - type int<0,> - menu "USART input buffer size" - help "Defines size of input buffer for USART interface." - " If size is set to 0, no buffer is used." - -IOE_USART_OUTBUFFER_SIZE: - type int<0,> - menu "USART output buffer size" - help "Defines size of output buffer for USART interface." - " If size is set to 0, no buffer is used." -endgroup # IOE_USART - -IOE_CAN_MCP2515: IOE_SPI - menu "MCP2515 CAN controller" - -group SENSORS: - menu "Sensors" - -IOE_SENSOR_DHT22: - menu "DHT22 temperature and humidity sensor" - -endgroup # SENSORS diff --git a/docs/index.md b/docs/index.md index 4c261ff..c39df46 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,10 +1,13 @@ AVR Input/Output expansion ========================== -Modules -------- -| Module | Header | Enable Config | Description | -|-------------------------------|----------|-------------------------------------------|--------------------------------------------------------| -| [IO Ports](modules/ioport.md) | ioport.h | CONFIG_IOPORTS and CONFIG_IOE_PCINTERRUPT | Simple input/output port access | -| [SPI](modules/spi.md) | spi.h | CONFIG_SPI | Serial peripheral interface | -| [USART](modules/usart.md) | usart.h | CONFIG_USART | Universal synchronous/asynchronous receive/transmitter | +Parts +----- +Whole library consists from set of parts. You can use any part directly or +only trough other part. Every part can be enabled or disabled. + +| Parts | Header | Description | +|-------------------------------|----------|--------------------------------------------------------| +| [IO Ports](parts/ioport.md) | ioport.h | Simple input/output port access | +| [SPI](parts/spi.md) | spi.h | Serial peripheral interface | +| [USART](parts/usart.md) | usart.h | Universal synchronous/asynchronous receive/transmitter | diff --git a/docs/miscellanoues/jobs_vs_tasks.md b/docs/miscellanoues/jobs_vs_tasks.md new file mode 100644 index 0000000..17d7fdd --- /dev/null +++ b/docs/miscellanoues/jobs_vs_tasks.md @@ -0,0 +1,17 @@ +Jobs vs. Tasks +============== +This document refers to [Jobs](/parts/jobs.md) and [Tasks](/parts/tasks.md). + +You should be familiar with threads from other platforms. Tasks are from usability +point of view almost same. They are switched according their priority and +availability. Jobs are different. They are designed to execute single function at +the time and when this function exits it executes another. It cant interrupt +execution when more important task come. So why use jobs instead of tasks? Task +requires for their run stack memory and during whole live of task is this memory +taken. This limits number of tasks running. Jobs are sharing same stack and only +one function has data on it at the time. This results in less memory consumption. +Another huge difference is how planing works. Tasks are planned based on priority. +Task with higher priority will run unless it isn't suspended. Jobs don't have +priority, but they have to specify time until they should be finished (deadline) +and duration of execution. With these two parameters jobs planner can plan their +execution. diff --git a/docs/modules/ioport.md b/docs/modules/ioport.md deleted file mode 100644 index e777e0c..0000000 --- a/docs/modules/ioport.md +++ /dev/null @@ -1,153 +0,0 @@ -IO port -======= -To use include: `ioport.md` -And define: `CONFIG_IOE_IOPORT` - -Defines simple access to io ports. This allows runtime access to any pin with just -serialized identifier. - -Most of the functions has group and mask arguments. Group is letter, but in this -library is represented as number and exact number is defined as macro definition. -Mask is one shifted by index number(use \_BV macro). This way can be -addressed all IO ports. Exact identification consult with datasheet. You can also -use more than one index number and control more ports in single group with single -command. - -WARNING: No check is implemented for right group number. Usage of unsupported -value is undefined (write to other parts of memory can happen). - -## References -### For output -#### Function io_setout -```C -static inline void io_setout(uint8_t group, uint8_t mask) -``` -Configures port of `group` with `mask` as output. -Parameters: - group - Character specifying exact port group - mask - Binary shifted 1. Shift is equal to port index in specified group. - -#### Function io_hight -```C -static inline void io_hight(uint8_t group, uint8_t mask) -``` -Sets output port to hight (also can be called as 1). -WARNING: Invoke this only if io_setout is called before. -Parameters: - group - Character specifying exact port group - mask - Binary shifted 1. Shift is equal to port index in specified group. - -#### Function io_low -```C -static inline void io_low(uint8_t group, uint8_t mask) -``` -Sets output port to low (also called as 0). -WARNING: Invoke this only if io_setout is called before. -Parameters: - group - Number specifying exact port group - mask - Binary shifted 1. Shift is equal to port index in specified group. - -#### Function io_set -```C -static inline void io_set(uint8_t group, uint8_t mask, int8_t val) -``` -Sets output port to value passed as argument. -WARNING: Invoke this only if io_setout is called before. -Parameters: - group - Number specifying exact port group - mask - Binary shifted 1. Shift is equal to port index in specified group. - -### For input -#### Function io_setin -```C -static inline void io_setin(uint8_t group, uint8_t mask, - enum ioeIOInResistor resistor) -``` -Configures port of `group` with `mask` as input with specified pull-up/down -resistor. -Parameters: - group - Number specifying exact port group - mask - Binary shifted 1. Shift is equal to port index in specified group. - -#### Function io_get -```C -static inline int8_t io_get(uint8_t group, uint8_t mask) -``` -Returns current value of port. Note that you can use this also if port is -configured as output. -Parameters: - group - Number specifying exact port group - mask - Binary shifted 1. Shift is equal to port index in specified group. - -#### Enum ioeIOInResistor -```C -enum ioeIOInResistor { - IOE_IO_PULLUP, - IOE_IO_PULLDOWN -}; -``` -This enum is used as argument for io_setin. Names should be self explanatory -in this case. - -### Pin change interrupts -#### Function io_change_sethook -```C -int8_t io_change_sethook(uint8_t group, uint8_t mask, uint8_t edge, - void (*change) (uint8_t group, uint8_t mask)) -``` -Registers function `change` as hook for pin change interrupt. `group` and `mask` -specifies port and edge specifies on what edge should hook be called. `edge` can -be IO_RISING or IO_FALLING or their binary combination with operator -`|`. -WARNING: `change` call is call during interrupt handling. You shouldn't be -blocking execution for long time. -Parameters: - group - Number specifying exact port group - mask - Binary shifted 1. Shift is equal to port index in specified group. - edge - Signals on what edge should be hook called. - change - Pointer to function used as interupt hook - -#### Function io_change_remhook -```C -int8_t io_change_remhook(void (*change) (uint8_t group, uint8_t mask)) -``` -Removes `change` hook. -Parameters: - change - Pointer to function used as hook - -### Others -#### Definitions IO_{GROUP} -This defines exact numbers related to data-sheet groups. Always use these -definition not direct numbers, you can ensure cross MCU support this way. - -#### Definitions IO_{GROUP}{INDEX} -Because specifying group and mask as separate parameters is not always optimal, -mcu support file should define all ports in form of single line definition in -format `IOE_IO_{GROUP}{INDEX}`. Disadvantage is that with these definitions you -can't use binary conjunction and so only one pin can be controlled with it. - -## Relevant examples -* blink -* pcinterrupt - -## Adding support -For more information on how add support, see `doc/add_support.md`. -Main definition is `MCUSUPPORT_IOPORT`. Define it to enable support. - -### IO_{GROUP} -This should define any number that is handy for implementation of `IOE_IOE_PIN`, -`IOE_IO_DDR` and `IOE_IO_PORT`. - -### IO_{PIN/DDR/PORT} -These should calculate exact pointers to register `PORT{GROUP}` for PORT variant -and likewise for others with group as argument. Common implementation would be -like this: -```C -#define IOE_IO_PIN(GROUP) (* (volatile uint8_t *)(PINB + 0x3*GROUP)) -``` -### IO_{GROUP}{INDEX} -This should be pair of group and one binary shifted to left relative to index. - -### MCUSUPPORT_PCINT{NUM} -This defines that MCU supports specific pin change interrupt group. Also it -defines value that is number of pins in group. diff --git a/docs/modules/spi.md b/docs/modules/spi.md deleted file mode 100644 index 3ae730c..0000000 --- a/docs/modules/spi.md +++ /dev/null @@ -1,69 +0,0 @@ -Serial peripheral interface -=========================== -This interface is link to MOSI and MISO pins. Also SS pin is used when slave mode initialized. - -## References -### spi\_init -```C -static inline void spi_init(enum spiMode mode) -``` -Initializes SPI interface. -Parameters: - mode - Specify mode of SPI interface - -NOTE: Global interrupts must be enabled for right function of SPI. - -### spi\_busy -```C -static inline int8_t spi_busy(void) -``` -Returns NULL when device is not busy. -When device is busy return values in non-zero. - -### spi\_join -```C -static inline void spi_join(void) -``` -Blocks processor until device is not busy. - -### spi\_send -```C -static inline uint8_t spi_send(uint8_t data) -``` -Swap bytes with slave over SPI. -This function blocks execution until device isn't busy (transfer completed). -WARNING: Invoke this only when interface is initialized in MASTER mode. - -### spi\_transfer -```C -static inline void spi_transfer(uint8_t data) -``` -Transfer byte to slave over SPI. -This function isn't blocking execution until transfer is complete. -Always call spi\_join before this function when called outside of spi\_receive(). -WARNING: Invoke this only when interface is initialized in MASTER mode. - -### spi\_expose -```C -static inline void spi_expose(uint8_t data) -``` -Expose data for next master request. -Please don't use this when device is busy. -Best place to call this is spi\_receive(). -WARNING: Invoke this only when interface is initialized in SLAVE mode. - -## Function pointer spi\_receive -```C -extern void (*spi_receive)(uint8_t data) -``` -This function is called every time transfer is finished. -And until return from this function interrupts are disabled. - -## Enum spiMode -```C -enum spiMode { - SPI_MODE_MASTER, - SPI_MODE_SLAVE -}; -``` -This is used as parameter for spi\_init function. diff --git a/docs/modules/tasks.md b/docs/modules/tasks.md deleted file mode 100644 index 0078f00..0000000 --- a/docs/modules/tasks.md +++ /dev/null @@ -1,37 +0,0 @@ -Tasks -===== -Tasks allows separate jobs. - -## Functions -### tasks_run -```C -int8_t tasks_run(void) -``` -This function starts tasks execution. Should be called after all task slots are -prepared and at least one task is started. This function exits if no task exist or -all existing tasks exited. - -### task_init - -## Structures -### Task -```C -typedef struct { - uint8_t flags; - void (*func) (void); -} Task; -``` - -### TaskSlot -```C -typedef struct { - uint8_t flags; - Task *task; - uint8_t stack_size; - uint8_t stack[]; -} TaskSlot; -``` - -### Mutex - -### Semaphore diff --git a/docs/modules/timer.md b/docs/modules/timer.md deleted file mode 100644 index e69de29..0000000 diff --git a/docs/modules/usart.md b/docs/modules/usart.md deleted file mode 100644 index e69de29..0000000 diff --git a/docs/modules/utils/buffer.md b/docs/modules/utils/buffer.md deleted file mode 100644 index 4365c25..0000000 --- a/docs/modules/utils/buffer.md +++ /dev/null @@ -1,105 +0,0 @@ -buffer -====== -In whole project are used ring buffers. This is so common that handling them is -exported to separated header file. In fact it contains two implementations of -buffers. One implementation is defined using preprocessor macros. Another one is -plain C code. - -## Preprocessor implementation -Preprocessor implementation is expected to be faster and less memory intense. Also -more suitable for buffers of simple types (such us int). But this buffer has to be -defined with known size at compile time and can't be resized. All this makes it -good implementation for IO devices input and output buffers, but less for more -complicated tasks containing for example sorting. - -### Macros -#### IOEBUFFER -```C -IOEBUFFER(type, name, size) -``` -This macro defines buffer. Use it to define new buffer. -##### Parameters -| type | Specify type of elements in buffer. Can be any valid C type | -| name | Name of buffer. This is C variable name. | -| size | Numerical value of buffer size | - -#### IOEBUFFER_INIT -```C -IOEBUFFER_INIT(name, size) -``` -Use this to initialize buffer. Parameter `size` must be same as for IOEBUFFER -(definition of buffer). You can use this also to reset buffer (remove all data -from buffer). -##### Parameters -| name | Name if buffer. This is C variable name. | -| size | Numerical value of buffer size | - -#### IOEBUFFER_PUT -```C -IOEBUFFER_PUT(name, size, data, mode) -``` -Use this macro to add new data to buffer. -##### Parameters -| name | Name of buffer. This is C variable name. | -| size | Numerical value of buffer size | -| data | Data to be stored to buffer | -| mode | This specifies action if buffer is full. | -##### Modes -| IOEBUFFER_MODE_BLOCK | Block execution until buffer has some free space. | -| IOEBUFFER_MODE_OVERWRITE | Overwrites oldest added (fist to be read) | -| IOEBUFFER_MODE_DROP | New data won't be stored to buffer if full | - -#### IOEBUFFER_GET -```C -IOEBUFFER_GET(name, size, variable) -``` -Get value from buffer. Value is stored in `variable` (it is variable of same type -as buffer data, not pointer to variable of same type). If no data is in buffer, -variable is set to NULL. -##### Parameters -| name | Name of buffer. This is C variable name. | -| size | Numerical value of buffer size. | -| variable | Variable in which data will be stored in. | - -#### IOEBUFFER_CNT -```C -IOEBUFFER_CNT(name, size, variable) -``` -Counts number of data entries in buffer and saves value to variable. -##### Parameters -| name | Name of buffer. This is C variable name. | -| size | Numerical value of buffer size. | -| variable | Int/Unsigned type variable where data count will be stored. | - -## C implementation -C implementation is more general. Size is defined by calling initialization -function. But it is using general pointers, so it is only able store pointers. - -As buffer identification is used defined type `IOEBuffer`. All functions takes -pointer to this type as parameter. Because of this, it won't be described for -every function. - -### Functions -#### ioebuffer_init -```C -int8_t ioebuffer_init(IOEBuffer *buf, uint8_t size, uint8_t flags) -``` -Initialized buffer and allocates required resources. -##### Parameters -| size | Number of elements to be maximally stored in buffer | -| flags | TODO -##### Flags -TODO - -#### ioebuffer_uninit -```C -void ioebuffer_uninit(IOEBuffer *buf) -``` -Frees all resources allocated during initialization of buffer. Use this every time -you are freeing buffer. - -#### ioebuffer_put -```C -int8_t ioebuffer_put(IOEBuffer *buf, void *data) -``` -Add `data` to buffer diff --git a/docs/modules/utils/narray.md b/docs/modules/utils/narray.md deleted file mode 100644 index 3e64f67..0000000 --- a/docs/modules/utils/narray.md +++ /dev/null @@ -1,64 +0,0 @@ -narray.h -======== -This implements some helping functions for null terminated arrays. Null terminated -arrays are used across whole project because they are simple and don't waste -memory space. Their disadvantage is more complicated implementation of utility -functions and much longer adding time (they are reallocated every time new data -are added). - -This implementation is limited to only contains 255 elements(limited by uint8_t -type). But it should be enough for basic usage. If you need store more than that, -you should use different approach. Also only pointers can be stored. - -To define null terminated array just define pointer to you required pointer and set -it to NULL. Such narray is handled as empty. Example: -```C -int **narray = 0; -``` -After adding some data (in example case data of type `int*`) you can access them -same as if you would working with simple array (`narray[i]`). Last element it such -array is `NULL`. No more valid data are stored after `NULL` (This also means that -`NULL` can't be stored to narray). - -All functions are taking as parameter `void ***array`, which is pointer to null -terminated array. This parameter won't be described in functions. - -## Functions and macros -### narray_add -```C -void narray_add(void ***array, void *data) -``` -Add data to end of the array. This increases size of the array by one (two bytes). -#### Parameters -| data | data to be stored to array | - -### narray_remove -```C -void narray_remove(void ***array, void *data) -``` -Remove specified data from array. This effectively decreases size of the array by -one (two bytes). -#### Parameters -| data | data to be removed from array | - -### narray_size -```C -size_t narray_size(void ***array) -``` -Returns size of array. - -### narray_free -```C -inline void narray_free(void ***array) -``` -Frees whole array if allocated. - -### fornarray -```C -#define fornarray(array, i, data) for (i = 0; (data = array[i]) != 0; i++) -``` -This is macro. It implements simple foreach cycle. -#### Parameters -| array | array it self (void ** not pointer) | -| i | unsigned integer (uint8_t) | -| data | variable which will be used to access data | diff --git a/docs/parts/ioport.md b/docs/parts/ioport.md new file mode 100644 index 0000000..96a4b82 --- /dev/null +++ b/docs/parts/ioport.md @@ -0,0 +1,167 @@ +IO port +======= +And define: `CONFIG_IOE_IOPORT` + +Defines simple access to io ports. This allows runtime access to any pin with just +serialized identifier. + +Most of the functions has group and mask arguments. Group is letter, but in this +library is represented as number and exact number is defined as macro definition. +Mask is one shifted by index number(use \_BV macro). This way can be +addressed all IO ports. Exact identification consult with datasheet. You can also +use more than one index number and control more ports in single group with single +command. + +WARNING: No check is implemented for right group number. Usage of unsupported +value is undefined (write to other parts of memory can happen). + +Configuration +------------- +To use this part, you must enable `CONFIG_IOPORTS` option. +This part also handles pin change interrupts. Enable it using +`CONFIG_IOPORTS_PCINT` option. + +References +---------- +### For output +#### Function io_setout +```C +static inline void io_setout(uint8_t group, uint8_t mask) +``` +Configures port of `group` with `mask` as output. +Parameters: +__group__ - Character specifying exact port group +__mask__ - Binary shifted 1. Shift is equal to port index in specified group. + +#### Function io_hight +```C +static inline void io_hight(uint8_t group, uint8_t mask) +``` +Sets output port to hight (also can be called as 1). +WARNING: Invoke this only if io_setout is called before. + +Parameters: +__group__ - Character specifying exact port group +__mask__ - Binary shifted 1. Shift is equal to port index in specified group. + +#### Function io_low +```C +static inline void io_low(uint8_t group, uint8_t mask) +``` +Sets output port to low (also called as 0). +WARNING: Invoke this only if io_setout is called before. + +Parameters: +__group__ - Number specifying exact port group +__mask__ - Binary shifted 1. Shift is equal to port index in specified group. + +#### Function io_set +```C +static inline void io_set(uint8_t group, uint8_t mask, int8_t val) +``` +Sets output port to value passed as argument. +WARNING: Invoke this only if io_setout is called before. +Parameters: +__group__ - Number specifying exact port group +__mask__ - Binary shifted 1. Shift is equal to port index in specified group. + +### For input +#### Function io_setin +```C +static inline void io_setin(uint8_t group, uint8_t mask, + enum ioeIOInResistor resistor) +``` +Configures port of `group` with `mask` as input with specified pull-up/down +resistor. + +Parameters: +__group__ - Number specifying exact port group +__mask__ - Binary shifted 1. Shift is equal to port index in specified group. + +#### Function io_get +```C +static inline int8_t io_get(uint8_t group, uint8_t mask) +``` +Returns current value of port. Note that you can use this also if port is +configured as output. + +Parameters: +__group__ - Number specifying exact port group +__mask__ - Binary shifted 1. Shift is equal to port index in specified group. + +#### Enum ioeIOInResistor +```C +enum ioeIOInResistor { + IOE_IO_PULLUP, + IOE_IO_PULLDOWN +}; +``` +This enum is used as argument for io_setin. Names should be self explanatory +in this case. + +### Pin change interrupts +#### Function io_change_sethook +```C +int8_t io_change_sethook(uint8_t group, uint8_t mask, uint8_t edge, + void (*change) (uint8_t group, uint8_t mask)) +``` +Registers function `change` as hook for pin change interrupt. `group` and `mask` +specifies port and edge specifies on what edge should hook be called. `edge` can +be IO_RISING or IO_FALLING or their binary combination with operator +`|`. +WARNING: `change` call is call during interrupt handling. You shouldn't be +blocking execution for long time. + +Parameters: +__group__ - Number specifying exact port group. +__mask__ - Binary shifted 1. Shift is equal to port index in specified group. +__edge__ - Signals on what edge should be hook called. +__change__ - Pointer to function used as interupt hook. + +#### Function io_change_remhook +```C +int8_t io_change_remhook(void (*change) (uint8_t group, uint8_t mask)) +``` +Removes `change` hook. + +Parameters: +__change__ - Pointer to function used as hook + +### Others +#### Definitions IO_{GROUP} +This defines exact numbers related to data-sheet groups. Always use these +definition not direct numbers, you can ensure cross MCU support this way. + +#### Definitions IO_{GROUP}{INDEX} +Because specifying group and mask as separate parameters is not always optimal, +mcu support file should define all ports in form of single line definition in +format `IOE_IO_{GROUP}{INDEX}`. Disadvantage is that with these definitions you +can't use binary conjunction and so only one pin can be controlled with it. + +Relevant examples +----------------- +* blink +* pcinterrupt + +Adding support +-------------- +For more information on how add support, see [Adding MCU support](/add_support.md). +Main definition is `MCUSUPPORT_IOPORT`. Define it to enable support. + +### IO_{GROUP} +This should define any number that is handy for implementation of `IOE_IOE_PIN`, +`IOE_IO_DDR` and `IOE_IO_PORT`. + +### IO_{PIN/DDR/PORT} +These should calculate exact pointers to register `PORT{GROUP}` for PORT variant +and likewise for others with group as argument. Common implementation would be +like this: +```C +#define IOE_IO_PIN(GROUP) (* (volatile uint8_t *)(PINB + 0x3*GROUP)) +``` +### IO_{GROUP}{INDEX} +This should be pair of group and one binary shifted to left relative to index. + +### MCUSUPPORT_PCINT{NUM} +This defines that MCU supports specific pin change interrupt group. Also it +defines value that is number of pins in group. diff --git a/docs/parts/jobs.md b/docs/parts/jobs.md new file mode 100644 index 0000000..878a557 --- /dev/null +++ b/docs/parts/jobs.md @@ -0,0 +1,15 @@ +Jobs +==== +Jobs allows periodic execution of different short functions. It is designed to host +control loops. So called functions should be short. + +Every job must specify deadline and if not set otherwise also its duration. + +If tasks support is enabled jobs can be also executed on multiple tasks, which is +handy if you divide sensor reading and control algorithm, because control +algorithm can than run when for example mcu waiting for response from sensor. +Always be sure that jobs are running on tasks with highest priority, otherwise +deadlines might not be fulfilled every time. + +Be aware of taking mutexes and semaphores. It can sometime result in long task +suspension and that would result to deadline misses. diff --git a/docs/parts/spi.md b/docs/parts/spi.md new file mode 100644 index 0000000..f63d304 --- /dev/null +++ b/docs/parts/spi.md @@ -0,0 +1,80 @@ +Serial peripheral interface +=========================== +To use include: `spi.h` +This interface is link to MOSI and MISO pins. Also SS pin is used when slave mode +initialized. + +Configuration +------------- +To use SPI you must enable `CONFIG_SPI` configuration symbol. + +References +---------- +### Function spi\_init +```C +static inline void spi_init(enum spiMode mode) +``` +Initializes SPI interface. +Parameters: + mode - Specify mode of SPI interface + +NOTE: Global interrupts must be enabled for right function of SPI. + +### Function spi\_busy +```C +static inline int8_t spi_busy(void) +``` +Returns NULL when device is not busy. +When device is busy return values in non-zero. + +### Function spi\_join +```C +static inline void spi_join(void) +``` +Blocks processor until device is not busy. + +### Function spi\_send +```C +static inline uint8_t spi_send(uint8_t data) +``` +Swap bytes with slave over SPI. +This function blocks execution until device isn't busy (transfer completed). +WARNING: Invoke this only when interface is initialized in MASTER mode. + +### Function spi\_transfer +```C +static inline void spi_transfer(uint8_t data) +``` +Transfer byte to slave over SPI. +This function isn't blocking execution until transfer is complete. +Always call spi\_join before this function when called outside of spi\_receive(). +WARNING: Invoke this only when interface is initialized in MASTER mode. + +### Function spi\_expose +```C +static inline void spi_expose(uint8_t data) +``` +Expose data for next master request. +Please don't use this when device is busy. +Best place to call this is spi\_receive(). +WARNING: Invoke this only when interface is initialized in SLAVE mode. + +### Function pointer spi\_receive +```C +extern void (*spi_receive)(uint8_t data) +``` +This function is called every time transfer is finished. +And until return from this function interrupts are disabled. + +### Enum spiMode +```C +enum spiMode { + SPI_MODE_MASTER, + SPI_MODE_SLAVE +}; +``` +This is used as parameter for spi\_init function. + +Relevant examples +----------------- +* spiblink diff --git a/docs/parts/tasks.md b/docs/parts/tasks.md new file mode 100644 index 0000000..e4f71df --- /dev/null +++ b/docs/parts/tasks.md @@ -0,0 +1,38 @@ +Tasks +===== +Tasks can be used for sharing processor for example during period of waiting for +interrupt. Planing is based on priority. + +## Functions +### tasks_run +```C +int8_t tasks_run(void) +``` +This function starts tasks execution. Should be called after all task slots are +prepared and at least one task is started. This function exits if no task exist or +all existing tasks exited. + +### task_init + +## Structures +### Task +```C +typedef struct { + uint8_t flags; + void (*func) (void); +} Task; +``` + +### TaskSlot +```C +typedef struct { + uint8_t flags; + Task *task; + uint8_t stack_size; + uint8_t stack[]; +} TaskSlot; +``` + +### Mutex + +### Semaphore diff --git a/docs/parts/timer.md b/docs/parts/timer.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/parts/usart.md b/docs/parts/usart.md new file mode 100644 index 0000000..22e54ab --- /dev/null +++ b/docs/parts/usart.md @@ -0,0 +1,23 @@ +Universal synchronous/asynchronous receive/transmitter +====================================================== +This part acts as UART intended as text base interface with computer. It is +using hardware termed as USART by Atmel. This hardware also supports synchronous +communication and can behave as SPI master, but this is not supported by this +library (I don't require this feature, but implementation is welcomed). + +This part implements, if enabled, whole stack for binding input and output to +stdin and stdout. This is handy during development. You can use `printf` and +`scanf` directly. + +This part can be enabled by `CONFIG_USART` configuration option. This enables +more detailed configuration in sub-menu. + +## Usage + + +## References +### usart_init_async +```C +void usart_init_async(void) +``` + diff --git a/docs/parts/utils/buffer.md b/docs/parts/utils/buffer.md new file mode 100644 index 0000000..4365c25 --- /dev/null +++ b/docs/parts/utils/buffer.md @@ -0,0 +1,105 @@ +buffer +====== +In whole project are used ring buffers. This is so common that handling them is +exported to separated header file. In fact it contains two implementations of +buffers. One implementation is defined using preprocessor macros. Another one is +plain C code. + +## Preprocessor implementation +Preprocessor implementation is expected to be faster and less memory intense. Also +more suitable for buffers of simple types (such us int). But this buffer has to be +defined with known size at compile time and can't be resized. All this makes it +good implementation for IO devices input and output buffers, but less for more +complicated tasks containing for example sorting. + +### Macros +#### IOEBUFFER +```C +IOEBUFFER(type, name, size) +``` +This macro defines buffer. Use it to define new buffer. +##### Parameters +| type | Specify type of elements in buffer. Can be any valid C type | +| name | Name of buffer. This is C variable name. | +| size | Numerical value of buffer size | + +#### IOEBUFFER_INIT +```C +IOEBUFFER_INIT(name, size) +``` +Use this to initialize buffer. Parameter `size` must be same as for IOEBUFFER +(definition of buffer). You can use this also to reset buffer (remove all data +from buffer). +##### Parameters +| name | Name if buffer. This is C variable name. | +| size | Numerical value of buffer size | + +#### IOEBUFFER_PUT +```C +IOEBUFFER_PUT(name, size, data, mode) +``` +Use this macro to add new data to buffer. +##### Parameters +| name | Name of buffer. This is C variable name. | +| size | Numerical value of buffer size | +| data | Data to be stored to buffer | +| mode | This specifies action if buffer is full. | +##### Modes +| IOEBUFFER_MODE_BLOCK | Block execution until buffer has some free space. | +| IOEBUFFER_MODE_OVERWRITE | Overwrites oldest added (fist to be read) | +| IOEBUFFER_MODE_DROP | New data won't be stored to buffer if full | + +#### IOEBUFFER_GET +```C +IOEBUFFER_GET(name, size, variable) +``` +Get value from buffer. Value is stored in `variable` (it is variable of same type +as buffer data, not pointer to variable of same type). If no data is in buffer, +variable is set to NULL. +##### Parameters +| name | Name of buffer. This is C variable name. | +| size | Numerical value of buffer size. | +| variable | Variable in which data will be stored in. | + +#### IOEBUFFER_CNT +```C +IOEBUFFER_CNT(name, size, variable) +``` +Counts number of data entries in buffer and saves value to variable. +##### Parameters +| name | Name of buffer. This is C variable name. | +| size | Numerical value of buffer size. | +| variable | Int/Unsigned type variable where data count will be stored. | + +## C implementation +C implementation is more general. Size is defined by calling initialization +function. But it is using general pointers, so it is only able store pointers. + +As buffer identification is used defined type `IOEBuffer`. All functions takes +pointer to this type as parameter. Because of this, it won't be described for +every function. + +### Functions +#### ioebuffer_init +```C +int8_t ioebuffer_init(IOEBuffer *buf, uint8_t size, uint8_t flags) +``` +Initialized buffer and allocates required resources. +##### Parameters +| size | Number of elements to be maximally stored in buffer | +| flags | TODO +##### Flags +TODO + +#### ioebuffer_uninit +```C +void ioebuffer_uninit(IOEBuffer *buf) +``` +Frees all resources allocated during initialization of buffer. Use this every time +you are freeing buffer. + +#### ioebuffer_put +```C +int8_t ioebuffer_put(IOEBuffer *buf, void *data) +``` +Add `data` to buffer diff --git a/docs/parts/utils/narray.md b/docs/parts/utils/narray.md new file mode 100644 index 0000000..3e64f67 --- /dev/null +++ b/docs/parts/utils/narray.md @@ -0,0 +1,64 @@ +narray.h +======== +This implements some helping functions for null terminated arrays. Null terminated +arrays are used across whole project because they are simple and don't waste +memory space. Their disadvantage is more complicated implementation of utility +functions and much longer adding time (they are reallocated every time new data +are added). + +This implementation is limited to only contains 255 elements(limited by uint8_t +type). But it should be enough for basic usage. If you need store more than that, +you should use different approach. Also only pointers can be stored. + +To define null terminated array just define pointer to you required pointer and set +it to NULL. Such narray is handled as empty. Example: +```C +int **narray = 0; +``` +After adding some data (in example case data of type `int*`) you can access them +same as if you would working with simple array (`narray[i]`). Last element it such +array is `NULL`. No more valid data are stored after `NULL` (This also means that +`NULL` can't be stored to narray). + +All functions are taking as parameter `void ***array`, which is pointer to null +terminated array. This parameter won't be described in functions. + +## Functions and macros +### narray_add +```C +void narray_add(void ***array, void *data) +``` +Add data to end of the array. This increases size of the array by one (two bytes). +#### Parameters +| data | data to be stored to array | + +### narray_remove +```C +void narray_remove(void ***array, void *data) +``` +Remove specified data from array. This effectively decreases size of the array by +one (two bytes). +#### Parameters +| data | data to be removed from array | + +### narray_size +```C +size_t narray_size(void ***array) +``` +Returns size of array. + +### narray_free +```C +inline void narray_free(void ***array) +``` +Frees whole array if allocated. + +### fornarray +```C +#define fornarray(array, i, data) for (i = 0; (data = array[i]) != 0; i++) +``` +This is macro. It implements simple foreach cycle. +#### Parameters +| array | array it self (void ** not pointer) | +| i | unsigned integer (uint8_t) | +| data | variable which will be used to access data | diff --git a/docs/usage.md b/docs/usage.md index e69de29..b96c601 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -0,0 +1 @@ +Sorry this documentation is not finished yet. To start you can look to examples. diff --git a/examples/blink/Makefile b/examples/blink/Makefile index ef7e205..f2cc133 100644 --- a/examples/blink/Makefile +++ b/examples/blink/Makefile @@ -30,7 +30,7 @@ clean: $(Q)$(RM) $(OBJ) @echo " CLEAN $(PROJNAME).elf $(PROJNAME).hex" $(Q)$(RM) $(PROJNAME).elf $(PROJNAME).hex - $(Q)$(MAKE) -C ../.. clean O=examples/blink + $(Q)$(MAKE) -C ../.. clean O=examples/$(PROJNAME) # Building targets are available only if configuration is generated ifneq ("$(wildcard .config)","") @@ -54,7 +54,7 @@ $(OBJ): %.o: %.c libioe.a $(Q)avr-gcc $(CFLAGS) -c -o $@ $< libioe.a: .config - $(Q)$(MAKE) -C ../.. examples/blink/libioe.a O=examples/blink + $(Q)$(MAKE) -C ../.. examples/$(PROJNAME)/libioe.a O=examples/$(PROJNAME) endif .config: @@ -62,8 +62,8 @@ endif @exit 1 config: - $(Q)$(MAKE) -C ../.. config O=examples/blink + $(Q)$(MAKE) -C ../.. config O=examples/$(PROJNAME) .PHONY: menuconfig menuconfig: - $(Q)$(MAKE) -C ../.. menuconfig O=examples/blink + $(Q)$(MAKE) -C ../.. menuconfig O=examples/$(PROJNAME) diff --git a/include/can/global.h b/include/can/global.h deleted file mode 100644 index 5d88fe6..0000000 --- a/include/can/global.h +++ /dev/null @@ -1,20 +0,0 @@ -#include - -#ifndef _IOE_CAN_GLOBAL_ -#define _IOE_CAN_GLOBAL_ - -typedef struct { - uint16_t id; - uint8_t length; - uint8_t data[8]; -} CanFrame; - -typedef struct { - CanFrame **buffer; - void *udata; -} Can; - - -void can_send(Can *can, CanFrame *frame); - -#endif /* _IOE_CAN_GLOBAL_ */ diff --git a/include/can/mcp2515.h b/include/can/mcp2515.h deleted file mode 100644 index 59376f7..0000000 --- a/include/can/mcp2515.h +++ /dev/null @@ -1,36 +0,0 @@ -#include -#include -#include - -#include "spi.h" -#include "global.h" - -#ifndef _IOE_CAN_MCP2515_H_ -#define _IOE_CAN_MCP2515_H_ -#ifdef CONFIG_IOE_CAN_MCP2515 -#ifndef CONFIG_IOE_SPI -#error "Please define CONFIG_IOE_SPI. MCP2515 requires SPI." -#endif - -// TODO registers -#define CAN_MCP2515_CANCTL -// TODO buffers - -typedef struct { - uint8_t group, mask; -} CanMcp2515; - -int8_t can_mcp2515_init(CanMcp2515 * can, uint8_t group, uint8_t mask); - -void can_mcp2515_reset(CanMcp2515 * can); -uint8_t can_mcp2515_read(CanMcp2515 * can, uint8_t address); -uint8_t can_mcp2515_readrx(CanMcp2515 * can, uint8_t buffer); -void can_mcp2515_write(CanMcp2515 * can, uint8_t address, uint8_t data); -void can_mcp2515_loadrx(CanMcp2515 * can, uint8_t buffer, uint8_t data); -uint8_t can_mcp2515_rdstat(CanMcp2515 * can); -uint8_t can_mcp2515_rxstat(CanMcp2515 * can); -void can_mcp2515_bitmod(CanMcp2515 * can, uint8_t address, uint8_t mask, - uint8_t data); - -#endif /* CONFIG_IOE_CAN_MCP2515 */ -#endif /* _IOE_CAN_MCP2515_H_ */ diff --git a/include/can/software.h b/include/can/software.h deleted file mode 100644 index b443e42..0000000 --- a/include/can/software.h +++ /dev/null @@ -1,9 +0,0 @@ -#include -#include -#include - -#ifndef _IOE_CAN_SOFTWARE_H_ -#define _IOE_CAN_SOFTWARE_H_ - - -#endif /* _IOE_CAN_SOFTWARE_H_ */ diff --git a/include/spi.h b/include/spi.h index 8d51eb9..bdfce25 100644 --- a/include/spi.h +++ b/include/spi.h @@ -9,6 +9,11 @@ #define _IOE_SPI_H_ #ifdef CONFIG_SPI +/*! \brief Modes definition for spi_init + * + * This enum is used by spi_init to define if SPI should be initialized as master + * or slave. + */ enum spiMode { SPI_MODE_MASTER, SPI_MODE_SLAVE @@ -17,6 +22,10 @@ enum spiMode { volatile extern int8_t _spi_busy; volatile extern Mutex spi_mutex; +/*! \brief Initializes SPI interface. + * + * \param mode Specify mode of SPI interface + */ static inline void spi_init(enum spiMode mode) { _spi_busy = 0; if (mode == SPI_MODE_MASTER) { @@ -59,7 +68,6 @@ static inline void spi_expose(uint8_t data) { SPDR = data; } -// Null terminated array extern void (*spi_receive)(uint8_t data); #endif /* CONFIG_SPI */ diff --git a/include/usart.h b/include/usart.h index 3ba5382..a3f585a 100644 --- a/include/usart.h +++ b/include/usart.h @@ -17,12 +17,10 @@ #define USART_DATAOVERRUN _BV(DOR0) #define USART_PARITYERROR _BV(UPE0) -#if CONFIG_USART_INBUFFER_SIZE > 0 -#define _USART_INBUFFER +#ifdef CONFIG_USART_INPUT_BUFFER volatile IOEBUFFER(uint8_t, _ioe_usart_inbuffer, CONFIG_USART_INBUFFER_SIZE); #endif -#if CONFIG_USART_OUTBUFFER_SIZE > 0 -#define _USART_OUTBUFFER +#ifdef CONFIG_USART_OUTPUT_BUFFER volatile IOEBUFFER(uint8_t, _ioe_usart_outbuffer, CONFIG_USART_OUTBUFFER_SIZE); #endif @@ -46,10 +44,10 @@ static inline uint8_t usart_queryerror(void) { static inline int8_t usart_busy(void) { return _usart_busy; } -#ifdef _USART_INBUFFER +#ifdef CONFIG_USART_INPUT_BUFFER uint8_t usart_inbuffered(void); #endif -#ifdef _USART_OUTBUFFER +#ifdef CONFIG_USART_OUTPUT_BUFFER uint8_t usart_outbuffered(void); #endif #if (defined CONFIG_USART_INFILE) || (defined CONFIG_USART_OUTFILE) diff --git a/include/usi_spi.h b/include/usi_spi.h deleted file mode 100644 index 18534ab..0000000 --- a/include/usi_spi.h +++ /dev/null @@ -1,66 +0,0 @@ -#include -#include -#include - -#include "mcu/mcu_def.h" - -#ifndef _IOE_USI_SPI_H_ -#define _IOE_USI_SPI_H_ - -#ifndef MCUSUPPORT_USI -#error "No USI interface is known on your mcu." -#endif - -enum usiSpiMode { - // Device is initialized as master - USI_SPI_MODE_MASTER, - // Device is initialized as slave - USI_SPI_MODE_SLAVE, -}; - -/* - * Initialize SPI on USI device - * - * Parameters: - * mode - Specify mode of SPI interface - */ -void usi_spi_init(enum usiSpiMode mode); -/* - * Returns NULL when device is not busy. - * When device is busy return values in non-zero. - */ -int8_t usi_spi_busy(void); -/* - * Blocks processor until device is not busy. - */ -void usi_spi_join(void); -/* - * Swap bytes with slave over SPI. - * This function blocks execution until device isn't busy. - * WARNING: Invoke this only when interface is initialized in MASTER mode. - */ -uint8_t usi_spi_send(uint8_t data); -/* - * Swaps byte with slave over SPI. - * This function isn't checking if device is busy, but it's not blocking execution. - * WARNING: Invoke this only when interface is initialized in MASTER mode. - */ -uint8_t usi_spi_transfer(uint8_t data); -/* - * Expose data for next master request. - * Please don't use this when device is busy. - * Best place to call this is usi_spi_retrieve(). - * WARNING: Invoke this only when interface is initialized in SLAVE mode. - */ -void usi_spi_expose(uint8_t data); - -/* - * This function must be defined by user. - * This function is called every time transfer is finished. - * And until return from this function interrupts are disabled. - * WARNING: Please define this function in your code. - */ -void usi_spi_receive(uint8_t data); - - -#endif /* _IOE_USI_SPI_H_ */ diff --git a/mkdocs.yml b/mkdocs.yml index a0724b4..83ec683 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -5,16 +5,19 @@ copyright: GNU General Public License, version 2.0 pages: - Home: index.md - Usage: usage.md -- Modules: - - IO Ports: modules/ioport.md - - SPI: modules/spi.md - - Tasks: modules/tasks.md - - Timer: modules/timer.md - - USART: modules/usart.md +- Parts: + - IO Ports: parts/ioport.md + - SPI: parts/spi.md + - Tasks: parts/tasks.md + - Jobs: parts/jobs.md + - Timer: parts/timer.md + - USART: parts/usart.md - Utils: - - Buffer: modules/utils/buffer.md - - NArray: modules/utils/narray.md + - Buffer: parts/utils/buffer.md + - NArray: parts/utils/narray.md - Adding MCU support: add_support.md +- Miscellanoues: + - Jobs vs. Tasks: miscellanoues/jobs_vs_tasks.md theme: readthedocs site_dir: html diff --git a/src/base.c b/src/base.c new file mode 100644 index 0000000..e69de29 diff --git a/src/spi.c b/src/spi.c index 69012fa..adf858d 100644 --- a/src/spi.c +++ b/src/spi.c @@ -8,11 +8,9 @@ volatile Mutex spi_mutex; void (*spi_receive) (uint8_t data) = 0; ISR(SPI_STC_vect, ISR_BLOCK) { - void (*spir_w) (uint8_t data) = spi_receive; _spi_busy = 0; - while (spir_w != NULL) { + if (spi_receive != NULL) { spir_w(SPDR); - spir_w++; } } diff --git a/src/usart.c b/src/usart.c index 6cfbc20..12528f9 100644 --- a/src/usart.c +++ b/src/usart.c @@ -8,50 +8,6 @@ #define USART_STOPBIT_SINGLE 1 #define USART_STOPBIT_DOUBLE 2 -#ifndef CONFIG_USART_BAUD -#warning "CONFIG_USART_BAUD not defined. Setting default 9600." -#define CONFIG_USART_BAUD 9600 -#endif -#ifndef CONFIG_USART_PARITY -#warning "CONFIG_USART_PARITY not defined. Using default USART_PARITY_NONE." -#define CONFIG_USART_PARITY USART_PARITY_NONE -#endif -#ifndef CONFIG_USART_STOPBIT -#warning "CONFIG_USART_STOPBIT not defined. Using default USART_STOPBIT_SINGLE." -#define CONFIG_USART_STOPBIT USART_STOPBIT_SINGLE -#endif -#ifndef CONFIG_USART_DATABITS -#warning "CONFIG_USART_DATABITS not defined. Using default 8." -#define CONFIG_USART_DATABITS 8 -#endif - -#if !((CONFIG_USART_PARITY == USART_PARITY_NONE) || \ - (CONFIG_USART_PARITY == USART_PARITY_ODD) || \ - (CONFIG_USART_PARITY == USART_PARITY_EVEN)) -#error "CONFIG_USART_PARITY has value, that is not allowed." -#endif - -#if !((CONFIG_USART_STOPBIT == USART_STOPBIT_SINGLE) || \ - (CONFIG_USART_STOPBIT == USART_STOPBIT_DOUBLE)) -#error "CONFIG_USART_STOPBIT has value, that is not allowed." -#endif - -#if !((CONFIG_USART_DATABITS == 5) || \ - (CONFIG_USART_DATABITS == 6) || \ - (CONFIG_USART_DATABITS == 7) || \ - (CONFIG_USART_DATABITS == 8)) -// TODO DATABITS 9 is not supported -#error "CONFIG_USART_DATABITS has value, that is not allowed." -#endif - -#if (defined CONFIG_USART_INFILE) && (CONFIG_USART_INBUFFER_SIZE <= 0) -#error "USART Input file can't be enabled without input buffer" -#endif -#if (defined CONFIG_USART_OUTFILE) && (CONFIG_USART_OUTBUFFER_SIZE <= 0) -#error "USART Input file can't be enabled without output buffer" -#endif - - volatile int8_t _usart_busy; void usart_init_async(void) { @@ -89,40 +45,40 @@ void usart_init_async(void) { // Enable receiver, transmitter and RX complete, // Data register empty interrupts UCSR0B = _BV(RXEN0) | _BV(TXEN0) | _BV(RXCIE0) | _BV(UDRIE0); -#ifdef _USART_INBUFFER +#ifdef CONFIG_USART_INPUT_BUFFER IOEBUFFER_INIT(_ioe_usart_inbuffer, CONFIG_USART_INBUFFER_SIZE); #endif -#ifdef _USART_OUTBUFFER +#ifdef CONFIG_USART_OUTPUT_BUFFER IOEBUFFER_INIT(_ioe_usart_outbuffer, CONFIG_USART_OUTBUFFER_SIZE); #endif } inline void usart_send(uint8_t data) { -#ifdef _USART_OUTBUFFER +#ifdef CONFIG_USART_OUTPUT_BUFFER if (!_usart_busy) { _usart_busy = 1; UDR0 = data; } else { IOEBUFFER_PUT(_ioe_usart_outbuffer, CONFIG_USART_OUTBUFFER_SIZE, data, - CONFIG_USART_OUTBUFFER_MODE); + CONFIGCONFIG_USART_OUTPUT_BUFFER_MODE); } #else _usart_busy = 1; UDR0 = data; -#endif /* _USART_OUTBUFFER */ +#endif /* CONFIG_USART_OUTPUT_BUFFER */ } -#ifdef _USART_OUTBUFFER +#ifdef CONFIG_USART_OUTPUT_BUFFER inline void usart_send_str(char *str) { while (*str != '\0') { usart_send((uint8_t) * str); str++; } } -#endif /* _USART_OUTBUFFER */ +#endif /* CONFIG_USART_OUTPUT_BUFFER */ -#ifdef _USART_INBUFFER +#ifdef CONFIG_USART_INPUT_BUFFER uint8_t usart_get(void) { uint8_t rtn; IOEBUFFER_GET(_ioe_usart_inbuffer, CONFIG_USART_INBUFFER_SIZE, @@ -131,7 +87,7 @@ uint8_t usart_get(void) { } #endif -#ifdef _USART_INBUFFER +#ifdef CONFIG_USART_INPUT_BUFFER uint8_t usart_inbuffered(void) { uint8_t rtn; IOEBUFFER_CNT(_ioe_usart_inbuffer, CONFIG_USART_INBUFFER_SIZE, @@ -140,7 +96,7 @@ uint8_t usart_inbuffered(void) { } #endif -#ifdef _USART_OUTBUFFER +#ifdef CONFIG_USART_OUTPUT_BUFFER uint8_t usart_outbuffered(void) { uint8_t rtn; IOEBUFFER_CNT(_ioe_usart_outbuffer, CONFIG_USART_OUTBUFFER_SIZE, @@ -156,7 +112,7 @@ static int usartput(char c, FILE * f) { } #endif -#ifdef CONFIG_USART_INBUFFER +#ifdef CONFIGCONFIG_USART_INPUT_BUFFER static int usartget(FILE * f) { uint8_t v; while (!(v = usart_get())); @@ -184,17 +140,17 @@ void (*usart_receive) (uint8_t data) = 0; void (*usart_sent) (void) = 0; SIGNAL(USART_RX_vect) { -#ifdef _USART_INBUFFER +#ifdef CONFIG_USART_INPUT_BUFFER uint8_t val = UDR0; IOEBUFFER_PUT(_ioe_usart_inbuffer, CONFIG_USART_INBUFFER_SIZE, - val, CONFIG_USART_INBUFFER_MODE); -#endif /* _USART_INBUFFER */ + val, CONFIGCONFIG_USART_INPUT_BUFFER_MODE); +#endif /* CONFIG_USART_INPUT_BUFFER */ if (usart_receive) usart_receive(UDR0); } SIGNAL(USART_UDRE_vect) { -#ifdef _USART_OUTBUFFER +#ifdef CONFIG_USART_OUTPUT_BUFFER uint8_t val; IOEBUFFER_GET(_ioe_usart_outbuffer, CONFIG_USART_OUTBUFFER_SIZE, val); @@ -204,7 +160,7 @@ SIGNAL(USART_UDRE_vect) { _usart_busy = 0; #else _usart_busy = 0; -#endif /* _USART_OUTBUFFER */ +#endif /* CONFIG_USART_OUTPUT_BUFFER */ if (usart_sent) usart_sent(); } -- cgit v1.2.3