mirror of https://github.com/ARMmbed/mbed-os.git
commit
e4419e7d11
|
@ -108,6 +108,15 @@ int FATFileSystem::remove(const char *filename) {
|
|||
return 0;
|
||||
}
|
||||
|
||||
int FATFileSystem::rename(const char *oldname, const char *newname) {
|
||||
FRESULT res = f_rename(oldname, newname);
|
||||
if (res) {
|
||||
debug_if(FFS_DBG, "f_rename() failed: %d\n", res);
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int FATFileSystem::format() {
|
||||
FRESULT res = f_mkfs(_fsid, 0, 512); // Logical drive number, Partitioning rule, Allocation unit size (bytes per cluster)
|
||||
if (res) {
|
||||
|
|
|
@ -41,6 +41,7 @@ public:
|
|||
|
||||
virtual FileHandle *open(const char* name, int flags);
|
||||
virtual int remove(const char *filename);
|
||||
virtual int rename(const char *oldname, const char *newname);
|
||||
virtual int format();
|
||||
virtual DirHandle *opendir(const char *name);
|
||||
virtual int mkdir(const char *name, mode_t mode);
|
||||
|
|
|
@ -323,7 +323,15 @@ extern "C" int remove(const char *path) {
|
|||
}
|
||||
|
||||
extern "C" int rename(const char *oldname, const char *newname) {
|
||||
return -1;
|
||||
FilePath fpOld(oldname);
|
||||
FilePath fpNew(newname);
|
||||
FileSystemLike *fsOld = fpOld.fileSystem();
|
||||
FileSystemLike *fsNew = fpNew.fileSystem();
|
||||
|
||||
/* rename only if both files are on the same FS */
|
||||
if (fsOld != fsNew || fsOld == NULL) return -1;
|
||||
|
||||
return fsOld->rename(fpOld.fileName(), fpNew.fileName());
|
||||
}
|
||||
|
||||
extern "C" char *tmpnam(char *s) {
|
||||
|
|
|
@ -43,8 +43,8 @@ SECTIONS
|
|||
KEEP(*(.Vectors))
|
||||
*(.text*)
|
||||
|
||||
*(.init)
|
||||
*(.fini)
|
||||
KEEP(*(.init))
|
||||
KEEP(*(.fini))
|
||||
|
||||
/* .ctors */
|
||||
*crtbegin.o(.ctors)
|
||||
|
@ -62,7 +62,7 @@ SECTIONS
|
|||
|
||||
*(.rodata*)
|
||||
|
||||
*(.eh_frame*)
|
||||
KEEP(*(.eh_frame*))
|
||||
} > FLASH
|
||||
|
||||
|
||||
|
@ -89,22 +89,22 @@ SECTIONS
|
|||
. = ALIGN(4);
|
||||
/* preinit data */
|
||||
PROVIDE_HIDDEN (__preinit_array_start = .);
|
||||
*(.preinit_array)
|
||||
KEEP(*(.preinit_array))
|
||||
PROVIDE_HIDDEN (__preinit_array_end = .);
|
||||
|
||||
. = ALIGN(4);
|
||||
/* init data */
|
||||
PROVIDE_HIDDEN (__init_array_start = .);
|
||||
*(SORT(.init_array.*))
|
||||
*(.init_array)
|
||||
KEEP(*(SORT(.init_array.*)))
|
||||
KEEP(*(.init_array))
|
||||
PROVIDE_HIDDEN (__init_array_end = .);
|
||||
|
||||
|
||||
. = ALIGN(4);
|
||||
/* finit data */
|
||||
PROVIDE_HIDDEN (__fini_array_start = .);
|
||||
*(SORT(.fini_array.*))
|
||||
*(.fini_array)
|
||||
KEEP(*(SORT(.fini_array.*)))
|
||||
KEEP(*(.fini_array))
|
||||
PROVIDE_HIDDEN (__fini_array_end = .);
|
||||
|
||||
*(.jcr)
|
||||
|
@ -149,4 +149,3 @@ SECTIONS
|
|||
/* Check if data + heap + stack exceeds RAM limit */
|
||||
ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,154 @@
|
|||
/* Linker script for mbed LPC1549 */
|
||||
|
||||
/* Linker script to configure memory regions. */
|
||||
MEMORY
|
||||
{
|
||||
/* Define each memory region */
|
||||
FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 256K
|
||||
Ram0_16 (rwx) : ORIGIN = 0x2000000 + 0x100, LENGTH = (16K - 0x100)
|
||||
Ram1_16 (rwx) : ORIGIN = 0x2004000, LENGTH = 16K
|
||||
Ram2_4 (rwx) : ORIGIN = 0x2008000, LENGTH = 4K
|
||||
|
||||
}
|
||||
|
||||
/* Linker script to place sections and symbol values. Should be used together
|
||||
* with other linker script that defines memory regions FLASH and RAM.
|
||||
* It references following symbols, which must be defined in code:
|
||||
* Reset_Handler : Entry of reset handler
|
||||
*
|
||||
* It defines following symbols, which code can use without definition:
|
||||
* __exidx_start
|
||||
* __exidx_end
|
||||
* __etext
|
||||
* __data_start__
|
||||
* __preinit_array_start
|
||||
* __preinit_array_end
|
||||
* __init_array_start
|
||||
* __init_array_end
|
||||
* __fini_array_start
|
||||
* __fini_array_end
|
||||
* __data_end__
|
||||
* __bss_start__
|
||||
* __bss_end__
|
||||
* __end__
|
||||
* end
|
||||
* __HeapLimit
|
||||
* __StackLimit
|
||||
* __StackTop
|
||||
* __stack
|
||||
*/
|
||||
ENTRY(Reset_Handler)
|
||||
|
||||
SECTIONS
|
||||
{
|
||||
.text :
|
||||
{
|
||||
KEEP(*(.isr_vector))
|
||||
*(.text*)
|
||||
|
||||
KEEP(*(.init))
|
||||
KEEP(*(.fini))
|
||||
|
||||
/* .ctors */
|
||||
*crtbegin.o(.ctors)
|
||||
*crtbegin?.o(.ctors)
|
||||
*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
|
||||
*(SORT(.ctors.*))
|
||||
*(.ctors)
|
||||
|
||||
/* .dtors */
|
||||
*crtbegin.o(.dtors)
|
||||
*crtbegin?.o(.dtors)
|
||||
*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
|
||||
*(SORT(.dtors.*))
|
||||
*(.dtors)
|
||||
|
||||
*(.rodata*)
|
||||
|
||||
KEEP(*(.eh_frame*))
|
||||
} > FLASH
|
||||
|
||||
.ARM.extab :
|
||||
{
|
||||
*(.ARM.extab* .gnu.linkonce.armextab.*)
|
||||
} > FLASH
|
||||
|
||||
__exidx_start = .;
|
||||
.ARM.exidx :
|
||||
{
|
||||
*(.ARM.exidx* .gnu.linkonce.armexidx.*)
|
||||
} > FLASH
|
||||
__exidx_end = .;
|
||||
|
||||
__etext = .;
|
||||
|
||||
.data : AT (__etext)
|
||||
{
|
||||
__data_start__ = .;
|
||||
Image$$RW_IRAM1$$Base = .;
|
||||
*(vtable)
|
||||
*(.data*)
|
||||
|
||||
. = ALIGN(4);
|
||||
/* preinit data */
|
||||
PROVIDE (__preinit_array_start = .);
|
||||
KEEP(*(.preinit_array))
|
||||
PROVIDE (__preinit_array_end = .);
|
||||
|
||||
. = ALIGN(4);
|
||||
/* init data */
|
||||
PROVIDE (__init_array_start = .);
|
||||
KEEP(*(SORT(.init_array.*)))
|
||||
KEEP(*(.init_array))
|
||||
PROVIDE (__init_array_end = .);
|
||||
|
||||
|
||||
. = ALIGN(4);
|
||||
/* finit data */
|
||||
PROVIDE (__fini_array_start = .);
|
||||
KEEP(*(SORT(.fini_array.*)))
|
||||
KEEP(*(.fini_array))
|
||||
PROVIDE (__fini_array_end = .);
|
||||
|
||||
. = ALIGN(4);
|
||||
/* All data end */
|
||||
__data_end__ = .;
|
||||
|
||||
} > Ram0_16
|
||||
|
||||
|
||||
.bss :
|
||||
{
|
||||
__bss_start__ = .;
|
||||
*(.bss*)
|
||||
*(COMMON)
|
||||
__bss_end__ = .;
|
||||
Image$$RW_IRAM1$$ZI$$Limit = . ;
|
||||
} > Ram0_16
|
||||
|
||||
|
||||
.heap :
|
||||
{
|
||||
__end__ = .;
|
||||
end = __end__;
|
||||
*(.heap*)
|
||||
__HeapLimit = .;
|
||||
} > Ram0_16
|
||||
|
||||
/* .stack_dummy section doesn't contains any symbols. It is only
|
||||
* used for linker to calculate size of stack sections, and assign
|
||||
* values to stack symbols later */
|
||||
.stack_dummy :
|
||||
{
|
||||
*(.stack)
|
||||
} > Ram0_16
|
||||
|
||||
/* Set stack top to end of RAM, and stack limit move down by
|
||||
* size of stack_dummy section */
|
||||
__StackTop = ORIGIN(Ram0_16) + LENGTH(Ram0_16);
|
||||
__StackLimit = __StackTop - SIZEOF(.stack_dummy);
|
||||
PROVIDE(__stack = __StackTop);
|
||||
|
||||
/* Check if data + heap + stack exceeds RAM limit */
|
||||
ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
|
||||
}
|
|
@ -0,0 +1,247 @@
|
|||
/* File: startup_ARMCM3.s
|
||||
* Purpose: startup file for Cortex-M3/M4 devices. Should use with
|
||||
* GNU Tools for ARM Embedded Processors
|
||||
* Version: V1.1
|
||||
* Date: 17 June 2011
|
||||
*
|
||||
* Copyright (C) 2011 ARM Limited. All rights reserved.
|
||||
* ARM Limited (ARM) is supplying this software for use with Cortex-M3/M4
|
||||
* processor based microcontrollers. This file can be freely distributed
|
||||
* within development tools that are supporting such ARM based processors.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
|
||||
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
|
||||
* ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
|
||||
* CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
|
||||
*/
|
||||
.syntax unified
|
||||
.arch armv7-m
|
||||
|
||||
/* Memory Model
|
||||
The HEAP starts at the end of the DATA section and grows upward.
|
||||
|
||||
The STACK starts at the end of the RAM and grows downward.
|
||||
|
||||
The HEAP and stack STACK are only checked at compile time:
|
||||
(DATA_SIZE + HEAP_SIZE + STACK_SIZE) < RAM_SIZE
|
||||
|
||||
This is just a check for the bare minimum for the Heap+Stack area before
|
||||
aborting compilation, it is not the run time limit:
|
||||
Heap_Size + Stack_Size = 0x80 + 0x80 = 0x100
|
||||
*/
|
||||
.section .stack
|
||||
.align 3
|
||||
#ifdef __STACK_SIZE
|
||||
.equ Stack_Size, __STACK_SIZE
|
||||
#else
|
||||
.equ Stack_Size, 0xc00
|
||||
#endif
|
||||
.globl __StackTop
|
||||
.globl __StackLimit
|
||||
__StackLimit:
|
||||
.space Stack_Size
|
||||
.size __StackLimit, . - __StackLimit
|
||||
__StackTop:
|
||||
.size __StackTop, . - __StackTop
|
||||
|
||||
.section .heap
|
||||
.align 3
|
||||
#ifdef __HEAP_SIZE
|
||||
.equ Heap_Size, __HEAP_SIZE
|
||||
#else
|
||||
.equ Heap_Size, 0x800
|
||||
#endif
|
||||
.globl __HeapBase
|
||||
.globl __HeapLimit
|
||||
__HeapBase:
|
||||
.space Heap_Size
|
||||
.size __HeapBase, . - __HeapBase
|
||||
__HeapLimit:
|
||||
.size __HeapLimit, . - __HeapLimit
|
||||
|
||||
.section .isr_vector
|
||||
.align 2
|
||||
.globl __isr_vector
|
||||
__isr_vector:
|
||||
.long __StackTop /* Top of Stack */
|
||||
.long Reset_Handler /* Reset Handler */
|
||||
.long NMI_Handler /* NMI Handler */
|
||||
.long HardFault_Handler /* Hard Fault Handler */
|
||||
.long MemManage_Handler /* MPU Fault Handler */
|
||||
.long BusFault_Handler /* Bus Fault Handler */
|
||||
.long UsageFault_Handler /* Usage Fault Handler */
|
||||
.long 0 /* Reserved */
|
||||
.long 0 /* Reserved */
|
||||
.long 0 /* Reserved */
|
||||
.long 0 /* Reserved */
|
||||
.long SVC_Handler /* SVCall Handler */
|
||||
.long DebugMon_Handler /* Debug Monitor Handler */
|
||||
.long 0 /* Reserved */
|
||||
.long PendSV_Handler /* PendSV Handler */
|
||||
.long SysTick_Handler /* SysTick Handler */
|
||||
|
||||
/* External interrupts */
|
||||
.long WDT_IRQHandler /* 0: Windowed watchdog timer */
|
||||
.long BOD_IRQHandler /* 1: Brown-Out Detect */
|
||||
.long FMC_IRQHandler /* 2: Flash controller */
|
||||
.long EEPROM_IRQHandler /* 3: EEPROM controller */
|
||||
.long DMA_IRQHandler /* 4: DMA */
|
||||
.long GINT0_IRQHandler /* 5: GPIO group 0 */
|
||||
.long GINT1_IRQHandler /* 6: GPIO group 1 */
|
||||
.long PIN_INT0_IRQHandler /* 7: PIO INT0 */
|
||||
.long PIN_INT1_IRQHandler /* 8: PIO INT1 */
|
||||
.long PIN_INT2_IRQHandler /* 9: PIO INT2 */
|
||||
.long PIN_INT3_IRQHandler /* 10: PIO INT3 */
|
||||
.long PIN_INT4_IRQHandler /* 11: PIO INT4 */
|
||||
.long PIN_INT5_IRQHandler /* 12: PIO INT5 */
|
||||
.long PIN_INT6_IRQHandler /* 13: PIO INT6 */
|
||||
.long PIN_INT7_IRQHandler /* 14: PIO INT7 */
|
||||
.long RIT_IRQHandler /* 15: Repetitive Interrupt Timer */
|
||||
.long SCT0_IRQHandler /* 16: State configurable timer */
|
||||
.long SCT1_IRQHandler /* 17: State configurable timer */
|
||||
.long SCT2_IRQHandler /* 18: State configurable timer */
|
||||
.long SCT3_IRQHandler /* 19: State configurable timer */
|
||||
.long MRT_IRQHandler /* 20: Multi-Rate Timer */
|
||||
.long UART0_IRQHandler /* 21: UART0 */
|
||||
.long UART1_IRQHandler /* 22: UART1 */
|
||||
.long UART2_IRQHandler /* 23: UART2 */
|
||||
.long I2C0_IRQHandler /* 24: I2C0 controller */
|
||||
.long SPI0_IRQHandler /* 25: SPI0 controller */
|
||||
.long SPI1_IRQHandler /* 26: SPI1 controller */
|
||||
.long CAN_IRQHandler /* 27: C_CAN0 */
|
||||
.long USB_IRQHandler /* 28: USB IRQ */
|
||||
.long USB_FIQHandler /* 29: USB FIQ */
|
||||
.long USBWakeup_IRQHandler /* 30: USB wake-up */
|
||||
.long ADC0A_IRQHandler /* 31: ADC0 sequence A completion */
|
||||
.long ADC0B_IRQHandler /* 32: ADC0 sequence B completion */
|
||||
.long ADC0_THCMP_IRQHandler /* 33: ADC0 threshold compare */
|
||||
.long ADC0_OVR_IRQHandler /* 34: ADC0 overrun */
|
||||
.long ADC1A_IRQHandler /* 35: ADC1 sequence A completion */
|
||||
.long ADC1B_IRQHandler /* 36: ADC1 sequence B completion */
|
||||
.long ADC1_THCMP_IRQHandler /* 37: ADC1 threshold compare */
|
||||
.long ADC1_OVR_IRQHandler /* 38: ADC1 overrun */
|
||||
.long DAC_IRQHandler /* 39: DAC */
|
||||
.long ACMP0_IRQHandler /* 40: Analog Comparator 0 */
|
||||
.long ACMP1_IRQHandler /* 41: Analog Comparator 1 */
|
||||
.long ACMP2_IRQHandler /* 42: Analog Comparator 2 */
|
||||
.long ACMP3_IRQHandler /* 43: Analog Comparator 3 */
|
||||
.long QEI_IRQHandler /* 44: Quadrature Encoder Interface */
|
||||
.long RTC_ALARM_IRQHandler /* 45: RTC alarm */
|
||||
.long RTC_WAKE_IRQHandler /* 46: RTC wake-up */
|
||||
|
||||
.size __isr_vector, . - __isr_vector
|
||||
|
||||
.text
|
||||
.thumb
|
||||
.thumb_func
|
||||
.align 2
|
||||
.globl Reset_Handler
|
||||
.type Reset_Handler, %function
|
||||
Reset_Handler:
|
||||
/* Loop to copy data from read only memory to RAM. The ranges
|
||||
* of copy from/to are specified by following symbols evaluated in
|
||||
* linker script.
|
||||
* _etext: End of code section, i.e., begin of data sections to copy from.
|
||||
* __data_start__/__data_end__: RAM address range that data should be
|
||||
* copied to. Both must be aligned to 4 bytes boundary. */
|
||||
|
||||
ldr r1, =__etext
|
||||
ldr r2, =__data_start__
|
||||
ldr r3, =__data_end__
|
||||
|
||||
.Lflash_to_ram_loop:
|
||||
cmp r2, r3
|
||||
ittt lt
|
||||
ldrlt r0, [r1], #4
|
||||
strlt r0, [r2], #4
|
||||
blt .Lflash_to_ram_loop
|
||||
|
||||
ldr r0, =SystemInit
|
||||
blx r0
|
||||
ldr r0, =_start
|
||||
bx r0
|
||||
.pool
|
||||
.size Reset_Handler, . - Reset_Handler
|
||||
|
||||
.text
|
||||
/* Macro to define default handlers. Default handler
|
||||
* will be weak symbol and just dead loops. They can be
|
||||
* overwritten by other handlers */
|
||||
.macro def_default_handler handler_name
|
||||
.align 1
|
||||
.thumb_func
|
||||
.weak \handler_name
|
||||
.type \handler_name, %function
|
||||
\handler_name :
|
||||
b .
|
||||
.size \handler_name, . - \handler_name
|
||||
.endm
|
||||
|
||||
def_default_handler NMI_Handler
|
||||
def_default_handler HardFault_Handler
|
||||
def_default_handler MemManage_Handler
|
||||
def_default_handler BusFault_Handler
|
||||
def_default_handler UsageFault_Handler
|
||||
def_default_handler SVC_Handler
|
||||
def_default_handler DebugMon_Handler
|
||||
def_default_handler PendSV_Handler
|
||||
def_default_handler SysTick_Handler
|
||||
def_default_handler Default_Handler
|
||||
|
||||
.macro def_irq_default_handler handler_name
|
||||
.weak \handler_name
|
||||
.set \handler_name, Default_Handler
|
||||
.endm
|
||||
|
||||
def_irq_default_handler WDT_IRQHandler
|
||||
def_irq_default_handler BOD_IRQHandler
|
||||
def_irq_default_handler FMC_IRQHandler
|
||||
def_irq_default_handler EEPROM_IRQHandler
|
||||
def_irq_default_handler DMA_IRQHandler
|
||||
def_irq_default_handler GINT0_IRQHandler
|
||||
def_irq_default_handler GINT1_IRQHandler
|
||||
def_irq_default_handler PIN_INT0_IRQHandler
|
||||
def_irq_default_handler PIN_INT1_IRQHandler
|
||||
def_irq_default_handler PIN_INT2_IRQHandler
|
||||
def_irq_default_handler PIN_INT3_IRQHandler
|
||||
def_irq_default_handler PIN_INT4_IRQHandler
|
||||
def_irq_default_handler PIN_INT5_IRQHandler
|
||||
def_irq_default_handler PIN_INT6_IRQHandler
|
||||
def_irq_default_handler PIN_INT7_IRQHandler
|
||||
def_irq_default_handler RIT_IRQHandler
|
||||
def_irq_default_handler SCT0_IRQHandler
|
||||
def_irq_default_handler SCT1_IRQHandler
|
||||
def_irq_default_handler SCT2_IRQHandler
|
||||
def_irq_default_handler SCT3_IRQHandler
|
||||
def_irq_default_handler MRT_IRQHandler
|
||||
def_irq_default_handler UART0_IRQHandler
|
||||
def_irq_default_handler UART1_IRQHandler
|
||||
def_irq_default_handler UART2_IRQHandler
|
||||
def_irq_default_handler I2C0_IRQHandler
|
||||
def_irq_default_handler SPI0_IRQHandler
|
||||
def_irq_default_handler SPI1_IRQHandler
|
||||
def_irq_default_handler CAN_IRQHandler
|
||||
def_irq_default_handler USB_IRQHandler
|
||||
def_irq_default_handler USB_FIQHandler
|
||||
def_irq_default_handler USBWakeup_IRQHandler
|
||||
def_irq_default_handler ADC0A_IRQHandler
|
||||
def_irq_default_handler ADC0B_IRQHandler
|
||||
def_irq_default_handler ADC0_THCMP_IRQHandler
|
||||
def_irq_default_handler ADC0_OVR_IRQHandler
|
||||
def_irq_default_handler ADC1A_IRQHandler
|
||||
def_irq_default_handler ADC1B_IRQHandler
|
||||
def_irq_default_handler ADC1_THCMP_IRQHandler
|
||||
def_irq_default_handler ADC1_OVR_IRQHandler
|
||||
def_irq_default_handler DAC_IRQHandler
|
||||
def_irq_default_handler ACMP0_IRQHandler
|
||||
def_irq_default_handler ACMP1_IRQHandler
|
||||
def_irq_default_handler ACMP2_IRQHandler
|
||||
def_irq_default_handler ACMP3_IRQHandler
|
||||
def_irq_default_handler QEI_IRQHandler
|
||||
def_irq_default_handler RTC_ALARM_IRQHandler
|
||||
def_irq_default_handler RTC_WAKE_IRQHandler
|
||||
def_irq_default_handler DEF_IRQHandler
|
||||
|
||||
.end
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
; *************************************************************
|
||||
; *** Scatter-Loading Description File generated by uVision ***
|
||||
; *************************************************************
|
||||
|
||||
LR_IROM1 0x08000000 0x00100000 { ; load region size_region
|
||||
ER_IROM1 0x08000000 0x00100000 { ; load address = execution address
|
||||
*.o (RESET, +First)
|
||||
*(InRoot$$Sections)
|
||||
.ANY (+RO)
|
||||
}
|
||||
RW_IRAM1 0x10000000 0x00010000 { ; CCM
|
||||
}
|
||||
RW_IRAM2 0x20000188 0x0001FE78 {
|
||||
.ANY (+RW +ZI)
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,369 @@
|
|||
;/*****************************************************************************
|
||||
; * @file: startup_STM32F40x.s
|
||||
; * @purpose: CMSIS Cortex-M4 Core Device Startup File
|
||||
; * for the ST STM32F40x Device Series
|
||||
; * @version: V1.20
|
||||
; * @date: 16. January 2012
|
||||
; *------- <<< Use Configuration Wizard in Context Menu >>> ------------------
|
||||
; *
|
||||
; * Copyright (C) 2012 ARM Limited. All rights reserved.
|
||||
; * ARM Limited (ARM) is supplying this software for use with Cortex-M4
|
||||
; * processor based microcontrollers. This file can be freely distributed
|
||||
; * within development tools that are supporting such ARM based processors.
|
||||
; *
|
||||
; * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
|
||||
; * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
|
||||
; * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
|
||||
; * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
|
||||
; * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
|
||||
; *
|
||||
; *****************************************************************************/
|
||||
|
||||
|
||||
|
||||
__initial_sp EQU 0x20020000 ; Top of RAM from LPC4088
|
||||
|
||||
PRESERVE8
|
||||
THUMB
|
||||
|
||||
; Vector Table Mapped to Address 0 at Reset
|
||||
|
||||
AREA RESET, DATA, READONLY
|
||||
EXPORT __Vectors
|
||||
|
||||
__Vectors DCD __initial_sp ; Top of Stack
|
||||
DCD Reset_Handler ; Reset Handler
|
||||
DCD NMI_Handler ; NMI Handler
|
||||
DCD HardFault_Handler ; Hard Fault Handler
|
||||
DCD MemManage_Handler ; MPU Fault Handler
|
||||
DCD BusFault_Handler ; Bus Fault Handler
|
||||
DCD UsageFault_Handler ; Usage Fault Handler
|
||||
DCD 0 ; Reserved
|
||||
DCD 0 ; Reserved
|
||||
DCD 0 ; Reserved
|
||||
DCD 0 ; Reserved
|
||||
DCD SVC_Handler ; SVCall Handler
|
||||
DCD DebugMon_Handler ; Debug Monitor Handler
|
||||
DCD 0 ; Reserved
|
||||
DCD PendSV_Handler ; PendSV Handler
|
||||
DCD SysTick_Handler ; SysTick Handler
|
||||
|
||||
DCD WWDG_IRQHandler ; Window WatchDog
|
||||
DCD PVD_IRQHandler ; PVD through EXTI Line detection
|
||||
DCD TAMP_STAMP_IRQHandler ; Tamper and TimeStamps through the EXTI line
|
||||
DCD RTC_WKUP_IRQHandler ; RTC Wakeup through the EXTI line
|
||||
DCD FLASH_IRQHandler ; FLASH
|
||||
DCD RCC_IRQHandler ; RCC
|
||||
DCD EXTI0_IRQHandler ; EXTI Line0
|
||||
DCD EXTI1_IRQHandler ; EXTI Line1
|
||||
DCD EXTI2_IRQHandler ; EXTI Line2
|
||||
DCD EXTI3_IRQHandler ; EXTI Line3
|
||||
DCD EXTI4_IRQHandler ; EXTI Line4
|
||||
DCD DMA1_Stream0_IRQHandler ; DMA1 Stream 0
|
||||
DCD DMA1_Stream1_IRQHandler ; DMA1 Stream 1
|
||||
DCD DMA1_Stream2_IRQHandler ; DMA1 Stream 2
|
||||
DCD DMA1_Stream3_IRQHandler ; DMA1 Stream 3
|
||||
DCD DMA1_Stream4_IRQHandler ; DMA1 Stream 4
|
||||
DCD DMA1_Stream5_IRQHandler ; DMA1 Stream 5
|
||||
DCD DMA1_Stream6_IRQHandler ; DMA1 Stream 6
|
||||
DCD ADC_IRQHandler ; ADC1, ADC2 and ADC3s
|
||||
DCD CAN1_TX_IRQHandler ; CAN1 TX
|
||||
DCD CAN1_RX0_IRQHandler ; CAN1 RX0
|
||||
DCD CAN1_RX1_IRQHandler ; CAN1 RX1
|
||||
DCD CAN1_SCE_IRQHandler ; CAN1 SCE
|
||||
DCD EXTI9_5_IRQHandler ; External Line[9:5]s
|
||||
DCD TIM1_BRK_TIM9_IRQHandler ; TIM1 Break and TIM9
|
||||
DCD TIM1_UP_TIM10_IRQHandler ; TIM1 Update and TIM10
|
||||
DCD TIM1_TRG_COM_TIM11_IRQHandler ; TIM1 Trigger and Commutation and TIM11
|
||||
DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare
|
||||
DCD TIM2_IRQHandler ; TIM2
|
||||
DCD TIM3_IRQHandler ; TIM3
|
||||
DCD TIM4_IRQHandler ; TIM4
|
||||
DCD I2C1_EV_IRQHandler ; I2C1 Event
|
||||
DCD I2C1_ER_IRQHandler ; I2C1 Error
|
||||
DCD I2C2_EV_IRQHandler ; I2C2 Event
|
||||
DCD I2C2_ER_IRQHandler ; I2C2 Error
|
||||
DCD SPI1_IRQHandler ; SPI1
|
||||
DCD SPI2_IRQHandler ; SPI2
|
||||
DCD USART1_IRQHandler ; USART1
|
||||
DCD USART2_IRQHandler ; USART2
|
||||
DCD USART3_IRQHandler ; USART3
|
||||
DCD EXTI15_10_IRQHandler ; External Line[15:10]s
|
||||
DCD RTC_Alarm_IRQHandler ; RTC Alarm (A and B) through EXTI Line
|
||||
DCD OTG_FS_WKUP_IRQHandler ; USB OTG FS Wakeup through EXTI line
|
||||
DCD TIM8_BRK_TIM12_IRQHandler ; TIM8 Break and TIM12
|
||||
DCD TIM8_UP_TIM13_IRQHandler ; TIM8 Update and TIM13
|
||||
DCD TIM8_TRG_COM_TIM14_IRQHandler ; TIM8 Trigger and Commutation and TIM14
|
||||
DCD TIM8_CC_IRQHandler ; TIM8 Capture Compare
|
||||
DCD DMA1_Stream7_IRQHandler ; DMA1 Stream7
|
||||
DCD FSMC_IRQHandler ; FSMC
|
||||
DCD SDIO_IRQHandler ; SDIO
|
||||
DCD TIM5_IRQHandler ; TIM5
|
||||
DCD SPI3_IRQHandler ; SPI3
|
||||
DCD UART4_IRQHandler ; UART4
|
||||
DCD UART5_IRQHandler ; UART5
|
||||
DCD TIM6_DAC_IRQHandler ; TIM6 and DAC1&2 underrun errors
|
||||
DCD TIM7_IRQHandler ; TIM7
|
||||
DCD DMA2_Stream0_IRQHandler ; DMA2 Stream 0
|
||||
DCD DMA2_Stream1_IRQHandler ; DMA2 Stream 1
|
||||
DCD DMA2_Stream2_IRQHandler ; DMA2 Stream 2
|
||||
DCD DMA2_Stream3_IRQHandler ; DMA2 Stream 3
|
||||
DCD DMA2_Stream4_IRQHandler ; DMA2 Stream 4
|
||||
DCD ETH_IRQHandler ; Ethernet
|
||||
DCD ETH_WKUP_IRQHandler ; Ethernet Wakeup through EXTI line
|
||||
DCD CAN2_TX_IRQHandler ; CAN2 TX
|
||||
DCD CAN2_RX0_IRQHandler ; CAN2 RX0
|
||||
DCD CAN2_RX1_IRQHandler ; CAN2 RX1
|
||||
DCD CAN2_SCE_IRQHandler ; CAN2 SCE
|
||||
DCD OTG_FS_IRQHandler ; USB OTG FS
|
||||
DCD DMA2_Stream5_IRQHandler ; DMA2 Stream 5
|
||||
DCD DMA2_Stream6_IRQHandler ; DMA2 Stream 6
|
||||
DCD DMA2_Stream7_IRQHandler ; DMA2 Stream 7
|
||||
DCD USART6_IRQHandler ; USART6
|
||||
DCD I2C3_EV_IRQHandler ; I2C3 event
|
||||
DCD I2C3_ER_IRQHandler ; I2C3 error
|
||||
DCD OTG_HS_EP1_OUT_IRQHandler ; USB OTG HS End Point 1 Out
|
||||
DCD OTG_HS_EP1_IN_IRQHandler ; USB OTG HS End Point 1 In
|
||||
DCD OTG_HS_WKUP_IRQHandler ; USB OTG HS Wakeup through EXTI
|
||||
DCD OTG_HS_IRQHandler ; USB OTG HS
|
||||
DCD DCMI_IRQHandler ; DCMI
|
||||
DCD CRYP_IRQHandler ; CRYP crypto
|
||||
DCD HASH_RNG_IRQHandler ; Hash and Rng
|
||||
DCD FPU_IRQHandler ; FPU
|
||||
|
||||
|
||||
AREA |.text|, CODE, READONLY
|
||||
|
||||
|
||||
; Reset Handler
|
||||
|
||||
Reset_Handler PROC
|
||||
EXPORT Reset_Handler [WEAK]
|
||||
IMPORT SystemInit
|
||||
IMPORT __main
|
||||
LDR R0, =SystemInit
|
||||
BLX R0
|
||||
LDR R0, =__main
|
||||
BX R0
|
||||
ENDP
|
||||
|
||||
|
||||
; Dummy Exception Handlers (infinite loops which can be modified)
|
||||
|
||||
NMI_Handler PROC
|
||||
EXPORT NMI_Handler [WEAK]
|
||||
B .
|
||||
ENDP
|
||||
HardFault_Handler\
|
||||
PROC
|
||||
EXPORT HardFault_Handler [WEAK]
|
||||
B .
|
||||
ENDP
|
||||
MemManage_Handler\
|
||||
PROC
|
||||
EXPORT MemManage_Handler [WEAK]
|
||||
B .
|
||||
ENDP
|
||||
BusFault_Handler\
|
||||
PROC
|
||||
EXPORT BusFault_Handler [WEAK]
|
||||
B .
|
||||
ENDP
|
||||
UsageFault_Handler\
|
||||
PROC
|
||||
EXPORT UsageFault_Handler [WEAK]
|
||||
B .
|
||||
ENDP
|
||||
SVC_Handler PROC
|
||||
EXPORT SVC_Handler [WEAK]
|
||||
B .
|
||||
ENDP
|
||||
DebugMon_Handler\
|
||||
PROC
|
||||
EXPORT DebugMon_Handler [WEAK]
|
||||
B .
|
||||
ENDP
|
||||
PendSV_Handler PROC
|
||||
EXPORT PendSV_Handler [WEAK]
|
||||
B .
|
||||
ENDP
|
||||
SysTick_Handler PROC
|
||||
EXPORT SysTick_Handler [WEAK]
|
||||
B .
|
||||
ENDP
|
||||
|
||||
Default_Handler PROC
|
||||
|
||||
EXPORT WWDG_IRQHandler [WEAK]
|
||||
EXPORT PVD_IRQHandler [WEAK]
|
||||
EXPORT TAMP_STAMP_IRQHandler [WEAK]
|
||||
EXPORT RTC_WKUP_IRQHandler [WEAK]
|
||||
EXPORT FLASH_IRQHandler [WEAK]
|
||||
EXPORT RCC_IRQHandler [WEAK]
|
||||
EXPORT EXTI0_IRQHandler [WEAK]
|
||||
EXPORT EXTI1_IRQHandler [WEAK]
|
||||
EXPORT EXTI2_IRQHandler [WEAK]
|
||||
EXPORT EXTI3_IRQHandler [WEAK]
|
||||
EXPORT EXTI4_IRQHandler [WEAK]
|
||||
EXPORT DMA1_Stream0_IRQHandler [WEAK]
|
||||
EXPORT DMA1_Stream1_IRQHandler [WEAK]
|
||||
EXPORT DMA1_Stream2_IRQHandler [WEAK]
|
||||
EXPORT DMA1_Stream3_IRQHandler [WEAK]
|
||||
EXPORT DMA1_Stream4_IRQHandler [WEAK]
|
||||
EXPORT DMA1_Stream5_IRQHandler [WEAK]
|
||||
EXPORT DMA1_Stream6_IRQHandler [WEAK]
|
||||
EXPORT ADC_IRQHandler [WEAK]
|
||||
EXPORT CAN1_TX_IRQHandler [WEAK]
|
||||
EXPORT CAN1_RX0_IRQHandler [WEAK]
|
||||
EXPORT CAN1_RX1_IRQHandler [WEAK]
|
||||
EXPORT CAN1_SCE_IRQHandler [WEAK]
|
||||
EXPORT EXTI9_5_IRQHandler [WEAK]
|
||||
EXPORT TIM1_BRK_TIM9_IRQHandler [WEAK]
|
||||
EXPORT TIM1_UP_TIM10_IRQHandler [WEAK]
|
||||
EXPORT TIM1_TRG_COM_TIM11_IRQHandler [WEAK]
|
||||
EXPORT TIM1_CC_IRQHandler [WEAK]
|
||||
EXPORT TIM2_IRQHandler [WEAK]
|
||||
EXPORT TIM3_IRQHandler [WEAK]
|
||||
EXPORT TIM4_IRQHandler [WEAK]
|
||||
EXPORT I2C1_EV_IRQHandler [WEAK]
|
||||
EXPORT I2C1_ER_IRQHandler [WEAK]
|
||||
EXPORT I2C2_EV_IRQHandler [WEAK]
|
||||
EXPORT I2C2_ER_IRQHandler [WEAK]
|
||||
EXPORT SPI1_IRQHandler [WEAK]
|
||||
EXPORT SPI2_IRQHandler [WEAK]
|
||||
EXPORT USART1_IRQHandler [WEAK]
|
||||
EXPORT USART2_IRQHandler [WEAK]
|
||||
EXPORT USART3_IRQHandler [WEAK]
|
||||
EXPORT EXTI15_10_IRQHandler [WEAK]
|
||||
EXPORT RTC_Alarm_IRQHandler [WEAK]
|
||||
EXPORT OTG_FS_WKUP_IRQHandler [WEAK]
|
||||
EXPORT TIM8_BRK_TIM12_IRQHandler [WEAK]
|
||||
EXPORT TIM8_UP_TIM13_IRQHandler [WEAK]
|
||||
EXPORT TIM8_TRG_COM_TIM14_IRQHandler [WEAK]
|
||||
EXPORT TIM8_CC_IRQHandler [WEAK]
|
||||
EXPORT DMA1_Stream7_IRQHandler [WEAK]
|
||||
EXPORT FSMC_IRQHandler [WEAK]
|
||||
EXPORT SDIO_IRQHandler [WEAK]
|
||||
EXPORT TIM5_IRQHandler [WEAK]
|
||||
EXPORT SPI3_IRQHandler [WEAK]
|
||||
EXPORT UART4_IRQHandler [WEAK]
|
||||
EXPORT UART5_IRQHandler [WEAK]
|
||||
EXPORT TIM6_DAC_IRQHandler [WEAK]
|
||||
EXPORT TIM7_IRQHandler [WEAK]
|
||||
EXPORT DMA2_Stream0_IRQHandler [WEAK]
|
||||
EXPORT DMA2_Stream1_IRQHandler [WEAK]
|
||||
EXPORT DMA2_Stream2_IRQHandler [WEAK]
|
||||
EXPORT DMA2_Stream3_IRQHandler [WEAK]
|
||||
EXPORT DMA2_Stream4_IRQHandler [WEAK]
|
||||
EXPORT ETH_IRQHandler [WEAK]
|
||||
EXPORT ETH_WKUP_IRQHandler [WEAK]
|
||||
EXPORT CAN2_TX_IRQHandler [WEAK]
|
||||
EXPORT CAN2_RX0_IRQHandler [WEAK]
|
||||
EXPORT CAN2_RX1_IRQHandler [WEAK]
|
||||
EXPORT CAN2_SCE_IRQHandler [WEAK]
|
||||
EXPORT OTG_FS_IRQHandler [WEAK]
|
||||
EXPORT DMA2_Stream5_IRQHandler [WEAK]
|
||||
EXPORT DMA2_Stream6_IRQHandler [WEAK]
|
||||
EXPORT DMA2_Stream7_IRQHandler [WEAK]
|
||||
EXPORT USART6_IRQHandler [WEAK]
|
||||
EXPORT I2C3_EV_IRQHandler [WEAK]
|
||||
EXPORT I2C3_ER_IRQHandler [WEAK]
|
||||
EXPORT OTG_HS_EP1_OUT_IRQHandler [WEAK]
|
||||
EXPORT OTG_HS_EP1_IN_IRQHandler [WEAK]
|
||||
EXPORT OTG_HS_WKUP_IRQHandler [WEAK]
|
||||
EXPORT OTG_HS_IRQHandler [WEAK]
|
||||
EXPORT DCMI_IRQHandler [WEAK]
|
||||
EXPORT CRYP_IRQHandler [WEAK]
|
||||
EXPORT HASH_RNG_IRQHandler [WEAK]
|
||||
EXPORT FPU_IRQHandler [WEAK]
|
||||
|
||||
WWDG_IRQHandler
|
||||
PVD_IRQHandler
|
||||
TAMP_STAMP_IRQHandler
|
||||
RTC_WKUP_IRQHandler
|
||||
FLASH_IRQHandler
|
||||
RCC_IRQHandler
|
||||
EXTI0_IRQHandler
|
||||
EXTI1_IRQHandler
|
||||
EXTI2_IRQHandler
|
||||
EXTI3_IRQHandler
|
||||
EXTI4_IRQHandler
|
||||
DMA1_Stream0_IRQHandler
|
||||
DMA1_Stream1_IRQHandler
|
||||
DMA1_Stream2_IRQHandler
|
||||
DMA1_Stream3_IRQHandler
|
||||
DMA1_Stream4_IRQHandler
|
||||
DMA1_Stream5_IRQHandler
|
||||
DMA1_Stream6_IRQHandler
|
||||
ADC_IRQHandler
|
||||
CAN1_TX_IRQHandler
|
||||
CAN1_RX0_IRQHandler
|
||||
CAN1_RX1_IRQHandler
|
||||
CAN1_SCE_IRQHandler
|
||||
EXTI9_5_IRQHandler
|
||||
TIM1_BRK_TIM9_IRQHandler
|
||||
TIM1_UP_TIM10_IRQHandler
|
||||
TIM1_TRG_COM_TIM11_IRQHandler
|
||||
TIM1_CC_IRQHandler
|
||||
TIM2_IRQHandler
|
||||
TIM3_IRQHandler
|
||||
TIM4_IRQHandler
|
||||
I2C1_EV_IRQHandler
|
||||
I2C1_ER_IRQHandler
|
||||
I2C2_EV_IRQHandler
|
||||
I2C2_ER_IRQHandler
|
||||
SPI1_IRQHandler
|
||||
SPI2_IRQHandler
|
||||
USART1_IRQHandler
|
||||
USART2_IRQHandler
|
||||
USART3_IRQHandler
|
||||
EXTI15_10_IRQHandler
|
||||
RTC_Alarm_IRQHandler
|
||||
OTG_FS_WKUP_IRQHandler
|
||||
TIM8_BRK_TIM12_IRQHandler
|
||||
TIM8_UP_TIM13_IRQHandler
|
||||
TIM8_TRG_COM_TIM14_IRQHandler
|
||||
TIM8_CC_IRQHandler
|
||||
DMA1_Stream7_IRQHandler
|
||||
FSMC_IRQHandler
|
||||
SDIO_IRQHandler
|
||||
TIM5_IRQHandler
|
||||
SPI3_IRQHandler
|
||||
UART4_IRQHandler
|
||||
UART5_IRQHandler
|
||||
TIM6_DAC_IRQHandler
|
||||
TIM7_IRQHandler
|
||||
DMA2_Stream0_IRQHandler
|
||||
DMA2_Stream1_IRQHandler
|
||||
DMA2_Stream2_IRQHandler
|
||||
DMA2_Stream3_IRQHandler
|
||||
DMA2_Stream4_IRQHandler
|
||||
ETH_IRQHandler
|
||||
ETH_WKUP_IRQHandler
|
||||
CAN2_TX_IRQHandler
|
||||
CAN2_RX0_IRQHandler
|
||||
CAN2_RX1_IRQHandler
|
||||
CAN2_SCE_IRQHandler
|
||||
OTG_FS_IRQHandler
|
||||
DMA2_Stream5_IRQHandler
|
||||
DMA2_Stream6_IRQHandler
|
||||
DMA2_Stream7_IRQHandler
|
||||
USART6_IRQHandler
|
||||
I2C3_EV_IRQHandler
|
||||
I2C3_ER_IRQHandler
|
||||
OTG_HS_EP1_OUT_IRQHandler
|
||||
OTG_HS_EP1_IN_IRQHandler
|
||||
OTG_HS_WKUP_IRQHandler
|
||||
OTG_HS_IRQHandler
|
||||
DCMI_IRQHandler
|
||||
CRYP_IRQHandler
|
||||
HASH_RNG_IRQHandler
|
||||
FPU_IRQHandler
|
||||
|
||||
B .
|
||||
|
||||
ENDP
|
||||
|
||||
|
||||
ALIGN
|
||||
END
|
|
@ -0,0 +1,31 @@
|
|||
/* mbed Microcontroller Library - stackheap
|
||||
* Copyright (C) 2009-2011 ARM Limited. All rights reserved.
|
||||
*
|
||||
* Setup a fixed single stack/heap memory model,
|
||||
* between the top of the RW/ZI region and the stackpointer
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <rt_misc.h>
|
||||
#include <stdint.h>
|
||||
|
||||
extern char Image$$RW_IRAM1$$ZI$$Limit[];
|
||||
|
||||
extern __value_in_regs struct __initial_stackheap __user_setup_stackheap(uint32_t R0, uint32_t R1, uint32_t R2, uint32_t R3) {
|
||||
uint32_t zi_limit = (uint32_t)Image$$RW_IRAM1$$ZI$$Limit;
|
||||
uint32_t sp_limit = __current_sp();
|
||||
|
||||
zi_limit = (zi_limit + 7) & ~0x7; // ensure zi_limit is 8-byte aligned
|
||||
|
||||
struct __initial_stackheap r;
|
||||
r.heap_base = zi_limit;
|
||||
r.heap_limit = sp_limit;
|
||||
return r;
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
|
@ -9,7 +9,7 @@
|
|||
* This file contains:
|
||||
* - Data structures and the address mapping for all peripherals
|
||||
* - Peripheral's registers declarations and bits definition
|
||||
* - Macros to access peripheral’s registers hardware
|
||||
* - Macros to access peripheral’s registers hardware
|
||||
*
|
||||
******************************************************************************
|
||||
* @attention
|
||||
|
@ -45,12 +45,12 @@
|
|||
* @{
|
||||
*/
|
||||
|
||||
/** @addtogroup stm32f401xe
|
||||
/** @addtogroup stm32f411xe
|
||||
* @{
|
||||
*/
|
||||
|
||||
#ifndef __STM32F401xE_H
|
||||
#define __STM32F401xE_H
|
||||
#ifndef __STM32F411xE_H
|
||||
#define __STM32F411xE_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,385 @@
|
|||
/* Copyright (c) 2011 Nordic Semiconductor. All Rights Reserved.
|
||||
*
|
||||
* The information contained herein is confidential property of Nordic Semiconductor. The use,
|
||||
* copying, transfer or disclosure of such information is prohibited except by express written
|
||||
* agreement with Nordic Semiconductor.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
@addtogroup BLE_COMMON BLE SoftDevice Common
|
||||
@{
|
||||
@defgroup ble_api Events, type definitions and API calls
|
||||
@{
|
||||
|
||||
@brief Module independent events, type definitions and API calls for the S110 SoftDevice.
|
||||
|
||||
*/
|
||||
|
||||
#ifndef BLE_H__
|
||||
#define BLE_H__
|
||||
|
||||
#include "ble_ranges.h"
|
||||
#include "ble_types.h"
|
||||
#include "ble_gap.h"
|
||||
#include "ble_l2cap.h"
|
||||
#include "ble_gatt.h"
|
||||
#include "ble_gattc.h"
|
||||
#include "ble_gatts.h"
|
||||
|
||||
/** @addtogroup BLE_COMMON_ENUMERATIONS Enumerations
|
||||
* @{ */
|
||||
|
||||
/**
|
||||
* @brief Common API SVC numbers.
|
||||
*/
|
||||
enum BLE_COMMON_SVCS
|
||||
{
|
||||
SD_BLE_ENABLE = BLE_SVC_BASE, /**< Enable and initialize the BLE stack */
|
||||
SD_BLE_EVT_GET, /**< Get an event from the pending events queue. */
|
||||
SD_BLE_TX_BUFFER_COUNT_GET, /**< Get the total number of available application transmission buffers from the stack. */
|
||||
SD_BLE_UUID_VS_ADD, /**< Add a Vendor Specific UUID. */
|
||||
SD_BLE_UUID_DECODE, /**< Decode UUID bytes. */
|
||||
SD_BLE_UUID_ENCODE, /**< Encode UUID bytes. */
|
||||
SD_BLE_VERSION_GET, /**< Get the local version information (company id, Link Layer Version, Link Layer Subversion). */
|
||||
SD_BLE_USER_MEM_REPLY, /**< User Memory Reply. */
|
||||
SD_BLE_OPT_SET, /**< Set a BLE option. */
|
||||
SD_BLE_OPT_GET, /**< Get a BLE option. */
|
||||
};
|
||||
|
||||
/** @} */
|
||||
|
||||
/** @addtogroup BLE_COMMON_DEFINES Defines
|
||||
* @{ */
|
||||
|
||||
/** @brief Required pointer alignment for BLE Events.
|
||||
*/
|
||||
#define BLE_EVTS_PTR_ALIGNMENT 4
|
||||
|
||||
/** @defgroup BLE_USER_MEM_TYPES User Memory Types
|
||||
* @{ */
|
||||
#define BLE_USER_MEM_TYPE_INVALID 0x00 /**< Invalid User Memory Types. */
|
||||
#define BLE_USER_MEM_TYPE_GATTS_QUEUED_WRITES 0x01 /**< User Memory for GATTS queued writes. */
|
||||
/** @} */
|
||||
|
||||
/** @brief Maximum number of Vendor Specific UUIDs.
|
||||
*/
|
||||
#define BLE_UUID_VS_MAX_COUNT 10
|
||||
|
||||
/** @} */
|
||||
|
||||
/** @addtogroup BLE_COMMON_STRUCTURES Structures
|
||||
* @{ */
|
||||
|
||||
/**
|
||||
* @brief BLE Module Independent Event IDs.
|
||||
*/
|
||||
enum BLE_COMMON_EVTS
|
||||
{
|
||||
BLE_EVT_TX_COMPLETE = BLE_EVT_BASE, /**< Transmission Complete. */
|
||||
BLE_EVT_USER_MEM_REQUEST, /**< User Memory request. */
|
||||
BLE_EVT_USER_MEM_RELEASE /**< User Memory release. */
|
||||
};
|
||||
|
||||
/**@brief User Memory Block. */
|
||||
typedef struct
|
||||
{
|
||||
uint8_t* p_mem; /**< Pointer to the start of the user memory block. */
|
||||
uint16_t len; /**< Length in bytes of the user memory block. */
|
||||
} ble_user_mem_block_t;
|
||||
|
||||
/**
|
||||
* @brief TX complete event.
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
uint8_t count; /**< Number of packets transmitted. */
|
||||
} ble_evt_tx_complete_t;
|
||||
|
||||
/**@brief Event structure for BLE_EVT_USER_MEM_REQUEST. */
|
||||
typedef struct
|
||||
{
|
||||
uint8_t type; /**< User memory type, see @ref BLE_USER_MEM_TYPES. */
|
||||
} ble_evt_user_mem_request_t;
|
||||
|
||||
/**@brief Event structure for BLE_EVT_USER_MEM_RELEASE. */
|
||||
typedef struct
|
||||
{
|
||||
uint8_t type; /**< User memory type, see @ref BLE_USER_MEM_TYPES. */
|
||||
ble_user_mem_block_t mem_block; /**< User memory block */
|
||||
} ble_evt_user_mem_release_t;
|
||||
|
||||
|
||||
/**@brief Event structure for events not associated with a specific function module. */
|
||||
typedef struct
|
||||
{
|
||||
uint16_t conn_handle; /**< Connection Handle on which this event occured. */
|
||||
union
|
||||
{
|
||||
ble_evt_tx_complete_t tx_complete; /**< Transmission Complete. */
|
||||
ble_evt_user_mem_request_t user_mem_request; /**< User Memory Request Event Parameters. */
|
||||
ble_evt_user_mem_release_t user_mem_release; /**< User Memory Release Event Parameters. */
|
||||
} params;
|
||||
} ble_common_evt_t;
|
||||
|
||||
/**@brief BLE Event header. */
|
||||
typedef struct
|
||||
{
|
||||
uint16_t evt_id; /**< Value from a BLE_<module>_EVT series. */
|
||||
uint16_t evt_len; /**< Length in octets excluding this header. */
|
||||
} ble_evt_hdr_t;
|
||||
|
||||
/**@brief Common BLE Event type, wrapping the module specific event reports. */
|
||||
typedef struct
|
||||
{
|
||||
ble_evt_hdr_t header; /**< Event header. */
|
||||
union
|
||||
{
|
||||
ble_common_evt_t common_evt; /**< Common Event, evt_id in BLE_EVT_* series. */
|
||||
ble_gap_evt_t gap_evt; /**< GAP originated event, evt_id in BLE_GAP_EVT_* series. */
|
||||
ble_l2cap_evt_t l2cap_evt; /**< L2CAP originated event, evt_id in BLE_L2CAP_EVT* series. */
|
||||
ble_gattc_evt_t gattc_evt; /**< GATT client originated event, evt_id in BLE_GATTC_EVT* series. */
|
||||
ble_gatts_evt_t gatts_evt; /**< GATT server originated event, evt_id in BLE_GATTS_EVT* series. */
|
||||
} evt;
|
||||
} ble_evt_t;
|
||||
|
||||
|
||||
/**
|
||||
* @brief Version Information.
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
uint8_t version_number; /**< Link Layer Version number for BT 4.1 spec is 7 (https://www.bluetooth.org/en-us/specification/assigned-numbers/link-layer). */
|
||||
uint16_t company_id; /**< Company ID, Nordic Semiconductor's company ID is 89 (0x0059) (https://www.bluetooth.org/apps/content/Default.aspx?doc_id=49708). */
|
||||
uint16_t subversion_number; /**< Link Layer Sub Version number, corresponds to the SoftDevice Config ID or Firmware ID (FWID). */
|
||||
} ble_version_t;
|
||||
|
||||
/**@brief Common BLE Option type, wrapping the module specific options. */
|
||||
typedef union
|
||||
{
|
||||
ble_gap_opt_t gap; /**< GAP option, opt_id in BLE_GAP_OPT_* series. */
|
||||
} ble_opt_t;
|
||||
|
||||
/**
|
||||
* @brief BLE GATTS init options
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
ble_gatts_enable_params_t gatts_enable_params; /**< GATTS init options @ref ble_gatts_enable_params_t. */
|
||||
} ble_enable_params_t;
|
||||
|
||||
/** @} */
|
||||
|
||||
/** @addtogroup BLE_COMMON_FUNCTIONS Functions
|
||||
* @{ */
|
||||
|
||||
/**@brief Enable the bluetooth stack
|
||||
*
|
||||
* @param[in] p_ble_enable_params Pointer to ble_enable_params_t
|
||||
*
|
||||
* @details This call initializes the bluetooth stack, no other BLE related call can be called before this one has been executed.
|
||||
*
|
||||
* @return @ref NRF_SUCCESS BLE stack has been initialized successfully
|
||||
* @return @ref NRF_ERROR_INVALID_ADDR Invalid or not sufficiently aligned pointer supplied.
|
||||
*/
|
||||
SVCALL(SD_BLE_ENABLE, uint32_t, sd_ble_enable(ble_enable_params_t * p_ble_enable_params));
|
||||
|
||||
/**@brief Get an event from the pending events queue.
|
||||
*
|
||||
* @param[in] p_dest Pointer to buffer to be filled in with an event, or NULL to retrieve the event length. This buffer <b>must be 4-byte aligned in memory</b>.
|
||||
* @param[in, out] p_len Pointer the length of the buffer, on return it is filled with the event length.
|
||||
*
|
||||
* @details This call allows the application to pull a BLE event from the BLE stack. The application is signalled that an event is
|
||||
* available from the BLE Stack by the triggering of the SD_EVT_IRQn interrupt (mapped to IRQ 22).
|
||||
* The application is free to choose whether to call this function from thread mode (main context) or directly from the Interrupt Service Routine
|
||||
* that maps to SD_EVT_IRQn. In any case however, and because the BLE stack runs at a higher priority than the application, this function should be called
|
||||
* in a loop (until @ref NRF_ERROR_NOT_FOUND is returned) every time SD_EVT_IRQn is raised to ensure that all available events are pulled from the stack.
|
||||
* Failure to do so could potentially leave events in the internal queue without the application being aware of this fact.
|
||||
* Sizing the p_dest buffer is equally important, since the application needs to provide all the memory necessary for the event to be copied into
|
||||
* application memory. If the buffer provided is not large enough to fit the entire contents of the event, @ref NRF_ERROR_DATA_SIZE will be returned
|
||||
* and the application can then call again with a larger buffer size.
|
||||
* Please note that because of the variable length nature of some events, sizeof(ble_evt_t) will not always be large enough to fit certain events,
|
||||
* and so it is the application's responsability to provide an amount of memory large enough so that the relevant event is copied in full.
|
||||
* The application may "peek" the event length by providing p_dest as a NULL pointer and inspecting the value of *p_len upon return.
|
||||
*
|
||||
* @note The pointer supplied must be aligned to the extend defined by @ref BLE_EVTS_PTR_ALIGNMENT
|
||||
*
|
||||
* @return @ref NRF_SUCCESS Event pulled and stored into the supplied buffer.
|
||||
* @return @ref NRF_ERROR_INVALID_ADDR Invalid or not sufficiently aligned pointer supplied.
|
||||
* @return @ref NRF_ERROR_NOT_FOUND No events ready to be pulled.
|
||||
* @return @ref NRF_ERROR_DATA_SIZE Event ready but could not fit into the supplied buffer.
|
||||
*/
|
||||
SVCALL(SD_BLE_EVT_GET, uint32_t, sd_ble_evt_get(uint8_t* p_dest, uint16_t *p_len));
|
||||
|
||||
|
||||
/**@brief Get the total number of available application transmission buffers in the BLE stack.
|
||||
*
|
||||
* @details This call allows the application to obtain the total number of
|
||||
* transmission buffers available for application data. Please note that
|
||||
* this does not give the number of free buffers, but rather the total amount of them.
|
||||
* The application has two options to handle its own application transmission buffers:
|
||||
* - Use a simple arithmetic calculation: at boot time the application should use this function
|
||||
* to find out the total amount of buffers available to it and store it in a variable.
|
||||
* Every time a packet that consumes an application buffer is sent using any of the
|
||||
* exposed functions in this BLE API, the application should decrement that variable.
|
||||
* Conversely, whenever a @ref BLE_EVT_TX_COMPLETE event is received by the application
|
||||
* it should retrieve the count field in such event and add that number to the same
|
||||
* variable storing the number of available packets.
|
||||
* This mechanism allows the application to be aware at any time of the number of
|
||||
* application packets available in the BLE stack's internal buffers, and therefore
|
||||
* it can know with certainty whether it is possible to send more data or it has to
|
||||
* wait for a @ref BLE_EVT_TX_COMPLETE event before it proceeds.
|
||||
* - Choose to simply not keep track of available buffers at all, and instead handle the
|
||||
* @ref BLE_ERROR_NO_TX_BUFFERS error by queueing the packet to be transmitted and
|
||||
* try again as soon as a @ref BLE_EVT_TX_COMPLETE event arrives.
|
||||
*
|
||||
* The API functions that <b>may</b> consume an application buffer depending on
|
||||
* the parameters supplied to them can be found below:
|
||||
*
|
||||
* - @ref sd_ble_gattc_write (write witout response only)
|
||||
* - @ref sd_ble_gatts_hvx (notifications only)
|
||||
* - @ref sd_ble_l2cap_tx (all packets)
|
||||
*
|
||||
* @param[out] p_count Pointer to a uint8_t which will contain the number of application transmission buffers upon
|
||||
* successful return.
|
||||
*
|
||||
* @return @ref NRF_SUCCESS Number of application transmission buffers retrieved successfully.
|
||||
* @return @ref NRF_ERROR_INVALID_ADDR Invalid pointer supplied.
|
||||
*/
|
||||
SVCALL(SD_BLE_TX_BUFFER_COUNT_GET, uint32_t, sd_ble_tx_buffer_count_get(uint8_t* p_count));
|
||||
|
||||
|
||||
/**@brief Add a Vendor Specific UUID.
|
||||
*
|
||||
* @details This call enables the application to add a vendor specific UUID to the BLE stack's table,
|
||||
* for later use all other modules and APIs. This then allows the application to use the shorter,
|
||||
* 24-bit @ref ble_uuid_t format when dealing with both 16-bit and 128-bit UUIDs without having to
|
||||
* check for lengths and having split code paths. The way that this is accomplished is by extending the
|
||||
* grouping mechanism that the Bluetooth SIG standard base UUID uses for all other 128-bit UUIDs. The
|
||||
* type field in the @ref ble_uuid_t structure is an index (relative to @ref BLE_UUID_TYPE_VENDOR_BEGIN)
|
||||
* to the table populated by multiple calls to this function, and the uuid field in the same structure
|
||||
* contains the 2 bytes at indices 12 and 13. The number of possible 128-bit UUIDs available to the
|
||||
* application is therefore the number of Vendor Specific UUIDs added with the help of this function times 65536,
|
||||
* although restricted to modifying bytes 12 and 13 for each of the entries in the supplied array.
|
||||
*
|
||||
* @note Bytes 12 and 13 of the provided UUID will not be used internally, since those are always replaced by
|
||||
* the 16-bit uuid field in @ref ble_uuid_t.
|
||||
*
|
||||
*
|
||||
* @param[in] p_vs_uuid Pointer to a 16-octet (128-bit) little endian Vendor Specific UUID disregarding
|
||||
* bytes 12 and 13.
|
||||
* @param[out] p_uuid_type Pointer where the type field in @ref ble_uuid_t corresponding to this UUID will be stored.
|
||||
*
|
||||
* @return @ref NRF_SUCCESS Successfully added the Vendor Specific UUID.
|
||||
* @return @ref NRF_ERROR_INVALID_ADDR If p_vs_uuid or p_uuid_type is NULL or invalid.
|
||||
* @return @ref NRF_ERROR_NO_MEM If there are no more free slots for VS UUIDs.
|
||||
* @return @ref NRF_ERROR_FORBIDDEN If p_vs_uuid has already been added to the VS UUID table.
|
||||
*/
|
||||
SVCALL(SD_BLE_UUID_VS_ADD, uint32_t, sd_ble_uuid_vs_add(ble_uuid128_t const * const p_vs_uuid, uint8_t * const p_uuid_type));
|
||||
|
||||
|
||||
/** @brief Decode little endian raw UUID bytes (16-bit or 128-bit) into a 24 bit @ref ble_uuid_t structure.
|
||||
*
|
||||
* @details The raw UUID bytes excluding bytes 12 and 13 (i.e. bytes 0-11 and 14-15) of p_uuid_le are compared
|
||||
* to the corresponding ones in each entry of the table of vendor specific UUIDs pouplated with @ref sd_ble_uuid_vs_add
|
||||
* to look for a match. If there is such a match, bytes 12 and 13 are returned as p_uuid->uuid and the index
|
||||
* relative to @ref BLE_UUID_TYPE_VENDOR_BEGIN as p_uuid->type.
|
||||
*
|
||||
* @note If the UUID length supplied is 2, then the type set by this call will always be @ref BLE_UUID_TYPE_BLE.
|
||||
*
|
||||
* @param[in] uuid_le_len Length in bytes of the buffer pointed to by p_uuid_le (must be 2 or 16 bytes).
|
||||
* @param[in] p_uuid_le Pointer pointing to little endian raw UUID bytes.
|
||||
* @param[in,out] p_uuid Pointer to a @ref ble_uuid_t structure to be filled in.
|
||||
*
|
||||
* @return @ref NRF_SUCCESS Successfully decoded into the @ref ble_uuid_t structure.
|
||||
* @return @ref NRF_ERROR_INVALID_ADDR Invalid pointer supplied.
|
||||
* @return @ref NRF_ERROR_INVALID_LENGTH Invalid UUID length.
|
||||
* @return @ref NRF_ERROR_NOT_FOUND For a 128-bit UUID, no match in the populated table of UUIDs.
|
||||
*/
|
||||
SVCALL(SD_BLE_UUID_DECODE, uint32_t, sd_ble_uuid_decode(uint8_t uuid_le_len, uint8_t const * const p_uuid_le, ble_uuid_t * const p_uuid));
|
||||
|
||||
|
||||
/** @brief Encode a @ref ble_uuid_t structure into little endian raw UUID bytes (16-bit or 128-bit).
|
||||
*
|
||||
* @note The pointer to the destination buffer p_uuid_le may be NULL, in which case only the validitiy and size of p_uuid is computed.
|
||||
*
|
||||
* @param[in] p_uuid Pointer to a @ref ble_uuid_t structure that will be encoded into bytes.
|
||||
* @param[out] p_uuid_le_len Pointer to a uint8_t that will be filled with the encoded length (2 or 16 bytes).
|
||||
* @param[out] p_uuid_le Pointer to a buffer where the little endian raw UUID bytes (2 or 16) will be stored.
|
||||
*
|
||||
* @return @ref NRF_SUCCESS Successfully encoded into the buffer.
|
||||
* @return @ref NRF_ERROR_INVALID_ADDR Invalid pointer supplied.
|
||||
* @return @ref NRF_ERROR_INVALID_PARAM Invalid UUID type.
|
||||
*/
|
||||
SVCALL(SD_BLE_UUID_ENCODE, uint32_t, sd_ble_uuid_encode(ble_uuid_t const * const p_uuid, uint8_t * const p_uuid_le_len, uint8_t * const p_uuid_le));
|
||||
|
||||
|
||||
/**@brief Get Version Information.
|
||||
*
|
||||
* @details This call allows the application to get the BLE stack version information.
|
||||
*
|
||||
* @param[in] p_version Pointer to ble_version_t structure to be filled in.
|
||||
*
|
||||
* @return @ref NRF_SUCCESS Version information stored successfully.
|
||||
* @return @ref NRF_ERROR_INVALID_ADDR Invalid pointer supplied.
|
||||
* @return @ref NRF_ERROR_BUSY The stack is busy (typically doing a locally-initiated disconnection procedure).
|
||||
*/
|
||||
SVCALL(SD_BLE_VERSION_GET, uint32_t, sd_ble_version_get(ble_version_t * p_version));
|
||||
|
||||
|
||||
/**@brief Provide a user memory block.
|
||||
*
|
||||
* @note This call can only be used as a response to a @ref BLE_EVT_USER_MEM_REQUEST event issued to the application.
|
||||
*
|
||||
* @param[in] conn_handle Connection handle.
|
||||
* @param[in] p_block Pointer to a user memory block structure.
|
||||
*
|
||||
* @return @ref NRF_SUCCESS Successfully queued a response to the peer.
|
||||
* @return @ref BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle.
|
||||
* @return @ref NRF_ERROR_INVALID_STATE No execute write request pending.
|
||||
*/
|
||||
SVCALL(SD_BLE_USER_MEM_REPLY, uint32_t, sd_ble_user_mem_reply(uint16_t conn_handle, ble_user_mem_block_t *p_block));
|
||||
|
||||
|
||||
/**@brief Set a BLE option.
|
||||
*
|
||||
* @details This call allows the application to set the value of an option.
|
||||
*
|
||||
* @param[in] opt_id Option ID.
|
||||
* @param[in] p_opt Pointer to a ble_opt_t structure containing the option value.
|
||||
*
|
||||
* @retval ::NRF_SUCCESS Option set successfully.
|
||||
* @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied.
|
||||
* @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle.
|
||||
* @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, check parameter limits and constraints.
|
||||
* @retval ::NRF_ERROR_INVALID_STATE Unable to set the parameter at this time.
|
||||
* @retval ::NRF_ERROR_BUSY The stack is busy or the previous procedure has not completed.
|
||||
*/
|
||||
SVCALL(SD_BLE_OPT_SET, uint32_t, sd_ble_opt_set(uint32_t opt_id, ble_opt_t const *p_opt));
|
||||
|
||||
|
||||
/**@brief Get a BLE option.
|
||||
*
|
||||
* @details This call allows the application to retrieve the value of an option.
|
||||
*
|
||||
* @param[in] opt_id Option ID.
|
||||
* @param[out] p_opt Pointer to a ble_opt_t structure to be filled in.
|
||||
*
|
||||
* @retval ::NRF_SUCCESS Option retrieved successfully.
|
||||
* @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied.
|
||||
* @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle.
|
||||
* @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, check parameter limits and constraints.
|
||||
* @retval ::NRF_ERROR_INVALID_STATE Unable to retrieve the parameter at this time.
|
||||
* @retval ::NRF_ERROR_BUSY The stack is busy or the previous procedure has not completed.
|
||||
* @retval ::NRF_ERROR_NOT_SUPPORTED This option is not supported.
|
||||
*
|
||||
*/
|
||||
SVCALL(SD_BLE_OPT_GET, uint32_t, sd_ble_opt_get(uint32_t opt_id, ble_opt_t *p_opt));
|
||||
|
||||
/** @} */
|
||||
|
||||
#endif /* BLE_H__ */
|
||||
|
||||
/**
|
||||
@}
|
||||
@}
|
||||
*/
|
|
@ -0,0 +1,54 @@
|
|||
/*
|
||||
* Copyright (c) 2012 Nordic Semiconductor. All Rights Reserved.
|
||||
*
|
||||
* The information contained herein is confidential property of Nordic Semiconductor. The use,
|
||||
* copying, transfer or disclosure of such information is prohibited except by express written
|
||||
* agreement with Nordic Semiconductor.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
@addtogroup BLE_COMMON
|
||||
@{
|
||||
@addtogroup nrf_error
|
||||
@{
|
||||
@ingroup BLE_COMMON
|
||||
@}
|
||||
|
||||
@defgroup ble_err General error codes
|
||||
@{
|
||||
|
||||
@brief General error code definitions for the BLE API.
|
||||
|
||||
@ingroup BLE_COMMON
|
||||
*/
|
||||
#ifndef NRF_BLE_ERR_H__
|
||||
#define NRF_BLE_ERR_H__
|
||||
|
||||
#include "nrf_error.h"
|
||||
|
||||
/* @defgroup BLE_ERRORS Error Codes
|
||||
* @{ */
|
||||
#define BLE_ERROR_NOT_ENABLED (NRF_ERROR_STK_BASE_NUM+0x001) /**< @ref sd_ble_enable has not been called. */
|
||||
#define BLE_ERROR_INVALID_CONN_HANDLE (NRF_ERROR_STK_BASE_NUM+0x002) /**< Invalid connection handle. */
|
||||
#define BLE_ERROR_INVALID_ATTR_HANDLE (NRF_ERROR_STK_BASE_NUM+0x003) /**< Invalid attribute handle. */
|
||||
#define BLE_ERROR_NO_TX_BUFFERS (NRF_ERROR_STK_BASE_NUM+0x004) /**< Buffer capacity exceeded. */
|
||||
/** @} */
|
||||
|
||||
|
||||
/** @defgroup BLE_ERROR_SUBRANGES Module specific error code subranges
|
||||
* @brief Assignment of subranges for module specific error codes.
|
||||
* @note For specific error codes, see ble_<module>.h or ble_error_<module>.h.
|
||||
* @{ */
|
||||
#define NRF_L2CAP_ERR_BASE (NRF_ERROR_STK_BASE_NUM+0x100) /**< L2CAP specific errors. */
|
||||
#define NRF_GAP_ERR_BASE (NRF_ERROR_STK_BASE_NUM+0x200) /**< GAP specific errors. */
|
||||
#define NRF_GATTC_ERR_BASE (NRF_ERROR_STK_BASE_NUM+0x300) /**< GATT client specific errors. */
|
||||
#define NRF_GATTS_ERR_BASE (NRF_ERROR_STK_BASE_NUM+0x400) /**< GATT server specific errors. */
|
||||
/** @} */
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
@}
|
||||
@}
|
||||
*/
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,171 @@
|
|||
/* Copyright (c) 2012 Nordic Semiconductor. All Rights Reserved.
|
||||
*
|
||||
* The information contained herein is confidential property of Nordic Semiconductor. The use,
|
||||
* copying, transfer or disclosure of such information is prohibited except by express written
|
||||
* agreement with Nordic Semiconductor.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
@addtogroup BLE_GATT Generic Attribute Profile (GATT) Common
|
||||
@{
|
||||
@brief Common definitions and prototypes for the GATT interfaces.
|
||||
*/
|
||||
|
||||
#ifndef BLE_GATT_H__
|
||||
#define BLE_GATT_H__
|
||||
|
||||
#include "ble_types.h"
|
||||
#include "ble_ranges.h"
|
||||
|
||||
|
||||
/** @addtogroup BLE_GATT_DEFINES Defines
|
||||
* @{ */
|
||||
|
||||
/** @brief Default MTU size. */
|
||||
#define GATT_MTU_SIZE_DEFAULT 23
|
||||
|
||||
/** @brief Only the default MTU size of 23 is currently supported. */
|
||||
#define GATT_RX_MTU 23
|
||||
|
||||
|
||||
/**@brief Invalid Attribute Handle. */
|
||||
#define BLE_GATT_HANDLE_INVALID 0x0000
|
||||
|
||||
/** @defgroup BLE_GATT_TIMEOUT_SOURCES GATT Timeout sources
|
||||
* @{ */
|
||||
#define BLE_GATT_TIMEOUT_SRC_PROTOCOL 0x00 /**< ATT Protocol timeout. */
|
||||
/** @} */
|
||||
|
||||
/** @defgroup BLE_GATT_WRITE_OPS GATT Write operations
|
||||
* @{ */
|
||||
#define BLE_GATT_OP_INVALID 0x00 /**< Invalid Operation. */
|
||||
#define BLE_GATT_OP_WRITE_REQ 0x01 /**< Write Request. */
|
||||
#define BLE_GATT_OP_WRITE_CMD 0x02 /**< Write Command. */
|
||||
#define BLE_GATT_OP_SIGN_WRITE_CMD 0x03 /**< Signed Write Command. */
|
||||
#define BLE_GATT_OP_PREP_WRITE_REQ 0x04 /**< Prepare Write Request. */
|
||||
#define BLE_GATT_OP_EXEC_WRITE_REQ 0x05 /**< Execute Write Request. */
|
||||
/** @} */
|
||||
|
||||
/** @defgroup BLE_GATT_EXEC_WRITE_FLAGS GATT Execute Write flags
|
||||
* @{ */
|
||||
#define BLE_GATT_EXEC_WRITE_FLAG_PREPARED_CANCEL 0x00
|
||||
#define BLE_GATT_EXEC_WRITE_FLAG_PREPARED_WRITE 0x01
|
||||
/** @} */
|
||||
|
||||
/** @defgroup BLE_GATT_HVX_TYPES GATT Handle Value operations
|
||||
* @{ */
|
||||
#define BLE_GATT_HVX_INVALID 0x00 /**< Invalid Operation. */
|
||||
#define BLE_GATT_HVX_NOTIFICATION 0x01 /**< Handle Value Notification. */
|
||||
#define BLE_GATT_HVX_INDICATION 0x02 /**< Handle Value Indication. */
|
||||
/** @} */
|
||||
|
||||
/** @defgroup BLE_GATT_STATUS_CODES GATT Status Codes
|
||||
* @{ */
|
||||
#define BLE_GATT_STATUS_SUCCESS 0x0000 /**< Success. */
|
||||
#define BLE_GATT_STATUS_UNKNOWN 0x0001 /**< Unknown or not applicable status. */
|
||||
#define BLE_GATT_STATUS_ATTERR_INVALID 0x0100 /**< ATT Error: Invalid Error Code. */
|
||||
#define BLE_GATT_STATUS_ATTERR_INVALID_HANDLE 0x0101 /**< ATT Error: Invalid Attribute Handle. */
|
||||
#define BLE_GATT_STATUS_ATTERR_READ_NOT_PERMITTED 0x0102 /**< ATT Error: Read not permitted. */
|
||||
#define BLE_GATT_STATUS_ATTERR_WRITE_NOT_PERMITTED 0x0103 /**< ATT Error: Write not permitted. */
|
||||
#define BLE_GATT_STATUS_ATTERR_INVALID_PDU 0x0104 /**< ATT Error: Used in ATT as Invalid PDU. */
|
||||
#define BLE_GATT_STATUS_ATTERR_INSUF_AUTHENTICATION 0x0105 /**< ATT Error: Authenticated link required. */
|
||||
#define BLE_GATT_STATUS_ATTERR_REQUEST_NOT_SUPPORTED 0x0106 /**< ATT Error: Used in ATT as Request Not Supported. */
|
||||
#define BLE_GATT_STATUS_ATTERR_INVALID_OFFSET 0x0107 /**< ATT Error: Offset specified was past the end of the attribute. */
|
||||
#define BLE_GATT_STATUS_ATTERR_INSUF_AUTHORIZATION 0x0108 /**< ATT Error: Used in ATT as Insufficient Authorisation. */
|
||||
#define BLE_GATT_STATUS_ATTERR_PREPARE_QUEUE_FULL 0x0109 /**< ATT Error: Used in ATT as Prepare Queue Full. */
|
||||
#define BLE_GATT_STATUS_ATTERR_ATTRIBUTE_NOT_FOUND 0x010A /**< ATT Error: Used in ATT as Attribute not found. */
|
||||
#define BLE_GATT_STATUS_ATTERR_ATTRIBUTE_NOT_LONG 0x010B /**< ATT Error: Attribute cannot be read or written using read/write blob requests. */
|
||||
#define BLE_GATT_STATUS_ATTERR_INSUF_ENC_KEY_SIZE 0x010C /**< ATT Error: Encryption key size used is insufficient. */
|
||||
#define BLE_GATT_STATUS_ATTERR_INVALID_ATT_VAL_LENGTH 0x010D /**< ATT Error: Invalid value size. */
|
||||
#define BLE_GATT_STATUS_ATTERR_UNLIKELY_ERROR 0x010E /**< ATT Error: Very unlikely error. */
|
||||
#define BLE_GATT_STATUS_ATTERR_INSUF_ENCRYPTION 0x010F /**< ATT Error: Encrypted link required. */
|
||||
#define BLE_GATT_STATUS_ATTERR_UNSUPPORTED_GROUP_TYPE 0x0110 /**< ATT Error: Attribute type is not a supported grouping attribute. */
|
||||
#define BLE_GATT_STATUS_ATTERR_INSUF_RESOURCES 0x0111 /**< ATT Error: Encrypted link required. */
|
||||
#define BLE_GATT_STATUS_ATTERR_RFU_RANGE1_BEGIN 0x0112 /**< ATT Error: Reserved for Future Use range #1 begin. */
|
||||
#define BLE_GATT_STATUS_ATTERR_RFU_RANGE1_END 0x017F /**< ATT Error: Reserved for Future Use range #1 end. */
|
||||
#define BLE_GATT_STATUS_ATTERR_APP_BEGIN 0x0180 /**< ATT Error: Application range begin. */
|
||||
#define BLE_GATT_STATUS_ATTERR_APP_END 0x019F /**< ATT Error: Application range end. */
|
||||
#define BLE_GATT_STATUS_ATTERR_RFU_RANGE2_BEGIN 0x01A0 /**< ATT Error: Reserved for Future Use range #2 begin. */
|
||||
#define BLE_GATT_STATUS_ATTERR_RFU_RANGE2_END 0x01DF /**< ATT Error: Reserved for Future Use range #2 end. */
|
||||
#define BLE_GATT_STATUS_ATTERR_RFU_RANGE3_BEGIN 0x01E0 /**< ATT Error: Reserved for Future Use range #3 begin. */
|
||||
#define BLE_GATT_STATUS_ATTERR_RFU_RANGE3_END 0x01FC /**< ATT Error: Reserved for Future Use range #3 end. */
|
||||
#define BLE_GATT_STATUS_ATTERR_CPS_CCCD_CONFIG_ERROR 0x01FD /**< ATT Common Profile and Service Error: Client Characteristic Configuration Descriptor improperly configured. */
|
||||
#define BLE_GATT_STATUS_ATTERR_CPS_PROC_ALR_IN_PROG 0x01FE /**< ATT Common Profile and Service Error: Procedure Already in Progress. */
|
||||
#define BLE_GATT_STATUS_ATTERR_CPS_OUT_OF_RANGE 0x01FF /**< ATT Common Profile and Service Error: Out Of Range. */
|
||||
/** @} */
|
||||
|
||||
|
||||
/** @defgroup BLE_GATT_CPF_FORMATS Characteristic Presentation Formats
|
||||
* @note Found at http://developer.bluetooth.org/gatt/descriptors/Pages/DescriptorViewer.aspx?u=org.bluetooth.descriptor.gatt.characteristic_presentation_format.xml
|
||||
* @{ */
|
||||
#define BLE_GATT_CPF_FORMAT_RFU 0x00 /**< Reserved For Future Use. */
|
||||
#define BLE_GATT_CPF_FORMAT_BOOLEAN 0x01 /**< Boolean. */
|
||||
#define BLE_GATT_CPF_FORMAT_2BIT 0x02 /**< Unsigned 2-bit integer. */
|
||||
#define BLE_GATT_CPF_FORMAT_NIBBLE 0x03 /**< Unsigned 4-bit integer. */
|
||||
#define BLE_GATT_CPF_FORMAT_UINT8 0x04 /**< Unsigned 8-bit integer. */
|
||||
#define BLE_GATT_CPF_FORMAT_UINT12 0x05 /**< Unsigned 12-bit integer. */
|
||||
#define BLE_GATT_CPF_FORMAT_UINT16 0x06 /**< Unsigned 16-bit integer. */
|
||||
#define BLE_GATT_CPF_FORMAT_UINT24 0x07 /**< Unsigned 24-bit integer. */
|
||||
#define BLE_GATT_CPF_FORMAT_UINT32 0x08 /**< Unsigned 32-bit integer. */
|
||||
#define BLE_GATT_CPF_FORMAT_UINT48 0x09 /**< Unsigned 48-bit integer. */
|
||||
#define BLE_GATT_CPF_FORMAT_UINT64 0x0A /**< Unsigned 64-bit integer. */
|
||||
#define BLE_GATT_CPF_FORMAT_UINT128 0x0B /**< Unsigned 128-bit integer. */
|
||||
#define BLE_GATT_CPF_FORMAT_SINT8 0x0C /**< Signed 2-bit integer. */
|
||||
#define BLE_GATT_CPF_FORMAT_SINT12 0x0D /**< Signed 12-bit integer. */
|
||||
#define BLE_GATT_CPF_FORMAT_SINT16 0x0E /**< Signed 16-bit integer. */
|
||||
#define BLE_GATT_CPF_FORMAT_SINT24 0x0F /**< Signed 24-bit integer. */
|
||||
#define BLE_GATT_CPF_FORMAT_SINT32 0x10 /**< Signed 32-bit integer. */
|
||||
#define BLE_GATT_CPF_FORMAT_SINT48 0x11 /**< Signed 48-bit integer. */
|
||||
#define BLE_GATT_CPF_FORMAT_SINT64 0x12 /**< Signed 64-bit integer. */
|
||||
#define BLE_GATT_CPF_FORMAT_SINT128 0x13 /**< Signed 128-bit integer. */
|
||||
#define BLE_GATT_CPF_FORMAT_FLOAT32 0x14 /**< IEEE-754 32-bit floating point. */
|
||||
#define BLE_GATT_CPF_FORMAT_FLOAT64 0x15 /**< IEEE-754 64-bit floating point. */
|
||||
#define BLE_GATT_CPF_FORMAT_SFLOAT 0x16 /**< IEEE-11073 16-bit SFLOAT. */
|
||||
#define BLE_GATT_CPF_FORMAT_FLOAT 0x17 /**< IEEE-11073 32-bit FLOAT. */
|
||||
#define BLE_GATT_CPF_FORMAT_DUINT16 0x18 /**< IEEE-20601 format. */
|
||||
#define BLE_GATT_CPF_FORMAT_UTF8S 0x19 /**< UTF-8 string. */
|
||||
#define BLE_GATT_CPF_FORMAT_UTF16S 0x1A /**< UTF-16 string. */
|
||||
#define BLE_GATT_CPF_FORMAT_STRUCT 0x1B /**< Opaque Structure. */
|
||||
/** @} */
|
||||
|
||||
/** @defgroup BLE_GATT_CPF_NAMESPACES GATT Bluetooth Namespaces
|
||||
* @{
|
||||
*/
|
||||
#define BLE_GATT_CPF_NAMESPACE_BTSIG 0x01
|
||||
#define BLE_GATT_CPF_NAMESPACE_DESCRIPTION_UNKNOWN 0x0000
|
||||
/** @} */
|
||||
|
||||
/** @} */
|
||||
|
||||
/** @addtogroup BLE_GATT_STRUCTURES Structures
|
||||
* @{ */
|
||||
|
||||
/**@brief GATT Characteristic Properties. */
|
||||
typedef struct
|
||||
{
|
||||
/* Standard properties */
|
||||
uint8_t broadcast :1; /**< Broadcasting of value permitted. */
|
||||
uint8_t read :1; /**< Reading value permitted. */
|
||||
uint8_t write_wo_resp :1; /**< Writing value with Write Command permitted. */
|
||||
uint8_t write :1; /**< Writing value with Write Request permitted. */
|
||||
uint8_t notify :1; /**< Notications of value permitted. */
|
||||
uint8_t indicate :1; /**< Indications of value permitted. */
|
||||
uint8_t auth_signed_wr :1; /**< Writing value with Signed Write Command permitted. */
|
||||
} ble_gatt_char_props_t;
|
||||
|
||||
/**@brief GATT Characteristic Extended Properties. */
|
||||
typedef struct
|
||||
{
|
||||
/* Extended properties */
|
||||
uint8_t reliable_wr :1; /**< Writing value with Queued Write Request permitted. */
|
||||
uint8_t wr_aux :1; /**< Writing the Characteristic User Description permitted. */
|
||||
} ble_gatt_char_ext_props_t;
|
||||
|
||||
#endif // BLE_GATT_H__
|
||||
|
||||
/** @} */
|
||||
|
||||
/**
|
||||
@}
|
||||
@}
|
||||
*/
|
|
@ -0,0 +1,406 @@
|
|||
/* Copyright (c) 2012 Nordic Semiconductor. All Rights Reserved.
|
||||
*
|
||||
* The information contained herein is confidential property of Nordic Semiconductor. The use,
|
||||
* copying, transfer or disclosure of such information is prohibited except by express written
|
||||
* agreement with Nordic Semiconductor.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
@addtogroup BLE_GATTC Generic Attribute Profile (GATT) Client
|
||||
@{
|
||||
@brief Definitions and prototypes for the GATT Client interface.
|
||||
*/
|
||||
|
||||
#ifndef BLE_GATTC_H__
|
||||
#define BLE_GATTC_H__
|
||||
|
||||
#include "ble_gatt.h"
|
||||
#include "ble_types.h"
|
||||
#include "ble_ranges.h"
|
||||
#include "nrf_svc.h"
|
||||
|
||||
/** @addtogroup BLE_GATTC_ENUMERATIONS Enumerations
|
||||
* @{ */
|
||||
|
||||
/**@brief GATTC API SVC numbers. */
|
||||
enum BLE_GATTC_SVCS
|
||||
{
|
||||
SD_BLE_GATTC_PRIMARY_SERVICES_DISCOVER = BLE_GATTC_SVC_BASE, /**< Primary Service Discovery. */
|
||||
SD_BLE_GATTC_RELATIONSHIPS_DISCOVER, /**< Relationship Discovery. */
|
||||
SD_BLE_GATTC_CHARACTERISTICS_DISCOVER, /**< Characteristic Discovery. */
|
||||
SD_BLE_GATTC_DESCRIPTORS_DISCOVER, /**< Characteristic Descriptor Discovery. */
|
||||
SD_BLE_GATTC_CHAR_VALUE_BY_UUID_READ, /**< Read Characteristic Value by UUID. */
|
||||
SD_BLE_GATTC_READ, /**< Generic read. */
|
||||
SD_BLE_GATTC_CHAR_VALUES_READ, /**< Read multiple Characteristic Values. */
|
||||
SD_BLE_GATTC_WRITE, /**< Generic write. */
|
||||
SD_BLE_GATTC_HV_CONFIRM /**< Handle Value Confirmation. */
|
||||
};
|
||||
|
||||
/** @} */
|
||||
|
||||
/** @addtogroup BLE_GATTC_DEFINES Defines
|
||||
* @{ */
|
||||
|
||||
/** @defgroup BLE_ERRORS_GATTC SVC return values specific to GATTC
|
||||
* @{ */
|
||||
#define BLE_ERROR_GATTC_PROC_NOT_PERMITTED (NRF_GATTC_ERR_BASE + 0x000)
|
||||
/** @} */
|
||||
|
||||
/**@brief Last Attribute Handle. */
|
||||
#define BLE_GATTC_HANDLE_END 0xFFFF
|
||||
|
||||
/** @} */
|
||||
|
||||
/** @addtogroup BLE_GATTC_STRUCTURES Structures
|
||||
* @{ */
|
||||
|
||||
/**@brief Operation Handle Range. */
|
||||
typedef struct
|
||||
{
|
||||
uint16_t start_handle; /**< Start Handle. */
|
||||
uint16_t end_handle; /**< End Handle. */
|
||||
} ble_gattc_handle_range_t;
|
||||
|
||||
|
||||
/**@brief GATT service. */
|
||||
typedef struct
|
||||
{
|
||||
ble_uuid_t uuid; /**< Service UUID. */
|
||||
ble_gattc_handle_range_t handle_range; /**< Service Handle Range. */
|
||||
} ble_gattc_service_t;
|
||||
|
||||
|
||||
/**@brief GATT include. */
|
||||
typedef struct
|
||||
{
|
||||
uint16_t handle; /**< Include Handle. */
|
||||
ble_gattc_service_t included_srvc; /**< Handle of the included service. */
|
||||
} ble_gattc_include_t;
|
||||
|
||||
|
||||
/**@brief GATT characteristic. */
|
||||
typedef struct
|
||||
{
|
||||
ble_uuid_t uuid; /**< Characteristic UUID. */
|
||||
ble_gatt_char_props_t char_props; /**< Characteristic Properties. */
|
||||
uint8_t char_ext_props : 1; /**< Extended properties present. */
|
||||
uint16_t handle_decl; /**< Handle of the Characteristic Declaration. */
|
||||
uint16_t handle_value; /**< Handle of the Characteristic Value. */
|
||||
} ble_gattc_char_t;
|
||||
|
||||
|
||||
/**@brief GATT descriptor. */
|
||||
typedef struct
|
||||
{
|
||||
uint16_t handle; /**< Descriptor Handle. */
|
||||
ble_uuid_t uuid; /**< Descriptor UUID. */
|
||||
} ble_gattc_desc_t;
|
||||
|
||||
|
||||
/**@brief Write Parameters. */
|
||||
typedef struct
|
||||
{
|
||||
uint8_t write_op; /**< Write Operation to be performed, see @ref BLE_GATT_WRITE_OPS. */
|
||||
uint16_t handle; /**< Handle to the attribute to be written. */
|
||||
uint16_t offset; /**< Offset in bytes. @note For WRITE_CMD and WRITE_REQ, offset must be 0. */
|
||||
uint16_t len; /**< Length of data in bytes. */
|
||||
uint8_t* p_value; /**< Pointer to the value data. */
|
||||
uint8_t flags; /**< Flags, see @ref BLE_GATT_EXEC_WRITE_FLAGS. */
|
||||
} ble_gattc_write_params_t;
|
||||
|
||||
|
||||
/**
|
||||
* @brief GATT Client Event IDs.
|
||||
*/
|
||||
enum BLE_GATTC_EVTS
|
||||
{
|
||||
BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP = BLE_GATTC_EVT_BASE, /**< Primary Service Discovery Response event. */
|
||||
BLE_GATTC_EVT_REL_DISC_RSP, /**< Relationship Discovery Response event. */
|
||||
BLE_GATTC_EVT_CHAR_DISC_RSP, /**< Characteristic Discovery Response event. */
|
||||
BLE_GATTC_EVT_DESC_DISC_RSP, /**< Descriptor Discovery Response event. */
|
||||
BLE_GATTC_EVT_CHAR_VAL_BY_UUID_READ_RSP, /**< Read By UUID Response event. */
|
||||
BLE_GATTC_EVT_READ_RSP, /**< Read Response event. */
|
||||
BLE_GATTC_EVT_CHAR_VALS_READ_RSP, /**< Read multiple Response event. */
|
||||
BLE_GATTC_EVT_WRITE_RSP, /**< Write Response event. */
|
||||
BLE_GATTC_EVT_HVX, /**< Handle Value Notification or Indication event. */
|
||||
BLE_GATTC_EVT_TIMEOUT /**< Timeout event. */
|
||||
};
|
||||
|
||||
/**@brief Event structure for BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP. */
|
||||
typedef struct
|
||||
{
|
||||
uint16_t count; /**< Service count. */
|
||||
ble_gattc_service_t services[1]; /**< Service data, variable length. */
|
||||
} ble_gattc_evt_prim_srvc_disc_rsp_t;
|
||||
|
||||
/**@brief Event structure for BLE_GATTC_EVT_REL_DISC_RSP. */
|
||||
typedef struct
|
||||
{
|
||||
uint16_t count; /**< Include count. */
|
||||
ble_gattc_include_t includes[1]; /**< Include data, variable length. */
|
||||
} ble_gattc_evt_rel_disc_rsp_t;
|
||||
|
||||
/**@brief Event structure for BLE_GATTC_EVT_CHAR_DISC_RSP. */
|
||||
typedef struct
|
||||
{
|
||||
uint16_t count; /**< Characteristic count. */
|
||||
ble_gattc_char_t chars[1]; /**< Characteristic data, variable length. */
|
||||
} ble_gattc_evt_char_disc_rsp_t;
|
||||
|
||||
/**@brief Event structure for BLE_GATTC_EVT_DESC_DISC_RSP. */
|
||||
typedef struct
|
||||
{
|
||||
uint16_t count; /**< Descriptor count. */
|
||||
ble_gattc_desc_t descs[1]; /**< Descriptor data, variable length. */
|
||||
} ble_gattc_evt_desc_disc_rsp_t;
|
||||
|
||||
/**@brief GATT read by UUID handle value pair. */
|
||||
typedef struct
|
||||
{
|
||||
uint16_t handle; /**< Attribute Handle. */
|
||||
uint8_t *p_value; /**< Pointer to value, variable length (length available as value_len in ble_gattc_evt_read_by_uuid_rsp_t).
|
||||
Please note that this pointer is absolute to the memory provided by the user when retrieving the event,
|
||||
so it will effectively point to a location inside the handle_value array. */
|
||||
} ble_gattc_handle_value_t;
|
||||
|
||||
/**@brief Event structure for BLE_GATTC_EVT_CHAR_VAL_BY_UUID_READ_RSP. */
|
||||
typedef struct
|
||||
{
|
||||
uint16_t count; /**< Handle-Value Pair Count. */
|
||||
uint16_t value_len; /**< Length of the value in Handle-Value(s) list. */
|
||||
ble_gattc_handle_value_t handle_value[1]; /**< Handle-Value(s) list, variable length. */
|
||||
} ble_gattc_evt_char_val_by_uuid_read_rsp_t;
|
||||
|
||||
/**@brief Event structure for BLE_GATTC_EVT_READ_RSP. */
|
||||
typedef struct
|
||||
{
|
||||
uint16_t handle; /**< Attribute Handle. */
|
||||
uint16_t offset; /**< Offset of the attribute data. */
|
||||
uint16_t len; /**< Attribute data length. */
|
||||
uint8_t data[1]; /**< Attribute data, variable length. */
|
||||
} ble_gattc_evt_read_rsp_t;
|
||||
|
||||
/**@brief Event structure for BLE_GATTC_EVT_CHAR_VALS_READ_RSP. */
|
||||
typedef struct
|
||||
{
|
||||
uint16_t len; /**< Concatenated Attribute values length. */
|
||||
uint8_t values[1]; /**< Attribute values, variable length. */
|
||||
} ble_gattc_evt_char_vals_read_rsp_t;
|
||||
|
||||
/**@brief Event structure for BLE_GATTC_EVT_WRITE_RSP. */
|
||||
typedef struct
|
||||
{
|
||||
uint16_t handle; /**< Attribute Handle. */
|
||||
uint8_t write_op; /**< Type of write operation, see @ref BLE_GATT_WRITE_OPS. */
|
||||
uint16_t offset; /**< Data Offset. */
|
||||
uint16_t len; /**< Data length. */
|
||||
uint8_t data[1]; /**< Data, variable length. */
|
||||
} ble_gattc_evt_write_rsp_t;
|
||||
|
||||
/**@brief Event structure for BLE_GATTC_EVT_HVX. */
|
||||
typedef struct
|
||||
{
|
||||
uint16_t handle; /**< Handle to which the HVx operation applies. */
|
||||
uint8_t type; /**< Indication or Notification, see @ref BLE_GATT_HVX_TYPES. */
|
||||
uint16_t len; /**< Attribute data length. */
|
||||
uint8_t data[1]; /**< Attribute data, variable length. */
|
||||
} ble_gattc_evt_hvx_t;
|
||||
|
||||
/**@brief Event structure for BLE_GATTC_EVT_TIMEOUT. */
|
||||
typedef struct
|
||||
{
|
||||
uint8_t src; /**< Timeout source, see @ref BLE_GATT_TIMEOUT_SOURCES. */
|
||||
} ble_gattc_evt_timeout_t;
|
||||
|
||||
/**@brief GATTC event type. */
|
||||
typedef struct
|
||||
{
|
||||
uint16_t conn_handle; /**< Connection Handle on which event occured. */
|
||||
uint16_t gatt_status; /**< GATT status code for the operation, see @ref BLE_GATT_STATUS_CODES. */
|
||||
uint16_t error_handle; /**< In case of error: The handle causing the error. In all other cases BLE_GATT_HANDLE_INVALID. */
|
||||
union
|
||||
{
|
||||
ble_gattc_evt_prim_srvc_disc_rsp_t prim_srvc_disc_rsp; /**< Primary Service Discovery Response Event Parameters. */
|
||||
ble_gattc_evt_rel_disc_rsp_t rel_disc_rsp; /**< Relationship Discovery Response Event Parameters. */
|
||||
ble_gattc_evt_char_disc_rsp_t char_disc_rsp; /**< Characteristic Discovery Response Event Parameters. */
|
||||
ble_gattc_evt_desc_disc_rsp_t desc_disc_rsp; /**< Descriptor Discovery Response Event Parameters. */
|
||||
ble_gattc_evt_char_val_by_uuid_read_rsp_t char_val_by_uuid_read_rsp; /**< Characteristic Value Read by UUID Response Event Parameters. */
|
||||
ble_gattc_evt_read_rsp_t read_rsp; /**< Read Response Event Parameters. */
|
||||
ble_gattc_evt_char_vals_read_rsp_t char_vals_read_rsp; /**< Characteristic Values Read Response Event Parameters. */
|
||||
ble_gattc_evt_write_rsp_t write_rsp; /**< Write Response Event Parameters. */
|
||||
ble_gattc_evt_hvx_t hvx; /**< Handle Value Notification/Indication Event Parameters. */
|
||||
ble_gattc_evt_timeout_t timeout; /**< Timeout Event Parameters. */
|
||||
} params; /**< Event Parameters. @note Only valid if @ref gatt_status == BLE_GATT_STATUS_SUCCESS. */
|
||||
} ble_gattc_evt_t;
|
||||
/** @} */
|
||||
|
||||
/** @addtogroup BLE_GATTC_FUNCTIONS Functions
|
||||
* @{ */
|
||||
|
||||
/**@brief Initiate or continue a GATT Primary Service Discovery procedure.
|
||||
*
|
||||
* @details This function initiates a Primary Service discovery, starting from the supplied handle.
|
||||
* If the last service has not been reached, this must be called again with an updated start handle value to continue the search.
|
||||
*
|
||||
* @note If any of the discovered services have 128-bit UUIDs which are not present in the table provided to ble_vs_uuids_assign, a UUID structure with
|
||||
* type BLE_UUID_TYPE_UNKNOWN will be received in the corresponding event.
|
||||
*
|
||||
* @param[in] conn_handle The connection handle identifying the connection to perform this procedure on.
|
||||
* @param[in] start_handle Handle to start searching from.
|
||||
* @param[in] p_srvc_uuid Pointer to the service UUID to be found. If it is NULL, all primary services will be returned.
|
||||
*
|
||||
* @return @ref NRF_SUCCESS Successfully started or resumed the Primary Service Discovery procedure.
|
||||
* @return @ref BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle.
|
||||
* @return @ref NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied.
|
||||
* @return @ref NRF_ERROR_BUSY Client procedure already in progress.
|
||||
*/
|
||||
SVCALL(SD_BLE_GATTC_PRIMARY_SERVICES_DISCOVER, uint32_t, sd_ble_gattc_primary_services_discover(uint16_t conn_handle, uint16_t start_handle, ble_uuid_t const * const p_srvc_uuid));
|
||||
|
||||
|
||||
/**@brief Initiate or continue a GATT Relationship Discovery procedure.
|
||||
*
|
||||
* @details This function initiates the Find Included Services sub-procedure. If the last included service has not been reached,
|
||||
* this must be called again with an updated handle range to continue the search.
|
||||
*
|
||||
* @param[in] conn_handle The connection handle identifying the connection to perform this procedure on.
|
||||
* @param[in] p_handle_range A pointer to the range of handles of the Service to perform this procedure on.
|
||||
*
|
||||
* @return @ref NRF_SUCCESS Successfully started or resumed the Relationship Discovery procedure.
|
||||
* @return @ref BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle.
|
||||
* @return @ref NRF_ERROR_INVALID_ADDR Invalid pointer supplied.
|
||||
* @return @ref NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied.
|
||||
* @return @ref NRF_ERROR_BUSY Client procedure already in progress.
|
||||
*/
|
||||
SVCALL(SD_BLE_GATTC_RELATIONSHIPS_DISCOVER, uint32_t, sd_ble_gattc_relationships_discover(uint16_t conn_handle, ble_gattc_handle_range_t const * const p_handle_range));
|
||||
|
||||
|
||||
/**@brief Initiate or continue a GATT Characteristic Discovery procedure.
|
||||
*
|
||||
* @details This function initiates a Characteristic discovery procedure. If the last Characteristic has not been reached,
|
||||
* this must be called again with an updated handle range to continue the discovery.
|
||||
*
|
||||
* @note If any of the discovered characteristics have 128-bit UUIDs which are not present in the table provided to ble_vs_uuids_assign, a UUID structure with
|
||||
* type BLE_UUID_TYPE_UNKNOWN will be received in the corresponding event.
|
||||
*
|
||||
* @param[in] conn_handle The connection handle identifying the connection to perform this procedure on.
|
||||
* @param[in] p_handle_range A pointer to the range of handles of the Service to perform this procedure on.
|
||||
*
|
||||
* @return @ref NRF_SUCCESS Successfully started or resumed the Characteristic Discovery procedure.
|
||||
* @return @ref BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle.
|
||||
* @return @ref NRF_ERROR_INVALID_ADDR Invalid pointer supplied.
|
||||
* @return @ref NRF_ERROR_BUSY Client procedure already in progress.
|
||||
*/
|
||||
SVCALL(SD_BLE_GATTC_CHARACTERISTICS_DISCOVER, uint32_t, sd_ble_gattc_characteristics_discover(uint16_t conn_handle, ble_gattc_handle_range_t const * const p_handle_range));
|
||||
|
||||
|
||||
/**@brief Initiate or continue a GATT Characteristic Descriptor Discovery procedure.
|
||||
*
|
||||
* @details This function initiates the Characteristic Descriptor discovery procedure. If the last Descriptor has not been reached,
|
||||
* this must be called again with an updated handle range to continue the discovery.
|
||||
*
|
||||
* @param[in] conn_handle The connection handle identifying the connection to perform this procedure on.
|
||||
* @param[in] p_handle_range A pointer to the range of handles of the Characteristic to perform this procedure on.
|
||||
*
|
||||
* @return @ref NRF_SUCCESS Successfully started or resumed the Descriptor Discovery procedure.
|
||||
* @return @ref BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle.
|
||||
* @return @ref NRF_ERROR_INVALID_ADDR Invalid pointer supplied.
|
||||
* @return @ref NRF_ERROR_BUSY Client procedure already in progress.
|
||||
*/
|
||||
SVCALL(SD_BLE_GATTC_DESCRIPTORS_DISCOVER, uint32_t, sd_ble_gattc_descriptors_discover(uint16_t conn_handle, ble_gattc_handle_range_t const * const p_handle_range));
|
||||
|
||||
|
||||
/**@brief Initiate or continue a GATT Read using Characteristic UUID procedure.
|
||||
*
|
||||
* @details This function initiates the Read using Characteristic UUID procedure. If the last Characteristic has not been reached,
|
||||
* this must be called again with an updated handle range to continue the discovery.
|
||||
*
|
||||
* @param[in] conn_handle The connection handle identifying the connection to perform this procedure on.
|
||||
* @param[in] p_uuid Pointer to a Characteristic value UUID to read.
|
||||
* @param[in] p_handle_range A pointer to the range of handles to perform this procedure on.
|
||||
*
|
||||
* @return @ref NRF_SUCCESS Successfully started or resumed the Read using Characteristic UUID procedure.
|
||||
* @return @ref BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle.
|
||||
* @return @ref NRF_ERROR_INVALID_ADDR Invalid pointer supplied.
|
||||
* @return @ref NRF_ERROR_BUSY Client procedure already in progress.
|
||||
*/
|
||||
SVCALL(SD_BLE_GATTC_CHAR_VALUE_BY_UUID_READ, uint32_t, sd_ble_gattc_char_value_by_uuid_read(uint16_t conn_handle, ble_uuid_t const * const p_uuid, ble_gattc_handle_range_t const * const p_handle_range));
|
||||
|
||||
|
||||
/**@brief Initiate or continue a GATT Read (Long) Characteristic or Descriptor procedure.
|
||||
*
|
||||
* @details This function initiates a GATT Read (Long) Characteristic or Descriptor procedure. If the Characteristic or Descriptor
|
||||
* to be read is longer than GATT_MTU - 1, this function must be called multiple times with appropriate offset to read the
|
||||
* complete value.
|
||||
*
|
||||
* @param[in] conn_handle The connection handle identifying the connection to perform this procedure on.
|
||||
* @param[in] handle The handle of the attribute to be read.
|
||||
* @param[in] offset Offset into the attribute value to be read.
|
||||
*
|
||||
* @return @ref NRF_SUCCESS Successfully started or resumed the Read (Long) procedure.
|
||||
* @return @ref BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle.
|
||||
* @return @ref NRF_ERROR_INVALID_ADDR Invalid pointer supplied.
|
||||
* @return @ref NRF_ERROR_BUSY Client procedure already in progress.
|
||||
*/
|
||||
SVCALL(SD_BLE_GATTC_READ, uint32_t, sd_ble_gattc_read(uint16_t conn_handle, uint16_t handle, uint16_t offset));
|
||||
|
||||
|
||||
/**@brief Initiate a GATT Read Multiple Characteristic Values procedure.
|
||||
*
|
||||
* @details This function initiates a GATT Read Multiple Characteristic Values procedure.
|
||||
*
|
||||
* @param[in] conn_handle The connection handle identifying the connection to perform this procedure on.
|
||||
* @param[in] p_handles A pointer to the handle(s) of the attribute(s) to be read.
|
||||
* @param[in] handle_count The number of handles in p_handles.
|
||||
*
|
||||
* @return @ref NRF_SUCCESS Successfully started the Read Multiple Characteristic Values procedure.
|
||||
* @return @ref BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle.
|
||||
* @return @ref NRF_ERROR_INVALID_ADDR Invalid pointer supplied.
|
||||
* @return @ref NRF_ERROR_BUSY Client procedure already in progress.
|
||||
*/
|
||||
SVCALL(SD_BLE_GATTC_CHAR_VALUES_READ, uint32_t, sd_ble_gattc_char_values_read(uint16_t conn_handle, uint16_t const * const p_handles, uint16_t handle_count));
|
||||
|
||||
|
||||
/**@brief Perform a Write (Characteristic Value or Descriptor, with or without response, signed or not, long or reliable) procedure.
|
||||
*
|
||||
* @details This function can perform all write procedures described in GATT.
|
||||
*
|
||||
* @note It is important to note that a write without response will <b>consume an application buffer</b>, and will therefore
|
||||
* generate a @ref BLE_EVT_TX_COMPLETE event when the packet has been transmitted. A write on the other hand will use the
|
||||
* standard client internal buffer and thus will only generate a @ref BLE_GATTC_EVT_WRITE_RSP event as soon as the write response
|
||||
* has been received from the peer. Please see the documentation of @ref sd_ble_tx_buffer_count_get for more details.
|
||||
*
|
||||
* @param[in] conn_handle The connection handle identifying the connection to perform this procedure on.
|
||||
* @param[in] p_write_params A pointer to a write parameters structure.
|
||||
*
|
||||
* @return @ref NRF_SUCCESS Successfully started the Write procedure.
|
||||
* @return @ref BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle.
|
||||
* @return @ref NRF_ERROR_INVALID_ADDR Invalid pointer supplied.
|
||||
* @return @ref NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied.
|
||||
* @return @ref NRF_ERROR_DATA_SIZE Invalid data size(s) supplied.
|
||||
* @return @ref NRF_ERROR_BUSY Procedure already in progress.
|
||||
* @return @ref BLE_ERROR_NO_TX_BUFFERS There are no available buffers left.
|
||||
*/
|
||||
SVCALL(SD_BLE_GATTC_WRITE, uint32_t, sd_ble_gattc_write(uint16_t conn_handle, ble_gattc_write_params_t const * const p_write_params));
|
||||
|
||||
|
||||
/**@brief Send a Handle Value Confirmation to the GATT Server.
|
||||
*
|
||||
* @param[in] conn_handle The connection handle identifying the connection to perform this procedure on.
|
||||
* @param[in] handle The handle of the attribute in the indication.
|
||||
*
|
||||
* @return @ref NRF_SUCCESS Successfully queued the Handle Value Confirmation for transmission.
|
||||
* @return @ref BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle.
|
||||
* @return @ref NRF_ERROR_INVALID_STATE No Indication pending to be confirmed.
|
||||
* @return @ref BLE_ERROR_INVALID_ATTR_HANDLE Invalid attribute handle.
|
||||
* @return @ref BLE_ERROR_NO_TX_BUFFERS There are no available buffers left.
|
||||
*/
|
||||
SVCALL(SD_BLE_GATTC_HV_CONFIRM, uint32_t, sd_ble_gattc_hv_confirm(uint16_t conn_handle, uint16_t handle));
|
||||
|
||||
/** @} */
|
||||
|
||||
#endif /* BLE_GATTC_H__ */
|
||||
|
||||
/**
|
||||
@}
|
||||
@}
|
||||
*/
|
|
@ -0,0 +1,566 @@
|
|||
/* Copyright (c) 2011 Nordic Semiconductor. All Rights Reserved.
|
||||
*
|
||||
* The information contained herein is confidential property of Nordic Semiconductor. The use,
|
||||
* copying, transfer or disclosure of such information is prohibited except by express written
|
||||
* agreement with Nordic Semiconductor.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
@addtogroup BLE_GATTS Generic Attribute Profile (GATT) Server
|
||||
@{
|
||||
@brief Definitions and prototypes for the GATTS interface.
|
||||
*/
|
||||
|
||||
#ifndef BLE_GATTS_H__
|
||||
#define BLE_GATTS_H__
|
||||
|
||||
#include "ble_types.h"
|
||||
#include "ble_ranges.h"
|
||||
#include "ble_l2cap.h"
|
||||
#include "ble_gap.h"
|
||||
#include "ble_gatt.h"
|
||||
#include "nrf_svc.h"
|
||||
|
||||
/** @addtogroup BLE_GATTS_ENUMERATIONS Enumerations
|
||||
* @{ */
|
||||
|
||||
/**
|
||||
* @brief GATTS API SVC numbers.
|
||||
*/
|
||||
enum BLE_GATTS_SVCS
|
||||
{
|
||||
SD_BLE_GATTS_SERVICE_ADD = BLE_GATTS_SVC_BASE, /**< Add a service. */
|
||||
SD_BLE_GATTS_INCLUDE_ADD, /**< Add an included service. */
|
||||
SD_BLE_GATTS_CHARACTERISTIC_ADD, /**< Add a characteristic. */
|
||||
SD_BLE_GATTS_DESCRIPTOR_ADD, /**< Add a generic attribute. */
|
||||
SD_BLE_GATTS_VALUE_SET, /**< Set an attribute value. */
|
||||
SD_BLE_GATTS_VALUE_GET, /**< Get an attribute value. */
|
||||
SD_BLE_GATTS_HVX, /**< Handle Value Notification or Indication. */
|
||||
SD_BLE_GATTS_SERVICE_CHANGED, /**< Perform a Service Changed Indication to one or more peers. */
|
||||
SD_BLE_GATTS_RW_AUTHORIZE_REPLY, /**< Reply to an authorization request for a read or write operation on one or more attributes. */
|
||||
SD_BLE_GATTS_SYS_ATTR_SET, /**< Set the persistent system attributes for a connection. */
|
||||
SD_BLE_GATTS_SYS_ATTR_GET, /**< Get updated persistent system attributes after terminating a connection. */
|
||||
};
|
||||
|
||||
/** @} */
|
||||
|
||||
/** @addtogroup BLE_GATTS_DEFINES Defines
|
||||
* @{ */
|
||||
|
||||
/** @brief Only the default MTU size of 23 is currently supported. */
|
||||
#define GATT_RX_MTU 23
|
||||
|
||||
/** @defgroup BLE_ERRORS_GATTS SVC return values specific to GATTS
|
||||
* @{ */
|
||||
#define BLE_ERROR_GATTS_INVALID_ATTR_TYPE (NRF_GATTS_ERR_BASE + 0x000) /**< Invalid attribute type. */
|
||||
#define BLE_ERROR_GATTS_SYS_ATTR_MISSING (NRF_GATTS_ERR_BASE + 0x001) /**< System Attributes missing. */
|
||||
/** @} */
|
||||
|
||||
/** @defgroup BLE_GATTS_ATTR_LENS_MAX Maximum attribute lengths
|
||||
* @{ */
|
||||
#define BLE_GATTS_FIX_ATTR_LEN_MAX (510) /**< Maximum length for fixed length Attribute Values. */
|
||||
#define BLE_GATTS_VAR_ATTR_LEN_MAX (512) /**< Maximum length for variable length Attribute Values. */
|
||||
/** @} */
|
||||
|
||||
/** @defgroup BLE_GATTS_SRVC_TYPES GATT Server Service Types
|
||||
* @{ */
|
||||
#define BLE_GATTS_SRVC_TYPE_INVALID 0x00 /**< Invalid Service Type. */
|
||||
#define BLE_GATTS_SRVC_TYPE_PRIMARY 0x01 /**< Primary Service. */
|
||||
#define BLE_GATTS_SRVC_TYPE_SECONDARY 0x02 /**< Secondary Type. */
|
||||
/** @} */
|
||||
|
||||
|
||||
/** @defgroup BLE_GATTS_ATTR_TYPES GATT Server Attribute Types
|
||||
* @{ */
|
||||
#define BLE_GATTS_ATTR_TYPE_INVALID 0x00 /**< Invalid Attribute Type. */
|
||||
#define BLE_GATTS_ATTR_TYPE_PRIM_SRVC_DECL 0x01 /**< Primary Service Declaration. */
|
||||
#define BLE_GATTS_ATTR_TYPE_SEC_SRVC_DECL 0x02 /**< Secondary Service Declaration. */
|
||||
#define BLE_GATTS_ATTR_TYPE_INC_DECL 0x03 /**< Include Declaration. */
|
||||
#define BLE_GATTS_ATTR_TYPE_CHAR_DECL 0x04 /**< Characteristic Declaration. */
|
||||
#define BLE_GATTS_ATTR_TYPE_CHAR_VAL 0x05 /**< Characteristic Value. */
|
||||
#define BLE_GATTS_ATTR_TYPE_DESC 0x06 /**< Descriptor. */
|
||||
#define BLE_GATTS_ATTR_TYPE_OTHER 0x07 /**< Other, non-GATT specific type. */
|
||||
/** @} */
|
||||
|
||||
|
||||
/** @defgroup BLE_GATTS_OPS GATT Server Operations
|
||||
* @{ */
|
||||
#define BLE_GATTS_OP_INVALID 0x00 /**< Invalid Operation. */
|
||||
#define BLE_GATTS_OP_WRITE_REQ 0x01 /**< Write Request. */
|
||||
#define BLE_GATTS_OP_WRITE_CMD 0x02 /**< Write Command. */
|
||||
#define BLE_GATTS_OP_SIGN_WRITE_CMD 0x03 /**< Signed Write Command. */
|
||||
#define BLE_GATTS_OP_PREP_WRITE_REQ 0x04 /**< Prepare Write Request. */
|
||||
#define BLE_GATTS_OP_EXEC_WRITE_REQ_CANCEL 0x05 /**< Execute Write Request: Cancel all prepared writes. */
|
||||
#define BLE_GATTS_OP_EXEC_WRITE_REQ_NOW 0x06 /**< Execute Write Request: Immediately execute all prepared writes. */
|
||||
/** @} */
|
||||
|
||||
/** @defgroup BLE_GATTS_VLOCS GATT Value Locations
|
||||
* @{ */
|
||||
#define BLE_GATTS_VLOC_INVALID 0x00 /**< Invalid Location. */
|
||||
#define BLE_GATTS_VLOC_STACK 0x01 /**< Attribute Value is located in stack memory, no user memory is required. */
|
||||
#define BLE_GATTS_VLOC_USER 0x02 /**< Attribute Value is located in user memory. This requires the user to maintain a valid buffer through the lifetime of the attribute, since the stack
|
||||
will read and write directly to the memory using the pointer provided in the APIs. There are no alignment requirements for the buffer. */
|
||||
/** @} */
|
||||
|
||||
/** @defgroup BLE_GATTS_AUTHORIZE_TYPES GATT Server Authorization Types
|
||||
* @{ */
|
||||
#define BLE_GATTS_AUTHORIZE_TYPE_INVALID 0x00 /**< Invalid Type. */
|
||||
#define BLE_GATTS_AUTHORIZE_TYPE_READ 0x01 /**< Authorize a Read Operation. */
|
||||
#define BLE_GATTS_AUTHORIZE_TYPE_WRITE 0x02 /**< Authorize a Write Request Operation. */
|
||||
/** @} */
|
||||
|
||||
|
||||
/** @} */
|
||||
|
||||
/** @addtogroup BLE_GATTS_STRUCTURES Structures
|
||||
* @{ */
|
||||
|
||||
/**
|
||||
* @brief BLE GATTS init options
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
uint8_t service_changed:1; /**< Include the Service Changed characteristic in the local attributes. */
|
||||
} ble_gatts_enable_params_t;
|
||||
|
||||
/**@brief Attribute metadata. */
|
||||
typedef struct
|
||||
{
|
||||
ble_gap_conn_sec_mode_t read_perm; /**< Read permissions. */
|
||||
ble_gap_conn_sec_mode_t write_perm; /**< Write permissions. */
|
||||
uint8_t vlen :1; /**< Variable length attribute. */
|
||||
uint8_t vloc :2; /**< Value location, see @ref BLE_GATTS_VLOCS.*/
|
||||
uint8_t rd_auth :1; /**< Read Authorization and value will be requested from the application on every read operation. */
|
||||
uint8_t wr_auth :1; /**< Write Authorization will be requested from the application on every Write Request operation (but not Write Command). */
|
||||
} ble_gatts_attr_md_t;
|
||||
|
||||
|
||||
/**@brief GATT Attribute. */
|
||||
typedef struct
|
||||
{
|
||||
ble_uuid_t* p_uuid; /**< Pointer to the attribute UUID. */
|
||||
ble_gatts_attr_md_t* p_attr_md; /**< Pointer to the attribute metadata structure. */
|
||||
uint16_t init_len; /**< Initial attribute value length in bytes. */
|
||||
uint16_t init_offs; /**< Initial attribute value offset in bytes. If different from zero, the first init_offs bytes of the attribute value will be left uninitialized. */
|
||||
uint16_t max_len; /**< Maximum attribute value length in bytes, see @ref BLE_GATTS_ATTR_LENS_MAX for maximum values. */
|
||||
uint8_t* p_value; /**< Pointer to the attribute data. Please note that if the @ref BLE_GATTS_VLOC_USER value location is selected in the attribute metadata, this will have to point to a buffer
|
||||
that remains valid through the lifetime of the attribute. This excludes usage of automatic variables that may go out of scope or any other temporary location.
|
||||
The stack may access that memory directly without the application's knowledge. */
|
||||
} ble_gatts_attr_t;
|
||||
|
||||
|
||||
/**@brief GATT Attribute Context. */
|
||||
typedef struct
|
||||
{
|
||||
ble_uuid_t srvc_uuid; /**< Service UUID. */
|
||||
ble_uuid_t char_uuid; /**< Characteristic UUID if applicable (BLE_UUID_TYPE_UNKNOWN if N/A). */
|
||||
ble_uuid_t desc_uuid; /**< Descriptor UUID if applicable (BLE_UUID_TYPE_UNKNOWN if N/A). */
|
||||
uint16_t srvc_handle; /**< Service Handle. */
|
||||
uint16_t value_handle; /**< Characteristic Handle if applicable (BLE_GATT_HANDLE_INVALID if N/A). */
|
||||
uint8_t type; /**< Attribute Type, see @ref BLE_GATTS_ATTR_TYPES. */
|
||||
} ble_gatts_attr_context_t;
|
||||
|
||||
|
||||
/**@brief GATT Characteristic Presentation Format. */
|
||||
typedef struct
|
||||
{
|
||||
uint8_t format; /**< Format of the value, see @ref BLE_GATT_CPF_FORMATS. */
|
||||
int8_t exponent; /**< Exponent for integer data types. */
|
||||
uint16_t unit; /**< UUID from Bluetooth Assigned Numbers. */
|
||||
uint8_t name_space; /**< Namespace from Bluetooth Assigned Numbers, see @ref BLE_GATT_CPF_NAMESPACES. */
|
||||
uint16_t desc; /**< Namespace description from Bluetooth Assigned Numbers, see @ref BLE_GATT_CPF_NAMESPACES. */
|
||||
} ble_gatts_char_pf_t;
|
||||
|
||||
|
||||
/**@brief GATT Characteristic metadata. */
|
||||
typedef struct
|
||||
{
|
||||
ble_gatt_char_props_t char_props; /**< Characteristic Properties. */
|
||||
ble_gatt_char_ext_props_t char_ext_props; /**< Characteristic Extended Properties. */
|
||||
uint8_t* p_char_user_desc; /**< Pointer to a UTF-8, NULL if the descriptor is not required. */
|
||||
uint16_t char_user_desc_max_size; /**< The maximum size in bytes of the user description descriptor. */
|
||||
uint16_t char_user_desc_size; /**< The size of the user description, must be smaller or equal to char_user_desc_max_size. */
|
||||
ble_gatts_char_pf_t* p_char_pf; /**< Pointer to a presentation format structure or NULL if the descriptor is not required. */
|
||||
ble_gatts_attr_md_t* p_user_desc_md; /**< Attribute metadata for the User Description descriptor, or NULL for default values. */
|
||||
ble_gatts_attr_md_t* p_cccd_md; /**< Attribute metadata for the Client Characteristic Configuration Descriptor, or NULL for default values. */
|
||||
ble_gatts_attr_md_t* p_sccd_md; /**< Attribute metadata for the Server Characteristic Configuration Descriptor, or NULL for default values. */
|
||||
} ble_gatts_char_md_t;
|
||||
|
||||
|
||||
/**@brief GATT Characteristic Definition Handles. */
|
||||
typedef struct
|
||||
{
|
||||
uint16_t value_handle; /**< Handle to the characteristic value. */
|
||||
uint16_t user_desc_handle; /**< Handle to the User Description descriptor, or BLE_GATT_HANDLE_INVALID if not present. */
|
||||
uint16_t cccd_handle; /**< Handle to the Client Characteristic Configuration Descriptor, or BLE_GATT_HANDLE_INVALID if not present. */
|
||||
uint16_t sccd_handle; /**< Handle to the Server Characteristic Configuration Descriptor, or BLE_GATT_HANDLE_INVALID if not present. */
|
||||
} ble_gatts_char_handles_t;
|
||||
|
||||
|
||||
/**@brief GATT HVx parameters. */
|
||||
typedef struct
|
||||
{
|
||||
uint16_t handle; /**< Characteristic Value Handle. */
|
||||
uint8_t type; /**< Indication or Notification, see @ref BLE_GATT_HVX_TYPES. */
|
||||
uint16_t offset; /**< Offset within the attribute value. */
|
||||
uint16_t* p_len; /**< Length in bytes to be written, length in bytes written after successful return. */
|
||||
uint8_t* p_data; /**< Actual data content, use NULL to use the current attribute value. */
|
||||
} ble_gatts_hvx_params_t;
|
||||
|
||||
/**@brief GATT Read Authorization parameters. */
|
||||
typedef struct
|
||||
{
|
||||
uint16_t gatt_status; /**< GATT status code for the operation, see @ref BLE_GATT_STATUS_CODES. */
|
||||
uint8_t update : 1; /**< If set, data supplied in p_data will be used in the ATT response. */
|
||||
uint16_t offset; /**< Offset of the attribute value being updated. */
|
||||
uint16_t len; /**< Length in bytes of the value in p_data pointer, see @ref BLE_GATTS_ATTR_LENS_MAX. */
|
||||
uint8_t* p_data; /**< Pointer to new value used to update the attribute value. */
|
||||
} ble_gatts_read_authorize_params_t;
|
||||
|
||||
/**@brief GATT Write Authorisation parameters. */
|
||||
typedef struct
|
||||
{
|
||||
uint16_t gatt_status; /**< GATT status code for the operation, see @ref BLE_GATT_STATUS_CODES. */
|
||||
} ble_gatts_write_authorize_params_t;
|
||||
|
||||
/**@brief GATT Read or Write Authorize Reply parameters. */
|
||||
typedef struct
|
||||
{
|
||||
uint8_t type; /**< Type of authorize operation, see @ref BLE_GATTS_AUTHORIZE_TYPES. */
|
||||
union {
|
||||
ble_gatts_read_authorize_params_t read; /**< Read authorization parameters. */
|
||||
ble_gatts_write_authorize_params_t write; /**< Write authorization parameters. */
|
||||
} params;
|
||||
} ble_gatts_rw_authorize_reply_params_t;
|
||||
|
||||
|
||||
/**
|
||||
* @brief GATT Server Event IDs.
|
||||
*/
|
||||
enum BLE_GATTS_EVTS
|
||||
{
|
||||
BLE_GATTS_EVT_WRITE = BLE_GATTS_EVT_BASE, /**< Write operation performed. */
|
||||
BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST, /**< Read/Write Authorization request. */
|
||||
BLE_GATTS_EVT_SYS_ATTR_MISSING, /**< A persistent system attribute access is pending, awaiting a sd_ble_gatts_sys_attr_set(). */
|
||||
BLE_GATTS_EVT_HVC, /**< Handle Value Confirmation. */
|
||||
BLE_GATTS_EVT_SC_CONFIRM, /**< Service Changed Confirmation. */
|
||||
BLE_GATTS_EVT_TIMEOUT /**< Timeout. */
|
||||
};
|
||||
|
||||
|
||||
/**@brief Event structure for BLE_GATTS_EVT_WRITE. */
|
||||
typedef struct
|
||||
{
|
||||
uint16_t handle; /**< Attribute Handle. */
|
||||
uint8_t op; /**< Type of write operation, see @ref BLE_GATTS_OPS. */
|
||||
ble_gatts_attr_context_t context; /**< Attribute Context. */
|
||||
uint16_t offset; /**< Offset for the write operation. */
|
||||
uint16_t len; /**< Length of the incoming data. */
|
||||
uint8_t data[1]; /**< Incoming data, variable length. */
|
||||
} ble_gatts_evt_write_t;
|
||||
|
||||
/**@brief Event structure for authorize read request. */
|
||||
typedef struct
|
||||
{
|
||||
uint16_t handle; /**< Attribute Handle. */
|
||||
ble_gatts_attr_context_t context; /**< Attribute Context. */
|
||||
uint16_t offset; /**< Offset for the read operation. */
|
||||
} ble_gatts_evt_read_t;
|
||||
|
||||
/**@brief Event structure for BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST. */
|
||||
typedef struct
|
||||
{
|
||||
uint8_t type; /**< Type of authorize operation, see @ref BLE_GATTS_AUTHORIZE_TYPES. */
|
||||
union {
|
||||
ble_gatts_evt_read_t read; /**< Attribute Read Parameters. */
|
||||
ble_gatts_evt_write_t write; /**< Attribute Write Parameters. */
|
||||
} request;
|
||||
} ble_gatts_evt_rw_authorize_request_t;
|
||||
|
||||
/**@brief Event structure for BLE_GATTS_EVT_SYS_ATTR_MISSING. */
|
||||
typedef struct
|
||||
{
|
||||
uint8_t hint;
|
||||
} ble_gatts_evt_sys_attr_missing_t;
|
||||
|
||||
|
||||
/**@brief Event structure for BLE_GATTS_EVT_HVC. */
|
||||
typedef struct
|
||||
{
|
||||
uint16_t handle; /**< Attribute Handle. */
|
||||
} ble_gatts_evt_hvc_t;
|
||||
|
||||
/**@brief Event structure for BLE_GATTS_EVT_TIMEOUT. */
|
||||
typedef struct
|
||||
{
|
||||
uint8_t src; /**< Timeout source, see @ref BLE_GATT_TIMEOUT_SOURCES. */
|
||||
} ble_gatts_evt_timeout_t;
|
||||
|
||||
|
||||
/**@brief GATT Server event callback event structure. */
|
||||
typedef struct
|
||||
{
|
||||
uint16_t conn_handle; /**< Connection Handle on which event occurred. */
|
||||
union
|
||||
{
|
||||
ble_gatts_evt_write_t write; /**< Write Event Parameters. */
|
||||
ble_gatts_evt_rw_authorize_request_t authorize_request; /**< Read or Write Authorize Request Parameters. */
|
||||
ble_gatts_evt_sys_attr_missing_t sys_attr_missing; /**< System attributes missing. */
|
||||
ble_gatts_evt_hvc_t hvc; /**< Handle Value Confirmation Event Parameters. */
|
||||
ble_gatts_evt_timeout_t timeout; /**< Timeout Event. */
|
||||
} params;
|
||||
} ble_gatts_evt_t;
|
||||
|
||||
/** @} */
|
||||
|
||||
/** @addtogroup BLE_GATTS_FUNCTIONS Functions
|
||||
* @{ */
|
||||
|
||||
/**@brief Add a service declaration to the local server ATT table.
|
||||
*
|
||||
* @param[in] type Toggles between primary and secondary services, see @ref BLE_GATTS_SRVC_TYPES.
|
||||
* @param[in] p_uuid Pointer to service UUID.
|
||||
* @param[out] p_handle Pointer to a 16-bit word where the assigned handle will be stored.
|
||||
*
|
||||
* @note Secondary Services are only relevant in the context of the entity that references them, it is therefore forbidden to
|
||||
* add a secondary service declaration that is not referenced by another service later in the ATT table.
|
||||
*
|
||||
* @return @ref NRF_SUCCESS Successfully added a service declaration.
|
||||
* @return @ref NRF_ERROR_INVALID_ADDR Invalid pointer supplied.
|
||||
* @return @ref NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, Vendor Specific UUIDs need to be present in the table.
|
||||
* @return @ref NRF_ERROR_FORBIDDEN Forbidden value supplied, certain UUIDs are reserved for the stack.
|
||||
* @return @ref NRF_ERROR_NO_MEM Not enough memory to complete operation.
|
||||
*/
|
||||
SVCALL(SD_BLE_GATTS_SERVICE_ADD, uint32_t, sd_ble_gatts_service_add(uint8_t type, ble_uuid_t const*const p_uuid, uint16_t *const p_handle));
|
||||
|
||||
|
||||
/**@brief Add an include declaration to the local server ATT table.
|
||||
*
|
||||
* @note It is currently only possible to add an include declaration to the last added service (i.e. only sequential addition is supported at this time).
|
||||
*
|
||||
* @note The included service must already be present in the ATT table prior to this call.
|
||||
*
|
||||
* @param[in] service_handle Handle of the service where the included service is to be placed, if BLE_GATT_HANDLE_INVALID is used, it will be placed sequentially.
|
||||
* @param[in] inc_srvc_handle Handle of the included service.
|
||||
* @param[out] p_include_handle Pointer to a 16-bit word where the assigned handle will be stored.
|
||||
*
|
||||
* @return @ref NRF_SUCCESS Successfully added an include declaration.
|
||||
* @return @ref NRF_ERROR_INVALID_ADDR Invalid pointer supplied.
|
||||
* @return @ref NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, handle values need to match previously added services.
|
||||
* @return @ref NRF_ERROR_INVALID_STATE Invalid state to perform operation.
|
||||
* @return @ref NRF_ERROR_FORBIDDEN Forbidden value supplied, self inclusions are not allowed.
|
||||
* @return @ref NRF_ERROR_NO_MEM Not enough memory to complete operation.
|
||||
* @return @ref NRF_ERROR_NOT_FOUND Attribute not found.
|
||||
*/
|
||||
SVCALL(SD_BLE_GATTS_INCLUDE_ADD, uint32_t, sd_ble_gatts_include_add(uint16_t service_handle, uint16_t inc_srvc_handle, uint16_t *const p_include_handle));
|
||||
|
||||
|
||||
/**@brief Add a characteristic declaration, a characteristic value declaration and optional characteristic descriptor declarations to the local server ATT table.
|
||||
*
|
||||
* @note It is currently only possible to add a characteristic to the last added service (i.e. only sequential addition is supported at this time).
|
||||
*
|
||||
* @note Several restrictions apply to the parameters, such as matching permissions between the user description descriptor and the writeable auxiliaries bits,
|
||||
* readable (no security) and writeable (selectable) CCCDs and SCCDs and valid presentation format values.
|
||||
*
|
||||
* @note If no metadata is provided for the optional descriptors, their permissions will be derived from the characteristic permissions.
|
||||
*
|
||||
* @param[in] service_handle Handle of the service where the characteristic is to be placed, if BLE_GATT_HANDLE_INVALID is used, it will be placed sequentially.
|
||||
* @param[in] p_char_md Characteristic metadata.
|
||||
* @param[in] p_attr_char_value Pointer to the attribute structure corresponding to the characteristic value.
|
||||
* @param[out] p_handles Pointer to the structure where the assigned handles will be stored.
|
||||
*
|
||||
* @return @ref NRF_SUCCESS Successfully added a characteristic.
|
||||
* @return @ref NRF_ERROR_INVALID_ADDR Invalid pointer supplied.
|
||||
* @return @ref NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, service handle, Vendor Specific UUIDs, lengths, and permissions need to adhere to the constraints.
|
||||
* @return @ref NRF_ERROR_INVALID_STATE Invalid state to perform operation, a service context is required.
|
||||
* @return @ref NRF_ERROR_FORBIDDEN Forbidden value supplied, certain UUIDs are reserved for the stack.
|
||||
* @return @ref NRF_ERROR_NO_MEM Not enough memory to complete operation.
|
||||
* @return @ref NRF_ERROR_DATA_SIZE Invalid data size(s) supplied, attribute lengths are restricted by @ref BLE_GATTS_ATTR_LENS_MAX.
|
||||
*/
|
||||
SVCALL(SD_BLE_GATTS_CHARACTERISTIC_ADD, uint32_t, sd_ble_gatts_characteristic_add(uint16_t service_handle, ble_gatts_char_md_t const*const p_char_md, ble_gatts_attr_t const*const p_attr_char_value, ble_gatts_char_handles_t *const p_handles));
|
||||
|
||||
|
||||
/**@brief Add a descriptor to the local server ATT table.
|
||||
*
|
||||
* @note It is currently only possible to add a descriptor to the last added characteristic (i.e. only sequential addition is supported at this time).
|
||||
*
|
||||
* @param[in] char_handle Handle of the characteristic where the descriptor is to be placed, if BLE_GATT_HANDLE_INVALID is used, it will be placed sequentially.
|
||||
* @param[in] p_attr Pointer to the attribute structure.
|
||||
* @param[out] p_handle Pointer to a 16-bit word where the assigned handle will be stored.
|
||||
*
|
||||
* @return @ref NRF_SUCCESS Successfully added a descriptor.
|
||||
* @return @ref NRF_ERROR_INVALID_ADDR Invalid pointer supplied.
|
||||
* @return @ref NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, characteristic handle, Vendor Specific UUIDs, lengths, and permissions need to adhere to the constraints.
|
||||
* @return @ref NRF_ERROR_INVALID_STATE Invalid state to perform operation, a characteristic context is required.
|
||||
* @return @ref NRF_ERROR_FORBIDDEN Forbidden value supplied, certain UUIDs are reserved for the stack.
|
||||
* @return @ref NRF_ERROR_NO_MEM Not enough memory to complete operation.
|
||||
* @return @ref NRF_ERROR_DATA_SIZE Invalid data size(s) supplied, attribute lengths are restricted by @ref BLE_GATTS_ATTR_LENS_MAX.
|
||||
*/
|
||||
SVCALL(SD_BLE_GATTS_DESCRIPTOR_ADD, uint32_t, sd_ble_gatts_descriptor_add(uint16_t char_handle, ble_gatts_attr_t const * const p_attr, uint16_t* const p_handle));
|
||||
|
||||
/**@brief Set the value of a given attribute.
|
||||
*
|
||||
* @param[in] handle Attribute handle.
|
||||
* @param[in] offset Offset in bytes to write from.
|
||||
* @param[in,out] p_len Length in bytes to be written, length in bytes written after successful return.
|
||||
* @param[in] p_value Pointer to a buffer (at least len bytes long) containing the desired attribute value. If value is stored in user memory, only the attribute length is updated when p_value == NULL.
|
||||
*
|
||||
* @return @ref NRF_SUCCESS Successfully set the value of the attribute.
|
||||
* @return @ref NRF_ERROR_INVALID_ADDR Invalid pointer supplied.
|
||||
* @return @ref NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied.
|
||||
* @return @ref NRF_ERROR_NOT_FOUND Attribute not found.
|
||||
* @return @ref NRF_ERROR_FORBIDDEN Forbidden handle supplied, certain attributes are not modifiable by the application.
|
||||
* @return @ref NRF_ERROR_DATA_SIZE Invalid data size(s) supplied, attribute lengths are restricted by @ref BLE_GATTS_ATTR_LENS_MAX.
|
||||
*/
|
||||
SVCALL(SD_BLE_GATTS_VALUE_SET, uint32_t, sd_ble_gatts_value_set(uint16_t handle, uint16_t offset, uint16_t* const p_len, uint8_t const * const p_value));
|
||||
|
||||
/**@brief Get the value of a given attribute.
|
||||
*
|
||||
* @param[in] handle Attribute handle.
|
||||
* @param[in] offset Offset in bytes to read from.
|
||||
* @param[in,out] p_len Length in bytes to be read, total length of attribute value (in bytes, starting from offset) after successful return.
|
||||
* @param[in,out] p_data Pointer to a buffer (at least len bytes long) where to store the attribute value. Set to NULL to obtain the complete length of attribute value.
|
||||
*
|
||||
* @note If the attribute value is longer than the size of the supplied buffer,
|
||||
* p_len will return the total attribute value length (excluding offset),
|
||||
* and not the number of bytes actually returned in p_data.
|
||||
* The application may use this information to allocate a suitable buffer size.
|
||||
*
|
||||
* @return @ref NRF_SUCCESS Successfully retrieved the value of the attribute.
|
||||
* @return @ref NRF_ERROR_INVALID_ADDR Invalid pointer supplied.
|
||||
* @return @ref NRF_ERROR_NOT_FOUND Attribute not found.
|
||||
*/
|
||||
SVCALL(SD_BLE_GATTS_VALUE_GET, uint32_t, sd_ble_gatts_value_get(uint16_t handle, uint16_t offset, uint16_t *const p_len, uint8_t* const p_data));
|
||||
|
||||
/**@brief Notify or Indicate an attribute value.
|
||||
*
|
||||
* @details This function checks for the relevant Client Characteristic Configuration descriptor value to verify that the relevant operation
|
||||
* (notification or indication) has been enabled by the client. It is also able to update the attribute value before issuing the PDU, so that
|
||||
* the application can atomically perform a value update and a server initiated transaction with a single API call.
|
||||
* If the application chooses to indicate an attribute value, a @ref BLE_GATTS_EVT_HVC will be sent up as soon as the confirmation arrives from
|
||||
* the peer.
|
||||
*
|
||||
* @note The local attribute value may be updated even if an outgoing packet is not sent to the peer due to an error during execution.
|
||||
* When receiveing the error codes @ref NRF_ERROR_INVALID_STATE, @ref NRF_ERROR_BUSY, @ref BLE_ERROR_GATTS_SYS_ATTR_MISSING and
|
||||
* @ref BLE_ERROR_NO_TX_BUFFERS the ATT table has been updated.
|
||||
* The caller can check whether the value has been updated by looking at the contents of *(p_hvx_params->p_len).
|
||||
*
|
||||
* @note It is important to note that a notification will <b>consume an application buffer</b>, and will therefore
|
||||
* generate a @ref BLE_EVT_TX_COMPLETE event when the packet has been transmitted. An indication on the other hand will use the
|
||||
* standard server internal buffer and thus will only generate a @ref BLE_GATTS_EVT_HVC event as soon as the confirmation
|
||||
* has been received from the peer. Please see the documentation of @ref sd_ble_tx_buffer_count_get for more details.
|
||||
*
|
||||
* @param[in] conn_handle Connection handle.
|
||||
* @param[in] p_hvx_params Pointer to an HVx parameters structure. If the p_data member contains a non-NULL pointer the attribute value will be updated with
|
||||
* the contents pointed by it before sending the notification or indication.
|
||||
*
|
||||
* @return @ref NRF_SUCCESS Successfully queued a notification or indication for transmission, and optionally updated the attribute value.
|
||||
* @return @ref BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle.
|
||||
* @return @ref NRF_ERROR_INVALID_ADDR Invalid pointer supplied.
|
||||
* @return @ref NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied.
|
||||
* @return @ref BLE_ERROR_INVALID_ATTR_HANDLE Invalid attribute handle(s) supplied. Only attributes added directly by the application are available to notify and indicate.
|
||||
* @return @ref BLE_ERROR_GATTS_INVALID_ATTR_TYPE Invalid attribute type(s) supplied, only characteristic values may be notified and indicated.
|
||||
* @return @ref NRF_ERROR_NOT_FOUND Attribute not found.
|
||||
* @return @ref NRF_ERROR_DATA_SIZE Invalid data size(s) supplied.
|
||||
* @return @ref NRF_ERROR_INVALID_STATE Invalid state to perform operation, notifications or indications must be enabled in the CCCD.
|
||||
* @return @ref NRF_ERROR_BUSY Procedure already in progress.
|
||||
* @return @ref BLE_ERROR_GATTS_SYS_ATTR_MISSING System attributes missing, use @ref sd_ble_gatts_sys_attr_set to set them to a known value.
|
||||
* @return @ref BLE_ERROR_NO_TX_BUFFERS There are no available buffers to send the data, applies only to notifications.
|
||||
*/
|
||||
SVCALL(SD_BLE_GATTS_HVX, uint32_t, sd_ble_gatts_hvx(uint16_t conn_handle, ble_gatts_hvx_params_t const*const p_hvx_params));
|
||||
|
||||
/**@brief Indicate the Service Changed attribute value.
|
||||
*
|
||||
* @details This call will send a Handle Value Indication to one or more peers connected to inform them that the attribute
|
||||
* table layout has changed. As soon as the peer has confirmed the indication, a @ref BLE_GATTS_EVT_SC_CONFIRM event will
|
||||
* be issued.
|
||||
*
|
||||
* @note Some of the restrictions and limitations that apply to @ref sd_ble_gatts_hvx also apply here.
|
||||
*
|
||||
* @param[in] conn_handle Connection handle.
|
||||
* @param[in] start_handle Start of affected attribute handle range.
|
||||
* @param[in] end_handle End of affected attribute handle range.
|
||||
*
|
||||
* @return @ref NRF_SUCCESS Successfully queued the Service Changed indication for transmission.
|
||||
* @return @ref BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle.
|
||||
* @return @ref NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied.
|
||||
* @return @ref BLE_ERROR_INVALID_ATTR_HANDLE Invalid attribute handle(s) supplied, handles must be in the range populated by the application.
|
||||
* @return @ref NRF_ERROR_INVALID_STATE Invalid state to perform operation, notifications or indications must be enabled in the CCCD.
|
||||
* @return @ref NRF_ERROR_BUSY Procedure already in progress.
|
||||
* @return @ref BLE_ERROR_GATTS_SYS_ATTR_MISSING System attributes missing, use @ref sd_ble_gatts_sys_attr_set to set them to a known value.
|
||||
*/
|
||||
SVCALL(SD_BLE_GATTS_SERVICE_CHANGED, uint32_t, sd_ble_gatts_service_changed(uint16_t conn_handle, uint16_t start_handle, uint16_t end_handle));
|
||||
|
||||
/**@brief Respond to a Read/Write authorization request.
|
||||
*
|
||||
* @note This call should only be used as a response to a @ref BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST event issued to the application.
|
||||
*
|
||||
* @param[in] conn_handle Connection handle.
|
||||
* @param[in] p_rw_authorize_reply_params Pointer to a structure with the attribute provided by the application.
|
||||
*
|
||||
* @return @ref NRF_SUCCESS Successfully queued a response to the peer, and in the case of a write operation, ATT table updated.
|
||||
* @return @ref BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle.
|
||||
* @return @ref NRF_ERROR_INVALID_STATE No authorization request pending.
|
||||
* @return @ref NRF_ERROR_INVALID_PARAM Authorization op invalid,
|
||||
* or for Read Authorization reply: requested handles not replied with,
|
||||
* or for Write Authorization reply: handle supplied does not match requested handle.
|
||||
*/
|
||||
SVCALL(SD_BLE_GATTS_RW_AUTHORIZE_REPLY, uint32_t, sd_ble_gatts_rw_authorize_reply(uint16_t conn_handle, ble_gatts_rw_authorize_reply_params_t const*const p_rw_authorize_reply_params));
|
||||
|
||||
|
||||
/**@brief Update persistent system attribute information.
|
||||
*
|
||||
* @details Supply to the stack information about persistent system attributes.
|
||||
* This call is legal in the connected state only, and is usually
|
||||
* made immediately after a connection is established and the bond identified.
|
||||
* usually as a response to a BLE_GATTS_EVT_SYS_ATTR_MISSING.
|
||||
*
|
||||
* p_sysattrs may point directly to the application's stored copy of the struct.
|
||||
* If the pointer is NULL, the system attribute info is initialized, assuming that
|
||||
* the application does not have any previously saved data for this bond.
|
||||
*
|
||||
* @note The state of persistent system attributes is reset upon connection and then remembered for its duration.
|
||||
*
|
||||
* @note If this call returns with an error code different from @ref NRF_SUCCESS, the storage of persistent system attributes may have been completed only partially.
|
||||
* This means that the state of the attribute table is undefined, and the application should either provide a new set of attributes using this same call or
|
||||
* reset the SoftDevice to return to a known state.
|
||||
*
|
||||
* @param[in] conn_handle Connection handle.
|
||||
* @param[in] p_sys_attr_data Pointer to a saved copy of system attributes supplied to the stack, or NULL.
|
||||
* @param[in] len Size of data pointed by p_sys_attr_data, in octets.
|
||||
*
|
||||
* @return @ref NRF_SUCCESS Successfully set the system attribute information.
|
||||
* @return @ref BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle.
|
||||
* @return @ref NRF_ERROR_INVALID_DATA Invalid data supplied, the data should be exactly the same as retrieved with @ref sd_ble_gatts_sys_attr_get.
|
||||
* @return @ref NRF_ERROR_NO_MEM Not enough memory to complete operation.
|
||||
*/
|
||||
SVCALL(SD_BLE_GATTS_SYS_ATTR_SET, uint32_t, sd_ble_gatts_sys_attr_set(uint16_t conn_handle, uint8_t const*const p_sys_attr_data, uint16_t len));
|
||||
|
||||
|
||||
/**@brief Retrieve persistent system attribute information from the stack.
|
||||
*
|
||||
* @details This call is used to retrieve information about values to be stored perisistently by the application
|
||||
* after a connection has been terminated. When a new connection is made to the same bond, the values
|
||||
* should be restored using @ref sd_ble_gatts_sys_attr_set.
|
||||
* The data should be read before any new advertising is started, or any new connection established. The connection handle for
|
||||
* the previous now defunct connection will remain valid until a new one is created to allow this API call to refer to it.
|
||||
*
|
||||
* @param[in] conn_handle Connection handle of the recently terminated connection.
|
||||
* @param[in] p_sys_attr_data Pointer to a buffer where updated information about system attributes will be filled in. NULL can be provided to
|
||||
* obtain the length of the data
|
||||
* @param[in,out] p_len Size of application buffer if p_sys_attr_data is not NULL. Unconditially updated to actual length of system attribute data.
|
||||
*
|
||||
* @return @ref NRF_SUCCESS Successfully retrieved the system attribute information.
|
||||
* @return @ref BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle.
|
||||
* @return @ref NRF_ERROR_INVALID_ADDR Invalid pointer supplied.
|
||||
* @return @ref NRF_ERROR_DATA_SIZE The system attribute information did not fit into the provided buffer.
|
||||
*/
|
||||
SVCALL(SD_BLE_GATTS_SYS_ATTR_GET, uint32_t, sd_ble_gatts_sys_attr_get(uint16_t conn_handle, uint8_t * const p_sys_attr_data, uint16_t* const p_len));
|
||||
|
||||
/** @} */
|
||||
|
||||
#endif // BLE_GATTS_H__
|
||||
|
||||
/**
|
||||
@}
|
||||
*/
|
|
@ -0,0 +1,96 @@
|
|||
/*
|
||||
Copyright (c) 2012 Nordic Semiconductor. All Rights Reserved.
|
||||
|
||||
The information contained herein is confidential property of Nordic Semiconductor. The use,
|
||||
copying, transfer or disclosure of such information is prohibited except by express written
|
||||
agreement with Nordic Semiconductor.
|
||||
*/
|
||||
/**
|
||||
@addtogroup BLE_COMMON
|
||||
@{
|
||||
*/
|
||||
|
||||
|
||||
#ifndef BLE_HCI_H__
|
||||
#define BLE_HCI_H__
|
||||
|
||||
/** @defgroup BLE_HCI_STATUS_CODES Bluetooth status codes
|
||||
* @{ */
|
||||
|
||||
#define BLE_HCI_STATUS_CODE_SUCCESS 0x00
|
||||
#define BLE_HCI_STATUS_CODE_UNKNOWN_BTLE_COMMAND 0x01
|
||||
#define BLE_HCI_STATUS_CODE_UNKNOWN_CONNECTION_IDENTIFIER 0x02
|
||||
/*0x03 Hardware Failure
|
||||
0x04 Page Timeout
|
||||
*/
|
||||
#define BLE_HCI_AUTHENTICATION_FAILURE 0x05
|
||||
#define BLE_HCI_STATUS_CODE_PIN_OR_KEY_MISSING 0x06
|
||||
#define BLE_HCI_MEMORY_CAPACITY_EXCEEDED 0x07
|
||||
#define BLE_HCI_CONNECTION_TIMEOUT 0x08
|
||||
/*0x09 Connection Limit Exceeded
|
||||
0x0A Synchronous Connection Limit To A Device Exceeded
|
||||
0x0B ACL Connection Already Exists*/
|
||||
#define BLE_HCI_STATUS_CODE_COMMAND_DISALLOWED 0x0C
|
||||
/*0x0D Connection Rejected due to Limited Resources
|
||||
0x0E Connection Rejected Due To Security Reasons
|
||||
0x0F Connection Rejected due to Unacceptable BD_ADDR
|
||||
0x10 Connection Accept Timeout Exceeded
|
||||
0x11 Unsupported Feature or Parameter Value*/
|
||||
#define BLE_HCI_STATUS_CODE_INVALID_BTLE_COMMAND_PARAMETERS 0x12
|
||||
#define BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION 0x13
|
||||
#define BLE_HCI_REMOTE_DEV_TERMINATION_DUE_TO_LOW_RESOURCES 0x14
|
||||
#define BLE_HCI_REMOTE_DEV_TERMINATION_DUE_TO_POWER_OFF 0x15
|
||||
#define BLE_HCI_LOCAL_HOST_TERMINATED_CONNECTION 0x16
|
||||
/*
|
||||
0x17 Repeated Attempts
|
||||
0x18 Pairing Not Allowed
|
||||
0x19 Unknown LMP PDU
|
||||
*/
|
||||
#define BLE_HCI_UNSUPPORTED_REMOTE_FEATURE 0x1A
|
||||
/*
|
||||
0x1B SCO Offset Rejected
|
||||
0x1C SCO Interval Rejected
|
||||
0x1D SCO Air Mode Rejected*/
|
||||
#define BLE_HCI_STATUS_CODE_INVALID_LMP_PARAMETERS 0x1E
|
||||
#define BLE_HCI_STATUS_CODE_UNSPECIFIED_ERROR 0x1F
|
||||
/*0x20 Unsupported LMP Parameter Value
|
||||
0x21 Role Change Not Allowed
|
||||
*/
|
||||
#define BLE_HCI_STATUS_CODE_LMP_RESPONSE_TIMEOUT 0x22
|
||||
/*0x23 LMP Error Transaction Collision*/
|
||||
#define BLE_HCI_STATUS_CODE_LMP_PDU_NOT_ALLOWED 0x24
|
||||
/*0x25 Encryption Mode Not Acceptable
|
||||
0x26 Link Key Can Not be Changed
|
||||
0x27 Requested QoS Not Supported
|
||||
*/
|
||||
#define BLE_HCI_INSTANT_PASSED 0x28
|
||||
#define BLE_HCI_PAIRING_WITH_UNIT_KEY_UNSUPPORTED 0x29
|
||||
#define BLE_HCI_DIFFERENT_TRANSACTION_COLLISION 0x2A
|
||||
/*
|
||||
0x2B Reserved
|
||||
0x2C QoS Unacceptable Parameter
|
||||
0x2D QoS Rejected
|
||||
0x2E Channel Classification Not Supported
|
||||
0x2F Insufficient Security
|
||||
0x30 Parameter Out Of Mandatory Range
|
||||
0x31 Reserved
|
||||
0x32 Role Switch Pending
|
||||
0x33 Reserved
|
||||
0x34 Reserved Slot Violation
|
||||
0x35 Role Switch Failed
|
||||
0x36 Extended Inquiry Response Too Large
|
||||
0x37 Secure Simple Pairing Not Supported By Host.
|
||||
0x38 Host Busy - Pairing
|
||||
0x39 Connection Rejected due to No Suitable Channel Found*/
|
||||
#define BLE_HCI_CONTROLLER_BUSY 0x3A
|
||||
#define BLE_HCI_CONN_INTERVAL_UNACCEPTABLE 0x3B
|
||||
#define BLE_HCI_DIRECTED_ADVERTISER_TIMEOUT 0x3C
|
||||
#define BLE_HCI_CONN_TERMINATED_DUE_TO_MIC_FAILURE 0x3D
|
||||
#define BLE_HCI_CONN_FAILED_TO_BE_ESTABLISHED 0x3E
|
||||
|
||||
/** @} */
|
||||
|
||||
|
||||
#endif // BLE_HCI_H__
|
||||
|
||||
/** @} */
|
|
@ -0,0 +1,144 @@
|
|||
/* Copyright (c) 2011 Nordic Semiconductor. All Rights Reserved.
|
||||
*
|
||||
* The information contained herein is confidential property of Nordic Semiconductor. The use,
|
||||
* copying, transfer or disclosure of such information is prohibited except by express written
|
||||
* agreement with Nordic Semiconductor.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
@addtogroup BLE_L2CAP Logical Link Control and Adaptation Protocol (L2CAP)
|
||||
@{
|
||||
@brief Definitions and prototypes for the L2CAP interface.
|
||||
*/
|
||||
|
||||
#ifndef BLE_L2CAP_H__
|
||||
#define BLE_L2CAP_H__
|
||||
|
||||
#include "ble_types.h"
|
||||
#include "ble_ranges.h"
|
||||
#include "ble_err.h"
|
||||
#include "nrf_svc.h"
|
||||
|
||||
/**@addtogroup BLE_L2CAP_ENUMERATIONS Enumerations
|
||||
* @{ */
|
||||
|
||||
/**@brief L2CAP API SVC numbers. */
|
||||
enum BLE_L2CAP_SVCS
|
||||
{
|
||||
SD_BLE_L2CAP_CID_REGISTER = BLE_L2CAP_SVC_BASE, /**< Register a CID. */
|
||||
SD_BLE_L2CAP_CID_UNREGISTER, /**< Unregister a CID. */
|
||||
SD_BLE_L2CAP_TX /**< Transmit a packet. */
|
||||
};
|
||||
|
||||
/** @} */
|
||||
|
||||
/**@addtogroup BLE_L2CAP_DEFINES Defines
|
||||
* @{ */
|
||||
|
||||
/**@defgroup BLE_ERRORS_L2CAP SVC return values specific to L2CAP
|
||||
* @{ */
|
||||
#define BLE_ERROR_L2CAP_CID_IN_USE (NRF_L2CAP_ERR_BASE + 0x000) /**< CID already in use. */
|
||||
/** @} */
|
||||
|
||||
/**@brief Default L2CAP MTU. */
|
||||
#define BLE_L2CAP_MTU_DEF (23)
|
||||
|
||||
/**@brief Invalid Channel Identifier. */
|
||||
#define BLE_L2CAP_CID_INVALID (0x0000)
|
||||
|
||||
/**@brief Dynamic Channel Identifier base. */
|
||||
#define BLE_L2CAP_CID_DYN_BASE (0x0040)
|
||||
|
||||
/**@brief Maximum amount of dynamic CIDs. */
|
||||
#define BLE_L2CAP_CID_DYN_MAX (8)
|
||||
|
||||
/** @} */
|
||||
|
||||
/**@addtogroup BLE_L2CAP_STRUCTURES Structures
|
||||
* @{ */
|
||||
|
||||
/**@brief Packet header format for L2CAP transmission. */
|
||||
typedef struct
|
||||
{
|
||||
uint16_t len; /**< Length of valid info in data member. */
|
||||
uint16_t cid; /**< Channel ID on which packet is transmitted. */
|
||||
} ble_l2cap_header_t;
|
||||
|
||||
/**@brief L2CAP Event IDs. */
|
||||
enum BLE_L2CAP_EVTS
|
||||
{
|
||||
BLE_L2CAP_EVT_RX = BLE_L2CAP_EVT_BASE /**< L2CAP packet received. */
|
||||
};
|
||||
|
||||
|
||||
/**@brief L2CAP Received packet event report. */
|
||||
typedef struct
|
||||
{
|
||||
ble_l2cap_header_t header; /** L2CAP packet header. */
|
||||
uint8_t data[1]; /**< Packet data, variable length. */
|
||||
} ble_l2cap_evt_rx_t;
|
||||
|
||||
|
||||
/**@brief L2CAP event callback event structure. */
|
||||
typedef struct
|
||||
{
|
||||
uint16_t conn_handle; /**< Connection Handle on which event occured. */
|
||||
union
|
||||
{
|
||||
ble_l2cap_evt_rx_t rx; /**< RX Event parameters. */
|
||||
} params;
|
||||
} ble_l2cap_evt_t;
|
||||
|
||||
|
||||
/**@brief Register a CID with L2CAP.
|
||||
*
|
||||
* @details This registers a higher protocol layer with the L2CAP multiplexer, and is requried prior to all operations on the CID.
|
||||
*
|
||||
* @param[in] cid L2CAP CID.
|
||||
*
|
||||
* @return @ref NRF_SUCCESS Successfully registered a CID with the L2CAP layer.
|
||||
* @return @ref NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, CID must be above @ref BLE_L2CAP_CID_DYN_BASE.
|
||||
* @return @ref BLE_ERROR_L2CAP_CID_IN_USE L2CAP CID already in use.
|
||||
* @return @ref NRF_ERROR_NO_MEM Not enough memory to complete operation.
|
||||
*/
|
||||
SVCALL(SD_BLE_L2CAP_CID_REGISTER, uint32_t, sd_ble_l2cap_cid_register(uint16_t cid));
|
||||
|
||||
/**@brief Unregister a CID with L2CAP.
|
||||
*
|
||||
* @details This unregisters a previously registerd higher protocol layer with the L2CAP multiplexer.
|
||||
*
|
||||
* @param[in] cid L2CAP CID.
|
||||
*
|
||||
* @return @ref NRF_SUCCESS Successfully unregistered the CID.
|
||||
* @return @ref NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied.
|
||||
* @return @ref NRF_ERROR_NOT_FOUND CID not previously registered.
|
||||
*/
|
||||
SVCALL(SD_BLE_L2CAP_CID_UNREGISTER, uint32_t, sd_ble_l2cap_cid_unregister(uint16_t cid));
|
||||
|
||||
/**@brief Transmit an L2CAP packet.
|
||||
*
|
||||
* @note It is important to note that a call to this function will <b>consume an application buffer</b>, and will therefore
|
||||
* generate a @ref BLE_EVT_TX_COMPLETE event when the packet has been transmitted.
|
||||
* Please see the documentation of @ref sd_ble_tx_buffer_count_get for more details.
|
||||
*
|
||||
* @param[in] conn_handle Connection Handle.
|
||||
* @param[in] p_header Pointer to a packet header containing length and CID.
|
||||
* @param[in] p_data Pointer to the data to be transmitted.
|
||||
*
|
||||
* @return @ref NRF_SUCCESS Successfully queued an L2CAP packet for transmission.
|
||||
* @return @ref NRF_ERROR_INVALID_ADDR Invalid pointer supplied.
|
||||
* @return @ref NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, CIDs must be registered beforehand with @ref sd_ble_l2cap_cid_register.
|
||||
* @return @ref NRF_ERROR_NOT_FOUND CID not found.
|
||||
* @return @ref NRF_ERROR_NO_MEM Not enough memory to complete operation.
|
||||
* @return @ref BLE_ERROR_NO_TX_BUFFERS Not enough application buffers available.
|
||||
* @return @ref NRF_ERROR_DATA_SIZE Invalid data size(s) supplied, see @ref BLE_L2CAP_MTU_DEF.
|
||||
*/
|
||||
SVCALL(SD_BLE_L2CAP_TX, uint32_t, sd_ble_l2cap_tx(uint16_t conn_handle, ble_l2cap_header_t const * const p_header, uint8_t const * const p_data));
|
||||
|
||||
/** @} */
|
||||
|
||||
#endif // BLE_L2CAP_H__
|
||||
|
||||
/**
|
||||
@}
|
||||
*/
|
|
@ -0,0 +1,89 @@
|
|||
/*
|
||||
Copyright (c) 2012 Nordic Semiconductor. All Rights Reserved.
|
||||
|
||||
The information contained herein is confidential property of Nordic Semiconductor. The use,
|
||||
copying, transfer or disclosure of such information is prohibited except by express written
|
||||
agreement with Nordic Semiconductor.
|
||||
*/
|
||||
/**
|
||||
@addtogroup BLE_COMMON
|
||||
@{
|
||||
@defgroup ble_ranges Module specific SVC and event number subranges
|
||||
@{
|
||||
|
||||
@brief Definition of SVC and event number subranges for each API module.
|
||||
|
||||
@note
|
||||
SVCs and event numbers are split into subranges for each API module.
|
||||
Each module receives its entire allocated range of SVC calls, whether implemented or not,
|
||||
but return BLE_ERROR_NOT_SUPPORTED for unimplemented or undefined calls in its range.
|
||||
|
||||
Note that the symbols BLE_<module>_SVC_LAST is the end of the allocated SVC range,
|
||||
rather than the last SVC function call actually defined and implemented.
|
||||
|
||||
Specific SVC and event values are defined in each module's ble_<module>.h file,
|
||||
which defines names of each individual SVC code based on the range start value.
|
||||
*/
|
||||
|
||||
#ifndef BLE_RANGES_H__
|
||||
#define BLE_RANGES_H__
|
||||
|
||||
#define BLE_SVC_BASE 0x60
|
||||
#define BLE_SVC_LAST 0x6B /* Total: 12. */
|
||||
|
||||
#define BLE_RESERVED_SVC_BASE 0x6C
|
||||
#define BLE_RESERVED_SVC_LAST 0x6F /* Total: 4. */
|
||||
|
||||
#define BLE_GAP_SVC_BASE 0x70
|
||||
#define BLE_GAP_SVC_LAST 0x8F /* Total: 32. */
|
||||
|
||||
#define BLE_GATTC_SVC_BASE 0x90
|
||||
#define BLE_GATTC_SVC_LAST 0x9F /* Total: 16. */
|
||||
|
||||
#define BLE_GATTS_SVC_BASE 0xA0
|
||||
#define BLE_GATTS_SVC_LAST 0xAF /* Total: 16. */
|
||||
|
||||
#define BLE_L2CAP_SVC_BASE 0xB0
|
||||
#define BLE_L2CAP_SVC_LAST 0xBF /* Total: 16. */
|
||||
|
||||
|
||||
#define BLE_EVT_INVALID 0x00
|
||||
|
||||
#define BLE_EVT_BASE 0x01
|
||||
#define BLE_EVT_LAST 0x0F /* Total: 15. */
|
||||
|
||||
#define BLE_GAP_EVT_BASE 0x10
|
||||
#define BLE_GAP_EVT_LAST 0x2F /* Total: 32. */
|
||||
|
||||
#define BLE_GATTC_EVT_BASE 0x30
|
||||
#define BLE_GATTC_EVT_LAST 0x4F /* Total: 32. */
|
||||
|
||||
#define BLE_GATTS_EVT_BASE 0x50
|
||||
#define BLE_GATTS_EVT_LAST 0x6F /* Total: 32. */
|
||||
|
||||
#define BLE_L2CAP_EVT_BASE 0x70
|
||||
#define BLE_L2CAP_EVT_LAST 0x8F /* Total: 32. */
|
||||
|
||||
#define BLE_OPT_INVALID 0x00 /**< Invalid BLE Option. */
|
||||
|
||||
#define BLE_OPT_BASE 0x01 /**< Common BLE Option base. */
|
||||
#define BLE_OPT_LAST 0x1F /**< Total: 31. */
|
||||
|
||||
#define BLE_GAP_OPT_BASE 0x20 /**< GAP BLE Option base. */
|
||||
#define BLE_GAP_OPT_LAST 0x3F /**< Total: 32. */
|
||||
|
||||
#define BLE_GATTC_OPT_BASE 0x40 /**< GATTC BLE Option base. */
|
||||
#define BLE_GATTC_OPT_LAST 0x5F /**< Total: 32. */
|
||||
|
||||
#define BLE_GATTS_OPT_BASE 0x60 /**< GATTS BLE Option base. */
|
||||
#define BLE_GATTS_OPT_LAST 0x7F /**< Total: 32. */
|
||||
|
||||
#define BLE_L2CAP_OPT_BASE 0x80 /**< L2CAP BLE Option base. */
|
||||
#define BLE_L2CAP_OPT_LAST 0x9F /**< Total: 32. */
|
||||
|
||||
#endif /* BLE_RANGES_H__ */
|
||||
|
||||
/**
|
||||
@}
|
||||
@}
|
||||
*/
|
|
@ -0,0 +1,169 @@
|
|||
/* Copyright (c) 2011 Nordic Semiconductor. All Rights Reserved.
|
||||
*
|
||||
* The information contained herein is confidential property of Nordic Semiconductor. The use,
|
||||
* copying, transfer or disclosure of such information is prohibited except by express written
|
||||
* agreement with Nordic Semiconductor.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
@addtogroup BLE_COMMON
|
||||
@{
|
||||
@defgroup ble_types Common types and macro definitions
|
||||
@{
|
||||
|
||||
@brief Common types and macro definitions for the S110 SoftDevice.
|
||||
*/
|
||||
|
||||
#ifndef BLE_TYPES_H__
|
||||
#define BLE_TYPES_H__
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
/** @addtogroup BLE_COMMON_DEFINES Defines
|
||||
* @{ */
|
||||
|
||||
/** @defgroup BLE_CONN_HANDLES BLE Connection Handles
|
||||
* @{ */
|
||||
#define BLE_CONN_HANDLE_INVALID 0xFFFF /**< Invalid Connection Handle. */
|
||||
#define BLE_CONN_HANDLE_ALL 0xFFFE /**< Applies to all Connection Handles. */
|
||||
/** @} */
|
||||
|
||||
|
||||
/** @defgroup BLE_UUID_VALUES Assigned Values for BLE UUIDs
|
||||
* @{ */
|
||||
/* Generic UUIDs, applicable to all services */
|
||||
#define BLE_UUID_UNKNOWN 0x0000 /**< Reserved UUID. */
|
||||
#define BLE_UUID_SERVICE_PRIMARY 0x2800 /**< Primary Service. */
|
||||
#define BLE_UUID_SERVICE_SECONDARY 0x2801 /**< Secondary Service. */
|
||||
#define BLE_UUID_SERVICE_INCLUDE 0x2802 /**< Include. */
|
||||
#define BLE_UUID_CHARACTERISTIC 0x2803 /**< Characteristic. */
|
||||
#define BLE_UUID_DESCRIPTOR_CHAR_EXT_PROP 0x2900 /**< Characteristic Extended Properties Descriptor. */
|
||||
#define BLE_UUID_DESCRIPTOR_CHAR_USER_DESC 0x2901 /**< Characteristic User Description Descriptor. */
|
||||
#define BLE_UUID_DESCRIPTOR_CLIENT_CHAR_CONFIG 0x2902 /**< Client Characteristic Configuration Descriptor. */
|
||||
#define BLE_UUID_DESCRIPTOR_SERVER_CHAR_CONFIG 0x2903 /**< Server Characteristic Configuration Descriptor. */
|
||||
#define BLE_UUID_DESCRIPTOR_CHAR_PRESENTATION_FORMAT 0x2904 /**< Characteristic Presentation Format Descriptor. */
|
||||
#define BLE_UUID_DESCRIPTOR_CHAR_AGGREGATE_FORMAT 0x2905 /**< Characteristic Aggregate Format Descriptor. */
|
||||
/* GATT specific UUIDs */
|
||||
#define BLE_UUID_GATT 0x1801 /**< Generic Attribute Profile. */
|
||||
#define BLE_UUID_GATT_CHARACTERISTIC_SERVICE_CHANGED 0x2A05 /**< Service Changed Characteristic. */
|
||||
/* GAP specific UUIDs */
|
||||
#define BLE_UUID_GAP 0x1800 /**< Generic Access Profile. */
|
||||
#define BLE_UUID_GAP_CHARACTERISTIC_DEVICE_NAME 0x2A00 /**< Device Name Characteristic. */
|
||||
#define BLE_UUID_GAP_CHARACTERISTIC_APPEARANCE 0x2A01 /**< Appearance Characteristic. */
|
||||
#define BLE_UUID_GAP_CHARACTERISTIC_PPF 0x2A02 /**< Peripheral Privacy Flag Characteristic. */
|
||||
#define BLE_UUID_GAP_CHARACTERISTIC_RECONN_ADDR 0x2A03 /**< Reconnection Address Characteristic. */
|
||||
#define BLE_UUID_GAP_CHARACTERISTIC_PPCP 0x2A04 /**< Peripheral Preferred Connection Parameters Characteristic. */
|
||||
/** @} */
|
||||
|
||||
|
||||
/** @defgroup BLE_UUID_TYPES Types of UUID
|
||||
* @{ */
|
||||
#define BLE_UUID_TYPE_UNKNOWN 0x00 /**< Invalid UUID type. */
|
||||
#define BLE_UUID_TYPE_BLE 0x01 /**< Bluetooth SIG UUID (16-bit). */
|
||||
#define BLE_UUID_TYPE_VENDOR_BEGIN 0x02 /**< Vendor UUID types start at this index (128-bit). */
|
||||
/** @} */
|
||||
|
||||
|
||||
/** @defgroup BLE_APPEARANCES Bluetooth Appearance values
|
||||
* @note Retrieved from http://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.gap.appearance.xml
|
||||
* @{ */
|
||||
#define BLE_APPEARANCE_UNKNOWN 0 /**< Unknown. */
|
||||
#define BLE_APPEARANCE_GENERIC_PHONE 64 /**< Generic Phone. */
|
||||
#define BLE_APPEARANCE_GENERIC_COMPUTER 128 /**< Generic Computer. */
|
||||
#define BLE_APPEARANCE_GENERIC_WATCH 192 /**< Generic Watch. */
|
||||
#define BLE_APPEARANCE_WATCH_SPORTS_WATCH 193 /**< Watch: Sports Watch. */
|
||||
#define BLE_APPEARANCE_GENERIC_CLOCK 256 /**< Generic Clock. */
|
||||
#define BLE_APPEARANCE_GENERIC_DISPLAY 320 /**< Generic Display. */
|
||||
#define BLE_APPEARANCE_GENERIC_REMOTE_CONTROL 384 /**< Generic Remote Control. */
|
||||
#define BLE_APPEARANCE_GENERIC_EYE_GLASSES 448 /**< Generic Eye-glasses. */
|
||||
#define BLE_APPEARANCE_GENERIC_TAG 512 /**< Generic Tag. */
|
||||
#define BLE_APPEARANCE_GENERIC_KEYRING 576 /**< Generic Keyring. */
|
||||
#define BLE_APPEARANCE_GENERIC_MEDIA_PLAYER 640 /**< Generic Media Player. */
|
||||
#define BLE_APPEARANCE_GENERIC_BARCODE_SCANNER 704 /**< Generic Barcode Scanner. */
|
||||
#define BLE_APPEARANCE_GENERIC_THERMOMETER 768 /**< Generic Thermometer. */
|
||||
#define BLE_APPEARANCE_THERMOMETER_EAR 769 /**< Thermometer: Ear. */
|
||||
#define BLE_APPEARANCE_GENERIC_HEART_RATE_SENSOR 832 /**< Generic Heart rate Sensor. */
|
||||
#define BLE_APPEARANCE_HEART_RATE_SENSOR_HEART_RATE_BELT 833 /**< Heart Rate Sensor: Heart Rate Belt. */
|
||||
#define BLE_APPEARANCE_GENERIC_BLOOD_PRESSURE 896 /**< Generic Blood Pressure. */
|
||||
#define BLE_APPEARANCE_BLOOD_PRESSURE_ARM 897 /**< Blood Pressure: Arm. */
|
||||
#define BLE_APPEARANCE_BLOOD_PRESSURE_WRIST 898 /**< Blood Pressure: Wrist. */
|
||||
#define BLE_APPEARANCE_GENERIC_HID 960 /**< Human Interface Device (HID). */
|
||||
#define BLE_APPEARANCE_HID_KEYBOARD 961 /**< Keyboard (HID Subtype). */
|
||||
#define BLE_APPEARANCE_HID_MOUSE 962 /**< Mouse (HID Subtype). */
|
||||
#define BLE_APPEARANCE_HID_JOYSTICK 963 /**< Joystiq (HID Subtype). */
|
||||
#define BLE_APPEARANCE_HID_GAMEPAD 964 /**< Gamepad (HID Subtype). */
|
||||
#define BLE_APPEARANCE_HID_DIGITIZERSUBTYPE 965 /**< Digitizer Tablet (HID Subtype). */
|
||||
#define BLE_APPEARANCE_HID_CARD_READER 966 /**< Card Reader (HID Subtype). */
|
||||
#define BLE_APPEARANCE_HID_DIGITAL_PEN 967 /**< Digital Pen (HID Subtype). */
|
||||
#define BLE_APPEARANCE_HID_BARCODE 968 /**< Barcode Scanner (HID Subtype). */
|
||||
#define BLE_APPEARANCE_GENERIC_GLUCOSE_METER 1024 /**< Generic Glucose Meter. */
|
||||
#define BLE_APPEARANCE_GENERIC_RUNNING_WALKING_SENSOR 1088 /**< Generic Running Walking Sensor. */
|
||||
#define BLE_APPEARANCE_RUNNING_WALKING_SENSOR_IN_SHOE 1089 /**< Running Walking Sensor: In-Shoe. */
|
||||
#define BLE_APPEARANCE_RUNNING_WALKING_SENSOR_ON_SHOE 1090 /**< Running Walking Sensor: On-Shoe. */
|
||||
#define BLE_APPEARANCE_RUNNING_WALKING_SENSOR_ON_HIP 1091 /**< Running Walking Sensor: On-Hip. */
|
||||
#define BLE_APPEARANCE_GENERIC_CYCLING 1152 /**< Generic Cycling. */
|
||||
#define BLE_APPEARANCE_CYCLING_CYCLING_COMPUTER 1153 /**< Cycling: Cycling Computer. */
|
||||
#define BLE_APPEARANCE_CYCLING_SPEED_SENSOR 1154 /**< Cycling: Speed Sensor. */
|
||||
#define BLE_APPEARANCE_CYCLING_CADENCE_SENSOR 1155 /**< Cycling: Cadence Sensor. */
|
||||
#define BLE_APPEARANCE_CYCLING_POWER_SENSOR 1156 /**< Cycling: Power Sensor. */
|
||||
#define BLE_APPEARANCE_CYCLING_SPEED_CADENCE_SENSOR 1157 /**< Cycling: Speed and Cadence Sensor. */
|
||||
#define BLE_APPEARANCE_GENERIC_PULSE_OXIMETER 3136 /**< Generic Pulse Oximeter. */
|
||||
#define BLE_APPEARANCE_PULSE_OXIMETER_FINGERTIP 3137 /**< Fingertip (Pulse Oximeter subtype). */
|
||||
#define BLE_APPEARANCE_PULSE_OXIMETER_WRIST_WORN 3138 /**< Wrist Worn(Pulse Oximeter subtype). */
|
||||
#define BLE_APPEARANCE_GENERIC_WEIGHT_SCALE 3200 /**< Generic Weight Scale. */
|
||||
#define BLE_APPEARANCE_GENERIC_OUTDOOR_SPORTS_ACT 5184 /**< Generic Outdoor Sports Activity. */
|
||||
#define BLE_APPEARANCE_OUTDOOR_SPORTS_ACT_LOC_DISP 5185 /**< Location Display Device (Outdoor Sports Activity subtype). */
|
||||
#define BLE_APPEARANCE_OUTDOOR_SPORTS_ACT_LOC_AND_NAV_DISP 5186 /**< Location and Navigation Display Device (Outdoor Sports Activity subtype). */
|
||||
#define BLE_APPEARANCE_OUTDOOR_SPORTS_ACT_LOC_POD 5187 /**< Location Pod (Outdoor Sports Activity subtype). */
|
||||
#define BLE_APPEARANCE_OUTDOOR_SPORTS_ACT_LOC_AND_NAV_POD 5188 /**< Location and Navigation Pod (Outdoor Sports Activity subtype). */
|
||||
/** @} */
|
||||
|
||||
/** @brief Set .type and .uuid fields of ble_uuid_struct to specified uuid value. */
|
||||
#define BLE_UUID_BLE_ASSIGN(instance, value) do {\
|
||||
instance.type = BLE_UUID_TYPE_BLE; \
|
||||
instance.uuid = value;} while(0)
|
||||
|
||||
/** @brief Copy type and uuid members from src to dst ble_uuid_t pointer. Both pointers must be valid/non-null. */
|
||||
#define BLE_UUID_COPY_PTR(dst, src) do {\
|
||||
(dst)->type = (src)->type; \
|
||||
(dst)->uuid = (src)->uuid;} while(0)
|
||||
|
||||
/** @brief Copy type and uuid members from src to dst ble_uuid_t struct. */
|
||||
#define BLE_UUID_COPY_INST(dst, src) do {\
|
||||
(dst).type = (src).type; \
|
||||
(dst).uuid = (src).uuid;} while(0)
|
||||
|
||||
/** @brief Compare for equality both type and uuid members of two (valid, non-null) ble_uuid_t pointers. */
|
||||
#define BLE_UUID_EQ(p_uuid1, p_uuid2) \
|
||||
(((p_uuid1)->type == (p_uuid2)->type) && ((p_uuid1)->uuid == (p_uuid2)->uuid))
|
||||
|
||||
/** @brief Compare for difference both type and uuid members of two (valid, non-null) ble_uuid_t pointers. */
|
||||
#define BLE_UUID_NEQ(p_uuid1, p_uuid2) \
|
||||
(((p_uuid1)->type != (p_uuid2)->type) || ((p_uuid1)->uuid != (p_uuid2)->uuid))
|
||||
|
||||
/** @} */
|
||||
|
||||
/** @addtogroup BLE_TYPES_STRUCTURES Structures
|
||||
* @{ */
|
||||
|
||||
/** @brief 128 bit UUID values. */
|
||||
typedef struct
|
||||
{
|
||||
unsigned char uuid128[16];
|
||||
} ble_uuid128_t;
|
||||
|
||||
/** @brief Bluetooth Low Energy UUID type, encapsulates both 16-bit and 128-bit UUIDs. */
|
||||
typedef struct
|
||||
{
|
||||
uint16_t uuid; /**< 16-bit UUID value or octets 12-13 of 128-bit UUID. */
|
||||
uint8_t type; /**< UUID type, see @ref BLE_UUID_TYPES. If type is BLE_UUID_TYPE_UNKNOWN, the value of uuid is undefined. */
|
||||
} ble_uuid_t;
|
||||
|
||||
/** @} */
|
||||
|
||||
#endif /* BLE_TYPES_H__ */
|
||||
|
||||
/**
|
||||
@}
|
||||
@}
|
||||
*/
|
|
@ -0,0 +1,51 @@
|
|||
/*
|
||||
* Copyright (c) 2012 Nordic Semiconductor. All Rights Reserved.
|
||||
*
|
||||
* The information contained herein is confidential property of Nordic Semiconductor. The use,
|
||||
* copying, transfer or disclosure of such information is prohibited except by express written
|
||||
* agreement with Nordic Semiconductor.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
@defgroup nrf_error SoftDevice Global Error Codes
|
||||
@{
|
||||
|
||||
@brief Global Error definitions
|
||||
*/
|
||||
|
||||
/* Header guard */
|
||||
#ifndef NRF_ERROR_H__
|
||||
#define NRF_ERROR_H__
|
||||
|
||||
/** @defgroup NRF_ERRORS_BASE Error Codes Base number definitions
|
||||
* @{ */
|
||||
#define NRF_ERROR_BASE_NUM (0x0) ///< Global error base
|
||||
#define NRF_ERROR_SDM_BASE_NUM (0x1000) ///< SDM error base
|
||||
#define NRF_ERROR_SOC_BASE_NUM (0x2000) ///< SoC error base
|
||||
#define NRF_ERROR_STK_BASE_NUM (0x3000) ///< STK error base
|
||||
/** @} */
|
||||
|
||||
#define NRF_SUCCESS (NRF_ERROR_BASE_NUM + 0) ///< Successful command
|
||||
#define NRF_ERROR_SVC_HANDLER_MISSING (NRF_ERROR_BASE_NUM + 1) ///< SVC handler is missing
|
||||
#define NRF_ERROR_SOFTDEVICE_NOT_ENABLED (NRF_ERROR_BASE_NUM + 2) ///< SoftDevice has not been enabled
|
||||
#define NRF_ERROR_INTERNAL (NRF_ERROR_BASE_NUM + 3) ///< Internal Error
|
||||
#define NRF_ERROR_NO_MEM (NRF_ERROR_BASE_NUM + 4) ///< No Memory for operation
|
||||
#define NRF_ERROR_NOT_FOUND (NRF_ERROR_BASE_NUM + 5) ///< Not found
|
||||
#define NRF_ERROR_NOT_SUPPORTED (NRF_ERROR_BASE_NUM + 6) ///< Not supported
|
||||
#define NRF_ERROR_INVALID_PARAM (NRF_ERROR_BASE_NUM + 7) ///< Invalid Parameter
|
||||
#define NRF_ERROR_INVALID_STATE (NRF_ERROR_BASE_NUM + 8) ///< Invalid state, operation disallowed in this state
|
||||
#define NRF_ERROR_INVALID_LENGTH (NRF_ERROR_BASE_NUM + 9) ///< Invalid Length
|
||||
#define NRF_ERROR_INVALID_FLAGS (NRF_ERROR_BASE_NUM + 10) ///< Invalid Flags
|
||||
#define NRF_ERROR_INVALID_DATA (NRF_ERROR_BASE_NUM + 11) ///< Invalid Data
|
||||
#define NRF_ERROR_DATA_SIZE (NRF_ERROR_BASE_NUM + 12) ///< Data size exceeds limit
|
||||
#define NRF_ERROR_TIMEOUT (NRF_ERROR_BASE_NUM + 13) ///< Operation timed out
|
||||
#define NRF_ERROR_NULL (NRF_ERROR_BASE_NUM + 14) ///< Null Pointer
|
||||
#define NRF_ERROR_FORBIDDEN (NRF_ERROR_BASE_NUM + 15) ///< Forbidden Operation
|
||||
#define NRF_ERROR_INVALID_ADDR (NRF_ERROR_BASE_NUM + 16) ///< Bad Memory Address
|
||||
#define NRF_ERROR_BUSY (NRF_ERROR_BASE_NUM + 17) ///< Busy
|
||||
|
||||
#endif // NRF_ERROR_H__
|
||||
|
||||
/**
|
||||
@}
|
||||
*/
|
|
@ -0,0 +1,33 @@
|
|||
/*
|
||||
* Copyright (c) 2012 Nordic Semiconductor. All Rights Reserved.
|
||||
*
|
||||
* The information contained herein is confidential property of Nordic Semiconductor. The use,
|
||||
* copying, transfer or disclosure of such information is prohibited except by express written
|
||||
* agreement with Nordic Semiconductor.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
@addtogroup nrf_sdm_api
|
||||
@{
|
||||
@defgroup nrf_sdm_error SoftDevice Manager Error Codes
|
||||
@{
|
||||
|
||||
@brief Error definitions for the SDM API
|
||||
*/
|
||||
|
||||
/* Header guard */
|
||||
#ifndef NRF_ERROR_SDM_H__
|
||||
#define NRF_ERROR_SDM_H__
|
||||
|
||||
#include "nrf_error.h"
|
||||
|
||||
#define NRF_ERROR_SDM_LFCLK_SOURCE_UNKNOWN (NRF_ERROR_SDM_BASE_NUM + 0) ///< Unknown lfclk source
|
||||
#define NRF_ERROR_SDM_INCORRECT_INTERRUPT_CONFIGURATION (NRF_ERROR_SDM_BASE_NUM + 1) ///< Incorrect interrupt configuration (can be caused by using illegal priority levels, or having enabled SoftDevice interrupts)
|
||||
#define NRF_ERROR_SDM_INCORRECT_CLENR0 (NRF_ERROR_SDM_BASE_NUM + 2) ///< Incorrect CLENR0 (can be caused by erronous SoftDevice flashing)
|
||||
|
||||
#endif // NRF_ERROR_SDM_H__
|
||||
|
||||
/**
|
||||
@}
|
||||
@}
|
||||
*/
|
|
@ -0,0 +1,49 @@
|
|||
/*
|
||||
* Copyright (c) 2012 Nordic Semiconductor. All Rights Reserved.
|
||||
*
|
||||
* The information contained herein is confidential property of Nordic Semiconductor. The use,
|
||||
* copying, transfer or disclosure of such information is prohibited except by express written
|
||||
* agreement with Nordic Semiconductor.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
@addtogroup nrf_soc_api
|
||||
@{
|
||||
@defgroup nrf_soc_error SoC Library Error Codes
|
||||
@{
|
||||
|
||||
@brief Error definitions for the SoC library
|
||||
|
||||
*/
|
||||
|
||||
/* Header guard */
|
||||
#ifndef NRF_ERROR_SOC_H__
|
||||
#define NRF_ERROR_SOC_H__
|
||||
|
||||
#include "nrf_error.h"
|
||||
|
||||
/* Mutex Errors */
|
||||
#define NRF_ERROR_SOC_MUTEX_ALREADY_TAKEN (NRF_ERROR_SOC_BASE_NUM + 0) ///< Mutex already taken
|
||||
|
||||
/* NVIC errors */
|
||||
#define NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE (NRF_ERROR_SOC_BASE_NUM + 1) ///< NVIC interrupt not available
|
||||
#define NRF_ERROR_SOC_NVIC_INTERRUPT_PRIORITY_NOT_ALLOWED (NRF_ERROR_SOC_BASE_NUM + 2) ///< NVIC interrupt priority not allowed
|
||||
#define NRF_ERROR_SOC_NVIC_SHOULD_NOT_RETURN (NRF_ERROR_SOC_BASE_NUM + 3) ///< NVIC should not return
|
||||
|
||||
/* Power errors */
|
||||
#define NRF_ERROR_SOC_POWER_MODE_UNKNOWN (NRF_ERROR_SOC_BASE_NUM + 4) ///< Power mode unknown
|
||||
#define NRF_ERROR_SOC_POWER_POF_THRESHOLD_UNKNOWN (NRF_ERROR_SOC_BASE_NUM + 5) ///< Power POF threshold unknown
|
||||
#define NRF_ERROR_SOC_POWER_OFF_SHOULD_NOT_RETURN (NRF_ERROR_SOC_BASE_NUM + 6) ///< Power off should not return
|
||||
|
||||
/* Rand errors */
|
||||
#define NRF_ERROR_SOC_RAND_NOT_ENOUGH_VALUES (NRF_ERROR_SOC_BASE_NUM + 7) ///< RAND not enough values
|
||||
|
||||
/* PPI errors */
|
||||
#define NRF_ERROR_SOC_PPI_INVALID_CHANNEL (NRF_ERROR_SOC_BASE_NUM + 8) ///< Invalid PPI Channel
|
||||
#define NRF_ERROR_SOC_PPI_INVALID_GROUP (NRF_ERROR_SOC_BASE_NUM + 9) ///< Invalid PPI Group
|
||||
|
||||
#endif // NRF_ERROR_SOC_H__
|
||||
/**
|
||||
@}
|
||||
@}
|
||||
*/
|
|
@ -0,0 +1,155 @@
|
|||
/*
|
||||
* Copyright (c) 2014 Nordic Semiconductor. All Rights Reserved.
|
||||
*
|
||||
* The information contained herein is confidential property of Nordic Semiconductor. The use,
|
||||
* copying, transfer or disclosure of such information is prohibited except by express written
|
||||
* agreement with Nordic Semiconductor.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
@defgroup nrf_mbr_api Master Boot Record API
|
||||
@{
|
||||
|
||||
@brief APIs for updating SoftDevice and BootLoader
|
||||
|
||||
*/
|
||||
|
||||
/* Header guard */
|
||||
#ifndef NRF_MBR_H__
|
||||
#define NRF_MBR_H__
|
||||
|
||||
#include "nrf_svc.h"
|
||||
#include <stdint.h>
|
||||
|
||||
|
||||
/** @addtogroup NRF_MBR_DEFINES Defines
|
||||
* @{ */
|
||||
|
||||
/**@brief MBR SVC Base number. */
|
||||
#define MBR_SVC_BASE 0x18
|
||||
/** @} */
|
||||
|
||||
/** @addtogroup NRF_MBR_ENUMS Enumerations
|
||||
* @{ */
|
||||
|
||||
/**@brief nRF Master Boot Record API SVC numbers. */
|
||||
enum NRF_MBR_SVCS
|
||||
{
|
||||
SD_MBR_COMMAND = MBR_SVC_BASE, /**< ::sd_mbr_command */
|
||||
};
|
||||
|
||||
/**@brief Possible values for ::sd_mbr_command_t.command */
|
||||
enum NRF_MBR_COMMANDS
|
||||
{
|
||||
SD_MBR_COMMAND_COPY_BL, /**< Copy a new a new BootLoader. @see sd_mbr_command_copy_bl_t */
|
||||
SD_MBR_COMMAND_COPY_SD, /**< Copy a new SoftDevice. @see ::sd_mbr_command_copy_sd_t*/
|
||||
SD_MBR_COMMAND_INIT_SD, /**< Init forwarding interrupts to SD, and run reset function in SD*/
|
||||
SD_MBR_COMMAND_COMPARE, /**< This command works like memcmp. @see ::sd_mbr_command_compare_t*/
|
||||
SD_MBR_COMMAND_VECTOR_TABLE_BASE_SET, /**< Start forwarding all exception to this address @see ::sd_mbr_command_vector_table_base_set_t*/
|
||||
};
|
||||
|
||||
/** @} */
|
||||
|
||||
/** @addtogroup NRF_MBR_TYPES Types
|
||||
* @{ */
|
||||
|
||||
/**@brief This command copies part of a new SoftDevice
|
||||
* The destination area is erased before copying.
|
||||
* If dst is in the middle of a flash page, that whole flash page will be erased.
|
||||
* If (dst+len) is in the middle of a flash page, that whole flash page will be erased.
|
||||
*
|
||||
* The user of this function is responsible for setting the PROTENSET registers.
|
||||
*
|
||||
* @retval ::NRF_SUCCESS indicates that the contents of the memory blocks where copied correctly.
|
||||
* @retval ::NRF_ERROR_INTERNAL indicates that the contents of the memory blocks where not verified correctly after copying.
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
uint32_t *src; /**< Pointer to the source of data to be copied.*/
|
||||
uint32_t *dst; /**< Pointer to the destination where the content is to be copied.*/
|
||||
uint32_t len; /**< Number of 32 bit words to copy. Must be a multiple of 256 words*/
|
||||
}sd_mbr_command_copy_sd_t;
|
||||
|
||||
|
||||
/**@brief This command works like memcmp, but takes the length in words.
|
||||
*
|
||||
* @retval ::NRF_SUCCESS indicates that the contents of both memory blocks are equal.
|
||||
* @retval ::NRF_ERROR_NULL indicates that the contents of the memory blocks are not equal.
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
uint32_t *ptr1; /**< Pointer to block of memory */
|
||||
uint32_t *ptr2; /**< Pointer to block of memory */
|
||||
uint32_t len; /**< Number of 32 bit words to compare*/
|
||||
}sd_mbr_command_compare_t;
|
||||
|
||||
|
||||
/**@brief This command copies a new BootLoader.
|
||||
* With this command, destination of BootLoader is always the address written in NRF_UICR->BOOTADDR.
|
||||
*
|
||||
* Destination is erased by this function.
|
||||
* If (destination+bl_len) is in the middle of a flash page, that whole flash page will be erased.
|
||||
*
|
||||
* This function will use PROTENSET to protect the flash that is not intended to be written.
|
||||
*
|
||||
* On Success, this function will not return. It will start the new BootLoader from reset-vector as normal.
|
||||
*
|
||||
* @retval ::NRF_ERROR_INVALID_STATE indicates that something was wrong.
|
||||
* @retval ::NRF_ERROR_INTERNAL indicates an internal error that should not happen.
|
||||
* @retval ::NRF_ERROR_FORBIDDEN if NRF_UICR->BOOTADDR is not set
|
||||
* @retval ::NRF_ERROR_INVALID_LENGTH is invalid.
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
uint32_t *bl_src; /**< Pointer to the source of the Bootloader to be be copied.*/
|
||||
uint32_t bl_len; /**< Number of 32 bit words to copy for BootLoader */
|
||||
}sd_mbr_command_copy_bl_t;
|
||||
|
||||
/**@brief Sets the base address of the interrupt vector table for interrupts forwarded from the MBR
|
||||
*
|
||||
* Once this function has been called, this address is where the MBR will start to forward interrupts to after a reset.
|
||||
*
|
||||
* To restore default forwarding thiss function should be called with @param address set to 0.
|
||||
* The MBR will then start forwarding to interrupts to the adress in NFR_UICR->BOOTADDR or to the SoftDevice if the BOOTADDR is not set.
|
||||
*
|
||||
* @retval ::NRF_SUCCESS
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
uint32_t address; /**< The base address of the interrupt vector table for forwarded interrupts.*/
|
||||
}sd_mbr_command_vector_table_base_set_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint32_t command; /**< type of command to be issued see @ref NRF_MBR_COMMANDS. */
|
||||
union
|
||||
{
|
||||
sd_mbr_command_copy_sd_t copy_sd; /**< Parameters for copy*/
|
||||
sd_mbr_command_copy_bl_t copy_bl; /**< Parameters for copy SoftDevice and BootLoader*/
|
||||
sd_mbr_command_compare_t compare; /**< Parameters for verify*/
|
||||
sd_mbr_command_vector_table_base_set_t base_set; /**< Parameters for vector table base set.*/
|
||||
} params;
|
||||
}sd_mbr_command_t;
|
||||
|
||||
/** @} */
|
||||
|
||||
/** @addtogroup NRF_MBR_FUNCTIONS Functions
|
||||
* @{ */
|
||||
|
||||
/**@brief Issue Master Boot Record commands
|
||||
*
|
||||
* Commands used when updating a SoftDevice and bootloader
|
||||
*
|
||||
* @param[in] param Pointer to a struct describing the command
|
||||
*
|
||||
*@note for retvals see ::sd_mbr_command_copy_sd_t ::sd_mbr_command_copy_bl_t ::sd_mbr_command_compare_t
|
||||
|
||||
*/
|
||||
SVCALL(SD_MBR_COMMAND, uint32_t, sd_mbr_command(sd_mbr_command_t* param));
|
||||
|
||||
/** @} */
|
||||
#endif // NRF_MBR_H__
|
||||
|
||||
/**
|
||||
@}
|
||||
*/
|
|
@ -0,0 +1,167 @@
|
|||
/*
|
||||
* Copyright (c) 2011 Nordic Semiconductor. All Rights Reserved.
|
||||
*
|
||||
* The information contained herein is confidential property of Nordic Semiconductor. The use,
|
||||
* copying, transfer or disclosure of such information is prohibited except by express written
|
||||
* agreement with Nordic Semiconductor.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
@defgroup nrf_sdm_api SoftDevice Manager API
|
||||
@{
|
||||
|
||||
@brief APIs for SoftDevice management.
|
||||
|
||||
*/
|
||||
|
||||
/* Header guard */
|
||||
#ifndef NRF_SDM_H__
|
||||
#define NRF_SDM_H__
|
||||
|
||||
#include "nrf_svc.h"
|
||||
#include "nrf51.h"
|
||||
#include "nrf_soc.h"
|
||||
#include "nrf_error_sdm.h"
|
||||
|
||||
/** @addtogroup NRF_SDM_DEFINES Defines
|
||||
* @{ */
|
||||
|
||||
/**@brief SoftDevice Manager SVC Base number. */
|
||||
#define SDM_SVC_BASE (0x10)
|
||||
|
||||
/** @} */
|
||||
|
||||
/** @addtogroup NRF_SDM_ENUMS Enumerations
|
||||
* @{ */
|
||||
|
||||
/**@brief nRF SoftDevice Manager API SVC numbers. */
|
||||
enum NRF_SD_SVCS
|
||||
{
|
||||
SD_SOFTDEVICE_ENABLE = SDM_SVC_BASE, /**< ::sd_softdevice_enable */
|
||||
SD_SOFTDEVICE_DISABLE, /**< ::sd_softdevice_disable */
|
||||
SD_SOFTDEVICE_IS_ENABLED, /**< ::sd_softdevice_is_enabled */
|
||||
SD_SOFTDEVICE_VECTOR_TABLE_BASE_SET, /**< ::sd_softdevice_vector_table_base_set */
|
||||
SVC_SDM_LAST /**< Placeholder for last SDM SVC */
|
||||
};
|
||||
|
||||
/**@brief Possible lfclk oscillator sources. */
|
||||
enum NRF_CLOCK_LFCLKSRCS
|
||||
{
|
||||
NRF_CLOCK_LFCLKSRC_SYNTH_250_PPM, /**< LFCLK Synthesized from HFCLK. */
|
||||
NRF_CLOCK_LFCLKSRC_XTAL_500_PPM, /**< LFCLK crystal oscillator 500 PPM accuracy. */
|
||||
NRF_CLOCK_LFCLKSRC_XTAL_250_PPM, /**< LFCLK crystal oscillator 250 PPM accuracy. */
|
||||
NRF_CLOCK_LFCLKSRC_XTAL_150_PPM, /**< LFCLK crystal oscillator 150 PPM accuracy. */
|
||||
NRF_CLOCK_LFCLKSRC_XTAL_100_PPM, /**< LFCLK crystal oscillator 100 PPM accuracy. */
|
||||
NRF_CLOCK_LFCLKSRC_XTAL_75_PPM, /**< LFCLK crystal oscillator 75 PPM accuracy. */
|
||||
NRF_CLOCK_LFCLKSRC_XTAL_50_PPM, /**< LFCLK crystal oscillator 50 PPM accuracy. */
|
||||
NRF_CLOCK_LFCLKSRC_XTAL_30_PPM, /**< LFCLK crystal oscillator 30 PPM accuracy. */
|
||||
NRF_CLOCK_LFCLKSRC_XTAL_20_PPM, /**< LFCLK crystal oscillator 20 PPM accuracy. */
|
||||
NRF_CLOCK_LFCLKSRC_RC_250_PPM_250MS_CALIBRATION, /**< LFCLK RC oscillator, 250ms calibration interval.*/
|
||||
NRF_CLOCK_LFCLKSRC_RC_250_PPM_500MS_CALIBRATION, /**< LFCLK RC oscillator, 500ms calibration interval.*/
|
||||
NRF_CLOCK_LFCLKSRC_RC_250_PPM_1000MS_CALIBRATION, /**< LFCLK RC oscillator, 1000ms calibration interval.*/
|
||||
NRF_CLOCK_LFCLKSRC_RC_250_PPM_2000MS_CALIBRATION, /**< LFCLK RC oscillator, 2000ms calibration interval.*/
|
||||
NRF_CLOCK_LFCLKSRC_RC_250_PPM_4000MS_CALIBRATION, /**< LFCLK RC oscillator, 4000ms calibration interval.*/
|
||||
NRF_CLOCK_LFCLKSRC_RC_250_PPM_8000MS_CALIBRATION, /**< LFCLK RC oscillator, 8000ms calibration interval.*/
|
||||
NRF_CLOCK_LFCLKSRC_RC_250_PPM_TEMP_1000MS_CALIBRATION, /**< LFCLK RC oscillator. Temperature checked every 1000ms, if changed above a threshold, a calibration is done.*/
|
||||
NRF_CLOCK_LFCLKSRC_RC_250_PPM_TEMP_2000MS_CALIBRATION, /**< LFCLK RC oscillator. Temperature checked every 2000ms, if changed above a threshold, a calibration is done.*/
|
||||
NRF_CLOCK_LFCLKSRC_RC_250_PPM_TEMP_4000MS_CALIBRATION, /**< LFCLK RC oscillator. Temperature checked every 4000ms, if changed above a threshold, a calibration is done.*/
|
||||
NRF_CLOCK_LFCLKSRC_RC_250_PPM_TEMP_8000MS_CALIBRATION, /**< LFCLK RC oscillator. Temperature checked every 8000ms, if changed above a threshold, a calibration is done.*/
|
||||
NRF_CLOCK_LFCLKSRC_RC_250_PPM_TEMP_16000MS_CALIBRATION, /**< LFCLK RC oscillator. Temperature checked every 16000ms, if changed above a threshold, a calibration is done.*/
|
||||
};
|
||||
|
||||
/** @} */
|
||||
|
||||
/** @addtogroup NRF_SDM_TYPES Types
|
||||
* @{ */
|
||||
|
||||
/**@brief Type representing lfclk oscillator source. */
|
||||
typedef uint32_t nrf_clock_lfclksrc_t;
|
||||
|
||||
|
||||
/**@brief SoftDevice Assertion Handler type.
|
||||
*
|
||||
* When an unexpected error occurs within the SoftDevice it will call the SoftDevice assertion handler callback.
|
||||
* The protocol stack will be in an undefined state when this happens and the only way to recover will be to
|
||||
* perform a reset, using e.g. CMSIS NVIC_SystemReset().
|
||||
*
|
||||
* @note This callback is executed in HardFault context, thus SVC functions cannot be called from the SoftDevice assert callback.
|
||||
*
|
||||
* @param[in] pc The program counter of the failed assert.
|
||||
* @param[in] line_number Line number where the assert failed.
|
||||
* @param[in] file_name File name where the assert failed.
|
||||
*/
|
||||
typedef void (*softdevice_assertion_handler_t)(uint32_t pc, uint16_t line_number, const uint8_t * p_file_name);
|
||||
|
||||
/** @} */
|
||||
|
||||
/** @addtogroup NRF_SDM_FUNCTIONS Functions
|
||||
* @{ */
|
||||
|
||||
/**@brief Enables the SoftDevice and by extension the protocol stack.
|
||||
*
|
||||
* Idempotent function to enable the SoftDevice.
|
||||
*
|
||||
* @note Some care must be taken if a low frequency clock source is already running when calling this function:
|
||||
* If the LF clock has a different source then the one currently running, it will be stopped. Then, the new
|
||||
* clock source will be started.
|
||||
*
|
||||
* @note This function has no effect when returning with an error.
|
||||
*
|
||||
* @post If return code is ::NRF_SUCCESS
|
||||
* - SoC library and protocol stack APIs are made available
|
||||
* - A portion of RAM will be unavailable (see relevant SDS documentation)
|
||||
* - Some peripherals will be unavailable or available only through the SoC API (see relevant SDS documentation)
|
||||
* - Interrupts will not arrive from protected peripherals or interrupts
|
||||
* - nrf_nvic_ functions must be used instead of CMSIS NVIC_ functions for reliable usage of the softdevice.
|
||||
* - Interrupt latency may be affected by the SoftDevice (see relevant SDS documentation)
|
||||
* - Chosen low frequency clock source will be running
|
||||
*
|
||||
* @param clock_source Low frequency clock source and accuracy. (Note: In the case of XTAL source, the PPM accuracy of the chosen clock source must be greater than or equal to the actual characteristics of your XTAL clock).
|
||||
* @param assertion_handler Callback for SoftDevice assertions.
|
||||
*
|
||||
* @retval ::NRF_SUCCESS
|
||||
* @retval ::NRF_ERROR_SDM_INCORRECT_INTERRUPT_CONFIGURATION SoftDeviceinterrupt is already enabled, or an enabled interrupt has an illegal priority level
|
||||
* @retval ::NRF_ERROR_SDM_LFCLK_SOURCE_UNKNOWN Unknown low frequency clock source selected
|
||||
*/
|
||||
SVCALL(SD_SOFTDEVICE_ENABLE, uint32_t, sd_softdevice_enable(nrf_clock_lfclksrc_t clock_source, softdevice_assertion_handler_t assertion_handler));
|
||||
|
||||
/**@brief Disables the SoftDevice and by extension the protocol stack.
|
||||
*
|
||||
* Idempotent function to disable the SoftDevice.
|
||||
*
|
||||
* @post SoC library and protocol stack APIs are made unavailable.
|
||||
* @post All interrupts that was protected by the SoftDevice will be disabled and initialized to priority 0 (highest).
|
||||
* @post All peripherals used by the SoftDevice will be reset to default values.
|
||||
* @post All of RAM become available.
|
||||
* @post All interrupts are forwarded to the application.
|
||||
* @post LFCLK source chosen in ::sd_softdevice_enable will be left running.
|
||||
*
|
||||
* @retval ::NRF_SUCCESS
|
||||
*/
|
||||
SVCALL(SD_SOFTDEVICE_DISABLE, uint32_t, sd_softdevice_disable(void));
|
||||
|
||||
/**@brief Check if the SoftDevice is enabled.
|
||||
*
|
||||
* @param[out] p_softdevice_enabled If the SoftDevice is enabled: 1 else 0.
|
||||
*
|
||||
* @retval ::NRF_SUCCESS
|
||||
*/
|
||||
SVCALL(SD_SOFTDEVICE_IS_ENABLED, uint32_t, sd_softdevice_is_enabled(uint8_t * p_softdevice_enabled));
|
||||
|
||||
/**@brief Sets the base address of the interrupt vector table for interrupts forwarded from the SoftDevice
|
||||
*
|
||||
* This function is only intended to be called when a bootloader is enabled.
|
||||
*
|
||||
* @param[in] address The base address of the interrupt vector table for forwarded interrupts.
|
||||
|
||||
* @retval ::NRF_SUCCESS
|
||||
*/
|
||||
SVCALL(SD_SOFTDEVICE_VECTOR_TABLE_BASE_SET, uint32_t, sd_softdevice_vector_table_base_set(uint32_t address));
|
||||
|
||||
/** @} */
|
||||
|
||||
#endif // NRF_SDM_H__
|
||||
|
||||
/**
|
||||
@}
|
||||
*/
|
|
@ -0,0 +1,958 @@
|
|||
/* Copyright (c) 2011 Nordic Semiconductor. All Rights Reserved.
|
||||
*
|
||||
* The information contained herein is confidential property of Nordic Semiconductor. The use,
|
||||
* copying, transfer or disclosure of such information is prohibited except by express written
|
||||
* agreement with Nordic Semiconductor.
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* @defgroup nrf_soc_api SoC Library API
|
||||
* @{
|
||||
*
|
||||
* @brief APIs for the SoC library.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef NRF_SOC_H__
|
||||
#define NRF_SOC_H__
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include "nrf_svc.h"
|
||||
#include "nrf51.h"
|
||||
#include "nrf51_bitfields.h"
|
||||
#include "nrf_error_soc.h"
|
||||
|
||||
/** @addtogroup NRF_SOC_DEFINES Defines
|
||||
* @{ */
|
||||
|
||||
/**@brief The number of the lowest SVC number reserved for the SoC library. */
|
||||
#define SOC_SVC_BASE (0x20)
|
||||
#define SOC_SVC_BASE_NOT_AVAILABLE (0x23)
|
||||
|
||||
/**@brief Guranteed time for application to process radio inactive notification. */
|
||||
#define NRF_RADIO_NOTIFICATION_INACTIVE_GUARANTEED_TIME_US (62)
|
||||
|
||||
/**@brief The minimum allowed timeslot extension time. */
|
||||
#define NRF_RADIO_MINIMUM_TIMESLOT_LENGTH_EXTENSION_TIME_US (200)
|
||||
|
||||
#define SOC_ECB_KEY_LENGTH (16) /**< ECB key length. */
|
||||
#define SOC_ECB_CLEARTEXT_LENGTH (16) /**< ECB cleartext length. */
|
||||
#define SOC_ECB_CIPHERTEXT_LENGTH (SOC_ECB_CLEARTEXT_LENGTH) /**< ECB ciphertext length. */
|
||||
|
||||
#define SD_EVT_IRQn (SWI2_IRQn) /**< SoftDevice Event IRQ number. Used for both protocol events and SoC events. */
|
||||
#define SD_EVT_IRQHandler (SWI2_IRQHandler) /**< SoftDevice Event IRQ handler. Used for both protocol events and SoC events. */
|
||||
#define RADIO_NOTIFICATION_IRQn (SWI1_IRQn) /**< The radio notification IRQ number. */
|
||||
#define RADIO_NOTIFICATION_IRQHandler (SWI1_IRQHandler) /**< The radio notification IRQ handler. */
|
||||
|
||||
#define NRF_RADIO_LENGTH_MIN_US (100) /**< The shortest allowed radio timeslot, in microseconds. */
|
||||
#define NRF_RADIO_LENGTH_MAX_US (100000) /**< The longest allowed radio timeslot, in microseconds. */
|
||||
|
||||
#define NRF_RADIO_DISTANCE_MAX_US (128000000UL - 1UL) /**< The longest timeslot distance, in microseconds, allowed for the distance parameter (see @ref nrf_radio_request_normal_t) in the request. */
|
||||
|
||||
#define NRF_RADIO_EARLIEST_TIMEOUT_MAX_US (128000000UL - 1UL) /**< The longest timeout, in microseconds, allowed when requesting the earliest possible timeslot. */
|
||||
|
||||
#define NRF_RADIO_START_JITTER_US (2) /**< The maximum jitter in NRF_RADIO_CALLBACK_SIGNAL_TYPE_START relative to the requested start time. */
|
||||
|
||||
/** @} */
|
||||
|
||||
/** @addtogroup NRF_SOC_TYPES Types
|
||||
* @{ */
|
||||
|
||||
/**@brief The SVC numbers used by the SVC functions in the SoC library. */
|
||||
enum NRF_SOC_SVCS
|
||||
{
|
||||
SD_FLASH_PAGE_ERASE = SOC_SVC_BASE,
|
||||
SD_FLASH_WRITE,
|
||||
SD_FLASH_PROTECT,
|
||||
SD_MUTEX_NEW = SOC_SVC_BASE_NOT_AVAILABLE,
|
||||
SD_MUTEX_ACQUIRE,
|
||||
SD_MUTEX_RELEASE,
|
||||
SD_NVIC_ENABLEIRQ,
|
||||
SD_NVIC_DISABLEIRQ,
|
||||
SD_NVIC_GETPENDINGIRQ,
|
||||
SD_NVIC_SETPENDINGIRQ,
|
||||
SD_NVIC_CLEARPENDINGIRQ,
|
||||
SD_NVIC_SETPRIORITY,
|
||||
SD_NVIC_GETPRIORITY,
|
||||
SD_NVIC_SYSTEMRESET,
|
||||
SD_NVIC_CRITICAL_REGION_ENTER,
|
||||
SD_NVIC_CRITICAL_REGION_EXIT,
|
||||
SD_RAND_APPLICATION_POOL_CAPACITY,
|
||||
SD_RAND_APPLICATION_BYTES_AVAILABLE,
|
||||
SD_RAND_APPLICATION_GET_VECTOR,
|
||||
SD_POWER_MODE_SET,
|
||||
SD_POWER_SYSTEM_OFF,
|
||||
SD_POWER_RESET_REASON_GET,
|
||||
SD_POWER_RESET_REASON_CLR,
|
||||
SD_POWER_POF_ENABLE,
|
||||
SD_POWER_POF_THRESHOLD_SET,
|
||||
SD_POWER_RAMON_SET,
|
||||
SD_POWER_RAMON_CLR,
|
||||
SD_POWER_RAMON_GET,
|
||||
SD_POWER_GPREGRET_SET,
|
||||
SD_POWER_GPREGRET_CLR,
|
||||
SD_POWER_GPREGRET_GET,
|
||||
SD_POWER_DCDC_MODE_SET,
|
||||
SD_APP_EVT_WAIT,
|
||||
SD_CLOCK_HFCLK_REQUEST,
|
||||
SD_CLOCK_HFCLK_RELEASE,
|
||||
SD_CLOCK_HFCLK_IS_RUNNING,
|
||||
SD_PPI_CHANNEL_ENABLE_GET,
|
||||
SD_PPI_CHANNEL_ENABLE_SET,
|
||||
SD_PPI_CHANNEL_ENABLE_CLR,
|
||||
SD_PPI_CHANNEL_ASSIGN,
|
||||
SD_PPI_GROUP_TASK_ENABLE,
|
||||
SD_PPI_GROUP_TASK_DISABLE,
|
||||
SD_PPI_GROUP_ASSIGN,
|
||||
SD_PPI_GROUP_GET,
|
||||
SD_RADIO_NOTIFICATION_CFG_SET,
|
||||
SD_ECB_BLOCK_ENCRYPT,
|
||||
SD_RADIO_SESSION_OPEN,
|
||||
SD_RADIO_SESSION_CLOSE,
|
||||
SD_RADIO_REQUEST,
|
||||
SD_EVT_GET,
|
||||
SD_TEMP_GET,
|
||||
SVC_SOC_LAST
|
||||
};
|
||||
|
||||
/**@brief Possible values of a ::nrf_mutex_t. */
|
||||
enum NRF_MUTEX_VALUES
|
||||
{
|
||||
NRF_MUTEX_FREE,
|
||||
NRF_MUTEX_TAKEN
|
||||
};
|
||||
|
||||
/**@brief Possible values of ::nrf_app_irq_priority_t. */
|
||||
enum NRF_APP_PRIORITIES
|
||||
{
|
||||
NRF_APP_PRIORITY_HIGH = 1,
|
||||
NRF_APP_PRIORITY_LOW = 3
|
||||
};
|
||||
|
||||
/**@brief Possible values of ::nrf_power_mode_t. */
|
||||
enum NRF_POWER_MODES
|
||||
{
|
||||
NRF_POWER_MODE_CONSTLAT, /**< Constant latency mode. See power management in the reference manual. */
|
||||
NRF_POWER_MODE_LOWPWR /**< Low power mode. See power management in the reference manual. */
|
||||
};
|
||||
|
||||
|
||||
/**@brief Possible values of ::nrf_power_failure_threshold_t */
|
||||
enum NRF_POWER_THRESHOLDS
|
||||
{
|
||||
NRF_POWER_THRESHOLD_V21, /**< 2.1 Volts power failure threshold. */
|
||||
NRF_POWER_THRESHOLD_V23, /**< 2.3 Volts power failure threshold. */
|
||||
NRF_POWER_THRESHOLD_V25, /**< 2.5 Volts power failure threshold. */
|
||||
NRF_POWER_THRESHOLD_V27 /**< 2.7 Volts power failure threshold. */
|
||||
};
|
||||
|
||||
|
||||
/**@brief Possible values of ::nrf_power_dcdc_mode_t. */
|
||||
enum NRF_POWER_DCDC_MODES
|
||||
{
|
||||
NRF_POWER_DCDC_MODE_OFF, /**< The DCDC is always off. */
|
||||
NRF_POWER_DCDC_MODE_ON, /**< The DCDC is always on. */
|
||||
NRF_POWER_DCDC_MODE_AUTOMATIC /**< The DCDC is automatically managed. */
|
||||
};
|
||||
|
||||
/**@brief Possible values of ::nrf_radio_notification_distance_t. */
|
||||
enum NRF_RADIO_NOTIFICATION_DISTANCES
|
||||
{
|
||||
NRF_RADIO_NOTIFICATION_DISTANCE_NONE = 0, /**< The event does not have a notification. */
|
||||
NRF_RADIO_NOTIFICATION_DISTANCE_800US, /**< The distance from the active notification to start of radio activity. */
|
||||
NRF_RADIO_NOTIFICATION_DISTANCE_1740US, /**< The distance from the active notification to start of radio activity. */
|
||||
NRF_RADIO_NOTIFICATION_DISTANCE_2680US, /**< The distance from the active notification to start of radio activity. */
|
||||
NRF_RADIO_NOTIFICATION_DISTANCE_3620US, /**< The distance from the active notification to start of radio activity. */
|
||||
NRF_RADIO_NOTIFICATION_DISTANCE_4560US, /**< The distance from the active notification to start of radio activity. */
|
||||
NRF_RADIO_NOTIFICATION_DISTANCE_5500US /**< The distance from the active notification to start of radio activity. */
|
||||
};
|
||||
|
||||
|
||||
/**@brief Possible values of ::nrf_radio_notification_type_t. */
|
||||
enum NRF_RADIO_NOTIFICATION_TYPES
|
||||
{
|
||||
NRF_RADIO_NOTIFICATION_TYPE_NONE = 0, /**< The event does not have a radio notification signal. */
|
||||
NRF_RADIO_NOTIFICATION_TYPE_INT_ON_ACTIVE, /**< Using interrupt for notification when the radio will be enabled. */
|
||||
NRF_RADIO_NOTIFICATION_TYPE_INT_ON_INACTIVE, /**< Using interrupt for notification when the radio has been disabled. */
|
||||
NRF_RADIO_NOTIFICATION_TYPE_INT_ON_BOTH, /**< Using interrupt for notification both when the radio will be enabled and disabled. */
|
||||
};
|
||||
|
||||
/**@brief SoC Events. */
|
||||
enum NRF_SOC_EVTS
|
||||
{
|
||||
NRF_EVT_HFCLKSTARTED, /**< Event indicating that the HFCLK has started. */
|
||||
NRF_EVT_POWER_FAILURE_WARNING, /**< Event indicating that a power failure warning has occurred. */
|
||||
NRF_EVT_FLASH_OPERATION_SUCCESS, /**< Event indicating that the ongoing flash operation has completed successfully. */
|
||||
NRF_EVT_FLASH_OPERATION_ERROR, /**< Event indicating that the ongoing flash operation has timed out with an error. */
|
||||
NRF_EVT_RADIO_BLOCKED, /**< Event indicating that a radio timeslot was blocked. */
|
||||
NRF_EVT_RADIO_CANCELED, /**< Event indicating that a radio timeslot was canceled by SoftDevice. */
|
||||
NRF_EVT_RADIO_SIGNAL_CALLBACK_INVALID_RETURN, /**< Event indicating that a radio signal callback handler return was invalid. */
|
||||
NRF_EVT_RADIO_SESSION_IDLE, /**< Event indicating that a radio session is idle. */
|
||||
NRF_EVT_RADIO_SESSION_CLOSED, /**< Event indicating that a radio session is closed. */
|
||||
NRF_EVT_NUMBER_OF_EVTS
|
||||
};
|
||||
|
||||
/** @} */
|
||||
|
||||
/** @addtogroup NRF_SOC_TYPES Types
|
||||
* @{ */
|
||||
|
||||
/**@brief Represents a mutex for use with the nrf_mutex functions.
|
||||
* @note Accessing the value directly is not safe, use the mutex functions!
|
||||
*/
|
||||
typedef volatile uint8_t nrf_mutex_t;
|
||||
|
||||
/**@brief The interrupt priorities available to the application while the softdevice is active. */
|
||||
typedef uint8_t nrf_app_irq_priority_t;
|
||||
|
||||
/**@brief Represents a power mode, used in power mode functions */
|
||||
typedef uint8_t nrf_power_mode_t;
|
||||
|
||||
/**@brief Represents a power failure threshold value. */
|
||||
typedef uint8_t nrf_power_failure_threshold_t;
|
||||
|
||||
/**@brief Represents a DCDC mode value. */
|
||||
typedef uint32_t nrf_power_dcdc_mode_t;
|
||||
|
||||
/**@brief Radio notification distances. */
|
||||
typedef uint8_t nrf_radio_notification_distance_t;
|
||||
|
||||
/**@brief Radio notification types. */
|
||||
typedef uint8_t nrf_radio_notification_type_t;
|
||||
|
||||
/** @brief The Radio signal callback types. */
|
||||
enum NRF_RADIO_CALLBACK_SIGNAL_TYPE
|
||||
{
|
||||
NRF_RADIO_CALLBACK_SIGNAL_TYPE_START, /**< This signal indicates the start of the radio timeslot. */
|
||||
NRF_RADIO_CALLBACK_SIGNAL_TYPE_TIMER0, /**< This signal indicates the NRF_TIMER0 interrupt. */
|
||||
NRF_RADIO_CALLBACK_SIGNAL_TYPE_RADIO, /**< This signal indicates the NRF_RADIO interrupt. */
|
||||
NRF_RADIO_CALLBACK_SIGNAL_TYPE_EXTEND_FAILED, /**< This signal indicates extend action failed. */
|
||||
NRF_RADIO_CALLBACK_SIGNAL_TYPE_EXTEND_SUCCEEDED /**< This signal indicates extend action succeeded. */
|
||||
};
|
||||
|
||||
/** @brief The actions requested by the signal callback.
|
||||
*
|
||||
* This code gives the SOC instructions about what action to take when the signal callback has
|
||||
* returned.
|
||||
*/
|
||||
enum NRF_RADIO_SIGNAL_CALLBACK_ACTION
|
||||
{
|
||||
NRF_RADIO_SIGNAL_CALLBACK_ACTION_NONE, /**< Return without action. */
|
||||
NRF_RADIO_SIGNAL_CALLBACK_ACTION_EXTEND, /**< Request an extension of the current timeslot (maximum execution time for this action is when the extension succeeded). */
|
||||
NRF_RADIO_SIGNAL_CALLBACK_ACTION_END, /**< End the current radio timeslot. */
|
||||
NRF_RADIO_SIGNAL_CALLBACK_ACTION_REQUEST_AND_END /**< Request a new radio timeslot and end the current timeslot. */
|
||||
};
|
||||
|
||||
/**@brief Radio timeslot high frequency clock source configuration. */
|
||||
enum NRF_RADIO_HFCLK_CFG
|
||||
{
|
||||
NRF_RADIO_HFCLK_CFG_DEFAULT, /**< Use the currently selected oscillator as HF clock source during the timeslot (i.e. the source is not specified). */
|
||||
NRF_RADIO_HFCLK_CFG_FORCE_XTAL, /**< Force external crystal to be used as HF clock source during whole the timeslot. */
|
||||
};
|
||||
|
||||
/** @brief Radio timeslot priorities. */
|
||||
enum NRF_RADIO_PRIORITY
|
||||
{
|
||||
NRF_RADIO_PRIORITY_HIGH, /**< High (equal priority as the normal connection priority of the SoftDevice stack(s)). */
|
||||
NRF_RADIO_PRIORITY_NORMAL, /**< Normal (equal priority as the priority of secondary activites of the SoftDevice stack(s)). */
|
||||
};
|
||||
|
||||
/** @brief Radio timeslot request type. */
|
||||
enum NRF_RADIO_REQUEST_TYPE
|
||||
{
|
||||
NRF_RADIO_REQ_TYPE_EARLIEST, /**< Request timeslot as early as possible. This should always be used for the first request in a session. */
|
||||
NRF_RADIO_REQ_TYPE_NORMAL /**< Normal timeslot request. */
|
||||
};
|
||||
|
||||
/** @brief Parameters for a request for a timeslot as early as possible. */
|
||||
typedef struct
|
||||
{
|
||||
uint8_t hfclk; /**< High frequency clock source, see @ref NRF_RADIO_HFCLK_CFG. */
|
||||
uint8_t priority; /**< The radio timeslot priority, see @ref NRF_RADIO_PRIORITY. */
|
||||
uint32_t length_us; /**< The radio timeslot length (in the range 100 to 100,000] microseconds). */
|
||||
uint32_t timeout_us; /**< Longest acceptable delay until the start of the requested timeslot (up to @ref NRF_RADIO_EARLIEST_TIMEOUT_MAX_US microseconds). */
|
||||
} nrf_radio_request_earliest_t;
|
||||
|
||||
/** @brief Parameters for a normal radio request. */
|
||||
typedef struct
|
||||
{
|
||||
uint8_t hfclk; /**< High frequency clock source, see @ref NRF_RADIO_HFCLK_CFG. */
|
||||
uint8_t priority; /**< The radio timeslot priority, see @ref NRF_RADIO_PRIORITY. */
|
||||
uint32_t distance_us; /**< Distance from the start of the previous radio timeslot (up to @ref NRF_RADIO_DISTANCE_MAX_US microseconds). */
|
||||
uint32_t length_us; /**< The radio timeslot length (in the range [100..100,000] microseconds). */
|
||||
} nrf_radio_request_normal_t;
|
||||
|
||||
/** @brief Radio request parameters. */
|
||||
typedef struct
|
||||
{
|
||||
uint8_t request_type; /**< Type of request, see @ref NRF_RADIO_REQUEST_TYPE. */
|
||||
union
|
||||
{
|
||||
nrf_radio_request_earliest_t earliest; /**< Parameters for a request for a timeslot as early as possible. */
|
||||
nrf_radio_request_normal_t normal; /**< Parameters for a normal radio request. */
|
||||
} params;
|
||||
} nrf_radio_request_t;
|
||||
|
||||
/**@brief Return parameters of the radio timeslot signal callback. */
|
||||
typedef struct
|
||||
{
|
||||
uint8_t callback_action; /**< The action requested by the application when returning from the signal callback, see @ref NRF_RADIO_SIGNAL_CALLBACK_ACTION. */
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
nrf_radio_request_t * p_next; /**< The request parameters for the next radio timeslot. */
|
||||
} request; /**< Additional parameters for return_code @ref NRF_RADIO_SIGNAL_CALLBACK_ACTION_REQUEST_AND_END. */
|
||||
struct
|
||||
{
|
||||
uint32_t length_us; /**< Requested extension of the timeslot duration (microseconds) (for minimum time see @ref NRF_RADIO_MINIMUM_TIMESLOT_LENGTH_EXTENSION_TIME_US). */
|
||||
} extend; /**< Additional parameters for return_code @ref NRF_RADIO_SIGNAL_CALLBACK_ACTION_EXTEND. */
|
||||
} params;
|
||||
} nrf_radio_signal_callback_return_param_t;
|
||||
|
||||
/**@brief The radio signal callback type.
|
||||
*
|
||||
* @note In case of invalid return parameters, the radio timeslot will automatically end
|
||||
* immediately after returning from the signal callback and the
|
||||
* @ref NRF_EVT_RADIO_SIGNAL_CALLBACK_INVALID_RETURN event will be sent.
|
||||
* @note The returned struct pointer must remain valid after the signal callback
|
||||
* function returns. For instance, this means that it must not point to a stack variable.
|
||||
*
|
||||
* @param[in] signal_type Type of signal, see @ref NRF_RADIO_CALLBACK_SIGNAL_TYPE.
|
||||
*
|
||||
* @return Pointer to structure containing action requested by the application.
|
||||
*/
|
||||
typedef nrf_radio_signal_callback_return_param_t * (*nrf_radio_signal_callback_t) (uint8_t signal_type);
|
||||
|
||||
/**@brief AES ECB data structure */
|
||||
typedef struct
|
||||
{
|
||||
uint8_t key[SOC_ECB_KEY_LENGTH]; /**< Encryption key. */
|
||||
uint8_t cleartext[SOC_ECB_CLEARTEXT_LENGTH]; /**< Clear Text data. */
|
||||
uint8_t ciphertext[SOC_ECB_CIPHERTEXT_LENGTH]; /**< Cipher Text data. */
|
||||
} nrf_ecb_hal_data_t;
|
||||
|
||||
/** @} */
|
||||
|
||||
/** @addtogroup NRF_SOC_FUNCTIONS Functions
|
||||
* @{ */
|
||||
|
||||
/**@brief Initialize a mutex.
|
||||
*
|
||||
* @param[in] p_mutex Pointer to the mutex to initialize.
|
||||
*
|
||||
* @retval ::NRF_SUCCESS
|
||||
*/
|
||||
SVCALL(SD_MUTEX_NEW, uint32_t, sd_mutex_new(nrf_mutex_t * p_mutex));
|
||||
|
||||
/**@brief Attempt to acquire a mutex.
|
||||
*
|
||||
* @param[in] p_mutex Pointer to the mutex to acquire.
|
||||
*
|
||||
* @retval ::NRF_SUCCESS The mutex was successfully acquired.
|
||||
* @retval ::NRF_ERROR_SOC_MUTEX_ALREADY_TAKEN The mutex could not be acquired.
|
||||
*/
|
||||
SVCALL(SD_MUTEX_ACQUIRE, uint32_t, sd_mutex_acquire(nrf_mutex_t * p_mutex));
|
||||
|
||||
/**@brief Release a mutex.
|
||||
*
|
||||
* @param[in] p_mutex Pointer to the mutex to release.
|
||||
*
|
||||
* @retval ::NRF_SUCCESS
|
||||
*/
|
||||
SVCALL(SD_MUTEX_RELEASE, uint32_t, sd_mutex_release(nrf_mutex_t * p_mutex));
|
||||
|
||||
/**@brief Enable External Interrupt.
|
||||
* @note Corresponds to NVIC_EnableIRQ in CMSIS.
|
||||
*
|
||||
* @pre{IRQn is valid and not reserved by the stack}
|
||||
*
|
||||
* @param[in] IRQn See the NVIC_EnableIRQ documentation in CMSIS.
|
||||
*
|
||||
* @retval ::NRF_SUCCESS The interrupt was enabled.
|
||||
* @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE The interrupt is not available for the application.
|
||||
* @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_PRIORITY_NOT_ALLOWED The interrupt has a priority not available for the application.
|
||||
*/
|
||||
SVCALL(SD_NVIC_ENABLEIRQ, uint32_t, sd_nvic_EnableIRQ(IRQn_Type IRQn));
|
||||
|
||||
/**@brief Disable External Interrupt.
|
||||
* @note Corresponds to NVIC_DisableIRQ in CMSIS.
|
||||
*
|
||||
* @pre{IRQn is valid and not reserved by the stack}
|
||||
*
|
||||
* @param[in] IRQn See the NVIC_DisableIRQ documentation in CMSIS
|
||||
*
|
||||
* @retval ::NRF_SUCCESS The interrupt was disabled.
|
||||
* @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE The interrupt is not available for the application.
|
||||
*/
|
||||
SVCALL(SD_NVIC_DISABLEIRQ, uint32_t, sd_nvic_DisableIRQ(IRQn_Type IRQn));
|
||||
|
||||
/**@brief Get Pending Interrupt.
|
||||
* @note Corresponds to NVIC_GetPendingIRQ in CMSIS.
|
||||
*
|
||||
* @pre{IRQn is valid and not reserved by the stack}
|
||||
*
|
||||
* @param[in] IRQn See the NVIC_GetPendingIRQ documentation in CMSIS.
|
||||
* @param[out] p_pending_irq Return value from NVIC_GetPendingIRQ.
|
||||
*
|
||||
* @retval ::NRF_SUCCESS The interrupt is available for the application.
|
||||
* @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE IRQn is not available for the application.
|
||||
*/
|
||||
SVCALL(SD_NVIC_GETPENDINGIRQ, uint32_t, sd_nvic_GetPendingIRQ(IRQn_Type IRQn, uint32_t * p_pending_irq));
|
||||
|
||||
/**@brief Set Pending Interrupt.
|
||||
* @note Corresponds to NVIC_SetPendingIRQ in CMSIS.
|
||||
*
|
||||
* @pre{IRQn is valid and not reserved by the stack}
|
||||
*
|
||||
* @param[in] IRQn See the NVIC_SetPendingIRQ documentation in CMSIS.
|
||||
*
|
||||
* @retval ::NRF_SUCCESS The interrupt is set pending.
|
||||
* @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE IRQn is not available for the application.
|
||||
*/
|
||||
SVCALL(SD_NVIC_SETPENDINGIRQ, uint32_t, sd_nvic_SetPendingIRQ(IRQn_Type IRQn));
|
||||
|
||||
/**@brief Clear Pending Interrupt.
|
||||
* @note Corresponds to NVIC_ClearPendingIRQ in CMSIS.
|
||||
*
|
||||
* @pre{IRQn is valid and not reserved by the stack}
|
||||
*
|
||||
* @param[in] IRQn See the NVIC_ClearPendingIRQ documentation in CMSIS.
|
||||
*
|
||||
* @retval ::NRF_SUCCESS The interrupt pending flag is cleared.
|
||||
* @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE IRQn is not available for the application.
|
||||
*/
|
||||
SVCALL(SD_NVIC_CLEARPENDINGIRQ, uint32_t, sd_nvic_ClearPendingIRQ(IRQn_Type IRQn));
|
||||
|
||||
/**@brief Set Interrupt Priority.
|
||||
* @note Corresponds to NVIC_SetPriority in CMSIS.
|
||||
*
|
||||
* @pre{IRQn is valid and not reserved by the stack}
|
||||
* @pre{priority is valid and not reserved by the stack}
|
||||
*
|
||||
* @param[in] IRQn See the NVIC_SetPriority documentation in CMSIS.
|
||||
* @param[in] priority A valid IRQ priority for use by the application.
|
||||
*
|
||||
* @retval ::NRF_SUCCESS The interrupt and priority level is available for the application.
|
||||
* @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE IRQn is not available for the application.
|
||||
* @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_PRIORITY_NOT_ALLOWED The interrupt priority is not available for the application.
|
||||
*/
|
||||
SVCALL(SD_NVIC_SETPRIORITY, uint32_t, sd_nvic_SetPriority(IRQn_Type IRQn, nrf_app_irq_priority_t priority));
|
||||
|
||||
/**@brief Get Interrupt Priority.
|
||||
* @note Corresponds to NVIC_GetPriority in CMSIS.
|
||||
*
|
||||
* @pre{IRQn is valid and not reserved by the stack}
|
||||
*
|
||||
* @param[in] IRQn See the NVIC_GetPriority documentation in CMSIS.
|
||||
* @param[out] p_priority Return value from NVIC_GetPriority.
|
||||
*
|
||||
* @retval ::NRF_SUCCESS The interrupt priority is returned in p_priority.
|
||||
* @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE - IRQn is not available for the application.
|
||||
*/
|
||||
SVCALL(SD_NVIC_GETPRIORITY, uint32_t, sd_nvic_GetPriority(IRQn_Type IRQn, nrf_app_irq_priority_t * p_priority));
|
||||
|
||||
/**@brief System Reset.
|
||||
* @note Corresponds to NVIC_SystemReset in CMSIS.
|
||||
*
|
||||
* @retval ::NRF_ERROR_SOC_NVIC_SHOULD_NOT_RETURN
|
||||
*/
|
||||
SVCALL(SD_NVIC_SYSTEMRESET, uint32_t, sd_nvic_SystemReset(void));
|
||||
|
||||
/**@brief Enters critical region.
|
||||
*
|
||||
* @post Application interrupts will be disabled.
|
||||
* @sa sd_nvic_critical_region_exit
|
||||
*
|
||||
* @param[out] p_is_nested_critical_region 1: If in a nested critical region.
|
||||
* 0: Otherwise.
|
||||
*
|
||||
* @retval ::NRF_SUCCESS
|
||||
*/
|
||||
SVCALL(SD_NVIC_CRITICAL_REGION_ENTER, uint32_t, sd_nvic_critical_region_enter(uint8_t * p_is_nested_critical_region));
|
||||
|
||||
/**@brief Exit critical region.
|
||||
*
|
||||
* @pre Application has entered a critical region using ::sd_nvic_critical_region_enter.
|
||||
* @post If not in a nested critical region, the application interrupts will restored to the state before ::sd_nvic_critical_region_enter was called.
|
||||
*
|
||||
* @param[in] is_nested_critical_region If this is set to 1, the critical region won't be exited. @sa sd_nvic_critical_region_enter.
|
||||
*
|
||||
* @retval ::NRF_SUCCESS
|
||||
*/
|
||||
SVCALL(SD_NVIC_CRITICAL_REGION_EXIT, uint32_t, sd_nvic_critical_region_exit(uint8_t is_nested_critical_region));
|
||||
|
||||
/**@brief Query the capacity of the application random pool.
|
||||
*
|
||||
* @param[out] p_pool_capacity The capacity of the pool.
|
||||
*
|
||||
* @retval ::NRF_SUCCESS
|
||||
*/
|
||||
SVCALL(SD_RAND_APPLICATION_POOL_CAPACITY, uint32_t, sd_rand_application_pool_capacity_get(uint8_t * p_pool_capacity));
|
||||
|
||||
/**@brief Get number of random bytes available to the application.
|
||||
*
|
||||
* @param[out] p_bytes_available The number of bytes currently available in the pool.
|
||||
*
|
||||
* @retval ::NRF_SUCCESS
|
||||
*/
|
||||
SVCALL(SD_RAND_APPLICATION_BYTES_AVAILABLE, uint32_t, sd_rand_application_bytes_available_get(uint8_t * p_bytes_available));
|
||||
|
||||
/**@brief Get random bytes from the application pool.
|
||||
*
|
||||
* @param[out] p_buff Pointer to unit8_t buffer for storing the bytes.
|
||||
* @param[in] length Number of bytes to take from pool and place in p_buff.
|
||||
*
|
||||
* @retval ::NRF_SUCCESS The requested bytes were written to p_buff.
|
||||
* @retval ::NRF_ERROR_SOC_RAND_NOT_ENOUGH_VALUES No bytes were written to the buffer, because there were not enough bytes available.
|
||||
*/
|
||||
SVCALL(SD_RAND_APPLICATION_GET_VECTOR, uint32_t, sd_rand_application_vector_get(uint8_t * p_buff, uint8_t length));
|
||||
|
||||
/**@brief Gets the reset reason register.
|
||||
*
|
||||
* @param[out] p_reset_reason Contents of the NRF_POWER->RESETREAS register.
|
||||
*
|
||||
* @retval ::NRF_SUCCESS
|
||||
*/
|
||||
SVCALL(SD_POWER_RESET_REASON_GET, uint32_t, sd_power_reset_reason_get(uint32_t * p_reset_reason));
|
||||
|
||||
/**@brief Clears the bits of the reset reason register.
|
||||
*
|
||||
* @param[in] reset_reason_clr_msk Contains the bits to clear from the reset reason register.
|
||||
*
|
||||
* @retval ::NRF_SUCCESS
|
||||
*/
|
||||
SVCALL(SD_POWER_RESET_REASON_CLR, uint32_t, sd_power_reset_reason_clr(uint32_t reset_reason_clr_msk));
|
||||
|
||||
/**@brief Sets the power mode when in CPU sleep.
|
||||
*
|
||||
* @param[in] power_mode The power mode to use when in CPU sleep. @sa sd_app_evt_wait
|
||||
*
|
||||
* @retval ::NRF_SUCCESS The power mode was set.
|
||||
* @retval ::NRF_ERROR_SOC_POWER_MODE_UNKNOWN The power mode was unknown.
|
||||
*/
|
||||
SVCALL(SD_POWER_MODE_SET, uint32_t, sd_power_mode_set(nrf_power_mode_t power_mode));
|
||||
|
||||
/**@brief Puts the chip in System OFF mode.
|
||||
*
|
||||
* @retval ::NRF_ERROR_SOC_POWER_OFF_SHOULD_NOT_RETURN
|
||||
*/
|
||||
SVCALL(SD_POWER_SYSTEM_OFF, uint32_t, sd_power_system_off(void));
|
||||
|
||||
/**@brief Enables or disables the power-fail comparator.
|
||||
*
|
||||
* Enabling this will give a softdevice event (NRF_EVT_POWER_FAILURE_WARNING) when the power failure warning occurs.
|
||||
* The event can be retrieved with sd_evt_get();
|
||||
*
|
||||
* @param[in] pof_enable True if the power-fail comparator should be enabled, false if it should be disabled.
|
||||
*
|
||||
* @retval ::NRF_SUCCESS
|
||||
*/
|
||||
SVCALL(SD_POWER_POF_ENABLE, uint32_t, sd_power_pof_enable(uint8_t pof_enable));
|
||||
|
||||
/**@brief Sets the power-fail threshold value.
|
||||
*
|
||||
* @param[in] threshold The power-fail threshold value to use.
|
||||
*
|
||||
* @retval ::NRF_SUCCESS The power failure threshold was set.
|
||||
* @retval ::NRF_ERROR_SOC_POWER_POF_THRESHOLD_UNKNOWN The power failure threshold is unknown.
|
||||
*/
|
||||
SVCALL(SD_POWER_POF_THRESHOLD_SET, uint32_t, sd_power_pof_threshold_set(nrf_power_failure_threshold_t threshold));
|
||||
|
||||
/**@brief Sets bits in the NRF_POWER->RAMON register.
|
||||
*
|
||||
* @param[in] ramon Contains the bits needed to be set in the NRF_POWER->RAMON register.
|
||||
*
|
||||
* @retval ::NRF_SUCCESS
|
||||
*/
|
||||
SVCALL(SD_POWER_RAMON_SET, uint32_t, sd_power_ramon_set(uint32_t ramon));
|
||||
|
||||
/** @brief Clears bits in the NRF_POWER->RAMON register.
|
||||
*
|
||||
* @param ramon Contains the bits needed to be cleared in the NRF_POWER->RAMON register.
|
||||
*
|
||||
* @retval ::NRF_SUCCESS
|
||||
*/
|
||||
SVCALL(SD_POWER_RAMON_CLR, uint32_t, sd_power_ramon_clr(uint32_t ramon));
|
||||
|
||||
/**@brief Get contents of NRF_POWER->RAMON register, indicates power status of ram blocks.
|
||||
*
|
||||
* @param[out] p_ramon Content of NRF_POWER->RAMON register.
|
||||
*
|
||||
* @retval ::NRF_SUCCESS
|
||||
*/
|
||||
SVCALL(SD_POWER_RAMON_GET, uint32_t, sd_power_ramon_get(uint32_t * p_ramon));
|
||||
|
||||
/**@brief Set bits in the NRF_POWER->GPREGRET register.
|
||||
*
|
||||
* @param[in] gpregret_msk Bits to be set in the GPREGRET register.
|
||||
*
|
||||
* @retval ::NRF_SUCCESS
|
||||
*/
|
||||
SVCALL(SD_POWER_GPREGRET_SET, uint32_t, sd_power_gpregret_set(uint32_t gpregret_msk));
|
||||
|
||||
/**@brief Clear bits in the NRF_POWER->GPREGRET register.
|
||||
*
|
||||
* @param[in] gpregret_msk Bits to be clear in the GPREGRET register.
|
||||
*
|
||||
* @retval ::NRF_SUCCESS
|
||||
*/
|
||||
SVCALL(SD_POWER_GPREGRET_CLR, uint32_t, sd_power_gpregret_clr(uint32_t gpregret_msk));
|
||||
|
||||
/**@brief Get contents of the NRF_POWER->GPREGRET register.
|
||||
*
|
||||
* @param[out] p_gpregret Contents of the GPREGRET register.
|
||||
*
|
||||
* @retval ::NRF_SUCCESS
|
||||
*/
|
||||
SVCALL(SD_POWER_GPREGRET_GET, uint32_t, sd_power_gpregret_get(uint32_t *p_gpregret));
|
||||
|
||||
/**@brief Sets the DCDC mode.
|
||||
*
|
||||
* Depending on the internal state of the SoftDevice, the mode change may not happen immediately.
|
||||
* The DCDC mode switch will be blocked when occurring in close proximity to radio transmissions. When
|
||||
* the radio transmission is done, the last mode will be used.
|
||||
*
|
||||
* @param[in] dcdc_mode The mode of the DCDC.
|
||||
*
|
||||
* @retval ::NRF_SUCCESS
|
||||
* @retval ::NRF_ERROR_INVALID_PARAM The DCDC mode is invalid.
|
||||
*/
|
||||
SVCALL(SD_POWER_DCDC_MODE_SET, uint32_t, sd_power_dcdc_mode_set(nrf_power_dcdc_mode_t dcdc_mode));
|
||||
|
||||
/**@brief Request the high frequency crystal oscillator.
|
||||
*
|
||||
* Will start the high frequency crystal oscillator, the startup time of the crystal varies
|
||||
* and the ::sd_clock_hfclk_is_running function can be polled to check if it has started.
|
||||
*
|
||||
* @see sd_clock_hfclk_is_running
|
||||
* @see sd_clock_hfclk_release
|
||||
*
|
||||
* @retval ::NRF_SUCCESS
|
||||
*/
|
||||
SVCALL(SD_CLOCK_HFCLK_REQUEST, uint32_t, sd_clock_hfclk_request(void));
|
||||
|
||||
/**@brief Releases the high frequency crystal oscillator.
|
||||
*
|
||||
* Will stop the high frequency crystal oscillator, this happens immediately.
|
||||
*
|
||||
* @see sd_clock_hfclk_is_running
|
||||
* @see sd_clock_hfclk_request
|
||||
*
|
||||
* @retval ::NRF_SUCCESS
|
||||
*/
|
||||
SVCALL(SD_CLOCK_HFCLK_RELEASE, uint32_t, sd_clock_hfclk_release(void));
|
||||
|
||||
/**@brief Checks if the high frequency crystal oscillator is running.
|
||||
*
|
||||
* @see sd_clock_hfclk_request
|
||||
* @see sd_clock_hfclk_release
|
||||
*
|
||||
* @param[out] p_is_running 1 if the external crystal oscillator is running, 0 if not.
|
||||
*
|
||||
* @retval ::NRF_SUCCESS
|
||||
*/
|
||||
SVCALL(SD_CLOCK_HFCLK_IS_RUNNING, uint32_t, sd_clock_hfclk_is_running(uint32_t * p_is_running));
|
||||
|
||||
/**@brief Waits for an application event.
|
||||
*
|
||||
* An application event is either an application interrupt or a pended interrupt when the
|
||||
* interrupt is disabled. When the interrupt is enabled it will be taken immediately since
|
||||
* this function will wait in thread mode, then the execution will return in the application's
|
||||
* main thread. When an interrupt is disabled and gets pended it will return to the application's
|
||||
* thread main. The application must ensure that the pended flag is cleared using
|
||||
* ::sd_nvic_ClearPendingIRQ in order to sleep using this function. This is only necessary for
|
||||
* disabled interrupts, as the interrupt handler will clear the pending flag automatically for
|
||||
* enabled interrupts.
|
||||
*
|
||||
* In order to wake up from disabled interrupts, the SEVONPEND flag has to be set in the Cortex-M0
|
||||
* System Control Register (SCR). @sa CMSIS_SCB
|
||||
*
|
||||
* @note If an application interrupt has happened since the last time sd_app_evt_wait was
|
||||
* called this function will return immediately and not go to sleep. This is to avoid race
|
||||
* conditions that can occur when a flag is updated in the interrupt handler and processed
|
||||
* in the main loop.
|
||||
*
|
||||
* @post An application interrupt has happened or a interrupt pending flag is set.
|
||||
*
|
||||
* @retval ::NRF_SUCCESS
|
||||
*/
|
||||
SVCALL(SD_APP_EVT_WAIT, uint32_t, sd_app_evt_wait(void));
|
||||
|
||||
/**@brief Get PPI channel enable register contents.
|
||||
*
|
||||
* @param[out] p_channel_enable The contents of the PPI CHEN register.
|
||||
*
|
||||
* @retval ::NRF_SUCCESS
|
||||
*/
|
||||
SVCALL(SD_PPI_CHANNEL_ENABLE_GET, uint32_t, sd_ppi_channel_enable_get(uint32_t * p_channel_enable));
|
||||
|
||||
/**@brief Set PPI channel enable register.
|
||||
*
|
||||
* @param[in] channel_enable_set_msk Mask containing the bits to set in the PPI CHEN register.
|
||||
*
|
||||
* @retval ::NRF_SUCCESS
|
||||
*/
|
||||
SVCALL(SD_PPI_CHANNEL_ENABLE_SET, uint32_t, sd_ppi_channel_enable_set(uint32_t channel_enable_set_msk));
|
||||
|
||||
/**@brief Clear PPI channel enable register.
|
||||
*
|
||||
* @param[in] channel_enable_clr_msk Mask containing the bits to clear in the PPI CHEN register.
|
||||
*
|
||||
* @retval ::NRF_SUCCESS
|
||||
*/
|
||||
SVCALL(SD_PPI_CHANNEL_ENABLE_CLR, uint32_t, sd_ppi_channel_enable_clr(uint32_t channel_enable_clr_msk));
|
||||
|
||||
/**@brief Assign endpoints to a PPI channel.
|
||||
*
|
||||
* @param[in] channel_num Number of the PPI channel to assign.
|
||||
* @param[in] evt_endpoint Event endpoint of the PPI channel.
|
||||
* @param[in] task_endpoint Task endpoint of the PPI channel.
|
||||
*
|
||||
* @retval ::NRF_ERROR_SOC_PPI_INVALID_CHANNEL The channel number is invalid.
|
||||
* @retval ::NRF_SUCCESS
|
||||
*/
|
||||
SVCALL(SD_PPI_CHANNEL_ASSIGN, uint32_t, sd_ppi_channel_assign(uint8_t channel_num, const volatile void * evt_endpoint, const volatile void * task_endpoint));
|
||||
|
||||
/**@brief Task to enable a channel group.
|
||||
*
|
||||
* @param[in] group_num Number of the channel group.
|
||||
*
|
||||
* @retval ::NRF_ERROR_SOC_PPI_INVALID_GROUP The group number is invalid
|
||||
* @retval ::NRF_SUCCESS
|
||||
*/
|
||||
SVCALL(SD_PPI_GROUP_TASK_ENABLE, uint32_t, sd_ppi_group_task_enable(uint8_t group_num));
|
||||
|
||||
/**@brief Task to disable a channel group.
|
||||
*
|
||||
* @param[in] group_num Number of the PPI group.
|
||||
*
|
||||
* @retval ::NRF_ERROR_SOC_PPI_INVALID_GROUP The group number is invalid.
|
||||
* @retval ::NRF_SUCCESS
|
||||
*/
|
||||
SVCALL(SD_PPI_GROUP_TASK_DISABLE, uint32_t, sd_ppi_group_task_disable(uint8_t group_num));
|
||||
|
||||
/**@brief Assign PPI channels to a channel group.
|
||||
*
|
||||
* @param[in] group_num Number of the channel group.
|
||||
* @param[in] channel_msk Mask of the channels to assign to the group.
|
||||
*
|
||||
* @retval ::NRF_ERROR_SOC_PPI_INVALID_GROUP The group number is invalid.
|
||||
* @retval ::NRF_SUCCESS
|
||||
*/
|
||||
SVCALL(SD_PPI_GROUP_ASSIGN, uint32_t, sd_ppi_group_assign(uint8_t group_num, uint32_t channel_msk));
|
||||
|
||||
/**@brief Gets the PPI channels of a channel group.
|
||||
*
|
||||
* @param[in] group_num Number of the channel group.
|
||||
* @param[out] p_channel_msk Mask of the channels assigned to the group.
|
||||
*
|
||||
* @retval ::NRF_ERROR_SOC_PPI_INVALID_GROUP The group number is invalid.
|
||||
* @retval ::NRF_SUCCESS
|
||||
*/
|
||||
SVCALL(SD_PPI_GROUP_GET, uint32_t, sd_ppi_group_get(uint8_t group_num, uint32_t * p_channel_msk));
|
||||
|
||||
/**@brief Configures the Radio Notification signal.
|
||||
*
|
||||
* @note
|
||||
* - The notification signal latency depends on the interrupt priority settings of SWI used
|
||||
* for notification signal.
|
||||
* - In the period between the ACTIVE signal and the start of the Radio Event, the SoftDevice
|
||||
* will interrupt the application to do Radio Event preparation.
|
||||
* - Using the Radio Notification feature may limit the bandwidth, as the SoftDevice may have
|
||||
* to shorten the connection events to have time for the Radio Notification signals.
|
||||
*
|
||||
* @param[in] type Type of notification signal.
|
||||
* @ref NRF_RADIO_NOTIFICATION_TYPE_NONE shall be used to turn off radio
|
||||
* notification. Using @ref NRF_RADIO_NOTIFICATION_DISTANCE_NONE is
|
||||
* recommended (but not required) to be used with
|
||||
* @ref NRF_RADIO_NOTIFICATION_TYPE_NONE.
|
||||
*
|
||||
* @param[in] distance Distance between the notification signal and start of radio activity.
|
||||
* This parameter is ignored when @ref NRF_RADIO_NOTIFICATION_TYPE_NONE or
|
||||
* @ref NRF_RADIO_NOTIFICATION_TYPE_INT_ON_INACTIVE is used.
|
||||
*
|
||||
* @retval ::NRF_ERROR_INVALID_PARAM The group number is invalid.
|
||||
* @retval ::NRF_SUCCESS
|
||||
*/
|
||||
SVCALL(SD_RADIO_NOTIFICATION_CFG_SET, uint32_t, sd_radio_notification_cfg_set(nrf_radio_notification_type_t type, nrf_radio_notification_distance_t distance));
|
||||
|
||||
/**@brief Encrypts a block according to the specified parameters.
|
||||
*
|
||||
* 128-bit AES encryption.
|
||||
*
|
||||
* @param[in, out] p_ecb_data Pointer to the ECB parameters' struct (two input
|
||||
* parameters and one output parameter).
|
||||
*
|
||||
* @retval ::NRF_SUCCESS
|
||||
*/
|
||||
SVCALL(SD_ECB_BLOCK_ENCRYPT, uint32_t, sd_ecb_block_encrypt(nrf_ecb_hal_data_t * p_ecb_data));
|
||||
|
||||
/**@brief Gets any pending events generated by the SoC API.
|
||||
*
|
||||
* The application should keep calling this function to get events, until ::NRF_ERROR_NOT_FOUND is returned.
|
||||
*
|
||||
* @param[out] p_evt_id Set to one of the values in @ref NRF_SOC_EVTS, if any events are pending.
|
||||
*
|
||||
* @retval ::NRF_SUCCESS An event was pending. The event id is written in the p_evt_id parameter.
|
||||
* @retval ::NRF_ERROR_NOT_FOUND No pending events.
|
||||
*/
|
||||
SVCALL(SD_EVT_GET, uint32_t, sd_evt_get(uint32_t * p_evt_id));
|
||||
|
||||
/**@brief Get the temperature measured on the chip
|
||||
*
|
||||
* This function will block until the temperature measurement is done.
|
||||
* It takes around 50us from call to return.
|
||||
*
|
||||
* @note Pan #28 in PAN-028 v 1.6 "Negative measured values are not represented correctly" is corrected by this function.
|
||||
*
|
||||
* @param[out] p_temp Result of temperature measurement. Die temperature in 0.25 degrees celsius.
|
||||
*
|
||||
* @retval ::NRF_SUCCESS A temperature measurement was done, and the temperature was written to temp
|
||||
*/
|
||||
SVCALL(SD_TEMP_GET, uint32_t, sd_temp_get(int32_t * p_temp));
|
||||
|
||||
/**@brief Flash Write
|
||||
*
|
||||
* Commands to write a buffer to flash
|
||||
*
|
||||
* This call initiates the flash access command, and its completion will be communicated to the
|
||||
* application with exactly one of the following events:
|
||||
* - NRF_EVT_FLASH_OPERATION_SUCCESS - The command was successfully completed.
|
||||
* - NRF_EVT_FLASH_OPERATION_ERROR - The command could not be started.
|
||||
*
|
||||
* @note
|
||||
* - This call takes control over the radio and the CPU during flash erase and write to make sure that
|
||||
* they will not interfere with the flash access. This means that all interrupts will be blocked
|
||||
* for a predictable time (depending on the NVMC specification in nRF51 Series Reference Manual
|
||||
* and the command parameters).
|
||||
*
|
||||
*
|
||||
* @param[in] p_dst Pointer to start of flash location to be written.
|
||||
* @param[in] p_src Pointer to buffer with data to be written
|
||||
* @param[in] size Number of 32-bit words to write. Maximum size is 256 32bit words.
|
||||
*
|
||||
* @retval ::NRF_ERROR_INVALID_ADDR Tried to write to a non existing flash address, or p_dst or p_src was unaligned.
|
||||
* @retval ::NRF_ERROR_BUSY The previous command has not yet completed.
|
||||
* @retval ::NRF_ERROR_INVALID_LENGTH Size was 0, or more than 256 words.
|
||||
* @retval ::NRF_ERROR_FORBIDDEN Tried to write to or read from protected location.
|
||||
* @retval ::NRF_SUCCESS The command was accepted.
|
||||
*/
|
||||
SVCALL(SD_FLASH_WRITE, uint32_t, sd_flash_write(uint32_t * const p_dst, uint32_t const * const p_src, uint32_t size));
|
||||
|
||||
|
||||
/**@brief Flash Erase page
|
||||
*
|
||||
* Commands to erase a flash page
|
||||
*
|
||||
* This call initiates the flash access command, and its completion will be communicated to the
|
||||
* application with exactly one of the following events:
|
||||
* - NRF_EVT_FLASH_OPERATION_SUCCESS - The command was successfully completed.
|
||||
* - NRF_EVT_FLASH_OPERATION_ERROR - The command could not be started.
|
||||
*
|
||||
* @note
|
||||
* - This call takes control over the radio and the CPU during flash erase and write to make sure that
|
||||
* they will not interfere with the flash access. This means that all interrupts will be blocked
|
||||
* for a predictable time (depending on the NVMC specification in nRF51 Series Reference Manual
|
||||
* and the command parameters).
|
||||
*
|
||||
*
|
||||
* @param[in] page_number Pagenumber of the page to erase
|
||||
* @retval ::NRF_ERROR_INTERNAL If a new session could not be opened due to an internal error.
|
||||
* @retval ::NRF_ERROR_INVALID_ADDR Tried to erase to a non existing flash page.
|
||||
* @retval ::NRF_ERROR_BUSY The previous command has not yet completed.
|
||||
* @retval ::NRF_ERROR_FORBIDDEN Tried to erase a protected page.
|
||||
* @retval ::NRF_SUCCESS The command was accepted.
|
||||
*/
|
||||
SVCALL(SD_FLASH_PAGE_ERASE, uint32_t, sd_flash_page_erase(uint32_t page_number));
|
||||
|
||||
|
||||
/**@brief Flash Protection set
|
||||
*
|
||||
* Commands to set the flash protection registers PROTENSETx
|
||||
*
|
||||
* @note To read the values in PROTENSETx you can read them directly. They are only write-protected.
|
||||
*
|
||||
* @param[in] protenset0 Value to be written to PROTENSET0
|
||||
* @param[in] protenset1 Value to be written to PROTENSET1
|
||||
*
|
||||
* @retval ::NRF_ERROR_FORBIDDEN Tried to protect the SoftDevice
|
||||
* @retval ::NRF_SUCCESS Values successfully written to PROTENSETx
|
||||
*/
|
||||
SVCALL(SD_FLASH_PROTECT, uint32_t, sd_flash_protect(uint32_t protenset0, uint32_t protenset1));
|
||||
|
||||
/**@brief Opens a session for radio requests.
|
||||
*
|
||||
* @note Only one session can be open at a time.
|
||||
* @note p_radio_signal_callback(NRF_RADIO_CALLBACK_SIGNAL_TYPE_START) will be called when the radio timeslot
|
||||
* starts. From this point the NRF_RADIO and NRF_TIMER0 peripherals can be freely accessed
|
||||
* by the application.
|
||||
* @note p_radio_signal_callback(NRF_RADIO_CALLBACK_SIGNAL_TYPE_TIMER0) is called whenever the NRF_TIMER0
|
||||
* interrupt occurs.
|
||||
* @note p_radio_signal_callback(NRF_RADIO_CALLBACK_SIGNAL_TYPE_RADIO) is called whenever the NRF_RADIO
|
||||
* interrupt occurs.
|
||||
* @note p_radio_signal_callback() will be called at ARM interrupt priority level 0. This
|
||||
* implies that none of the sd_* API calls can be used from p_radio_signal_callback().
|
||||
*
|
||||
* @param[in] p_radio_signal_callback The signal callback.
|
||||
*
|
||||
* @retval ::NRF_ERROR_INVALID_ADDR p_radio_signal_callback is an invalid function pointer.
|
||||
* @retval ::NRF_ERROR_BUSY If session cannot be opened.
|
||||
* @retval ::NRF_ERROR_INTERNAL If a new session could not be opened due to an internal error.
|
||||
* @retval ::NRF_SUCCESS Otherwise.
|
||||
*/
|
||||
SVCALL(SD_RADIO_SESSION_OPEN, uint32_t, sd_radio_session_open(nrf_radio_signal_callback_t p_radio_signal_callback));
|
||||
|
||||
/**@brief Closes a session for radio requests.
|
||||
*
|
||||
* @note Any current radio timeslot will be finished before the session is closed.
|
||||
* @note If a radio timeslot is scheduled when the session is closed, it will be canceled.
|
||||
* @note The application cannot consider the session closed until the NRF_EVT_RADIO_SESSION_CLOSED
|
||||
* event is received.
|
||||
*
|
||||
* @retval ::NRF_ERROR_FORBIDDEN If session not opened.
|
||||
* @retval ::NRF_ERROR_BUSY If session is currently being closed.
|
||||
* @retval ::NRF_SUCCESS Otherwise.
|
||||
*/
|
||||
SVCALL(SD_RADIO_SESSION_CLOSE, uint32_t, sd_radio_session_close(void));
|
||||
|
||||
/**@brief Requests a radio timeslot.
|
||||
*
|
||||
* @note The timing of the radio timeslot is specified by p_request->distance_us. For the first
|
||||
* request in a session, p_request->distance_us is required to be 0 by convention, and
|
||||
* the timeslot is scheduled at the first possible opportunity. All following radio timeslots are
|
||||
* requested with a distance of p_request->distance_us measured from the start of the
|
||||
* previous radio timeslot.
|
||||
* @note A too small p_request->distance_us will lead to a NRF_EVT_RADIO_BLOCKED event.
|
||||
* @note Timeslots scheduled too close will lead to a NRF_EVT_RADIO_BLOCKED event.
|
||||
* @note See the SoftDevice Specification for more on radio timeslot scheduling, distances and lengths.
|
||||
* @note If an opportunity for the first radio timeslot is not found before 100ms after the call to this
|
||||
* function, it is not scheduled, and instead a NRF_EVT_RADIO_BLOCKED event is sent.
|
||||
* The application may then try to schedule the first radio timeslot again.
|
||||
* @note Successful requests will result in nrf_radio_signal_callback_t(NRF_RADIO_CALLBACK_SIGNAL_TYPE_START).
|
||||
* Unsuccessful requests will result in a NRF_EVT_RADIO_BLOCKED event, see @ref NRF_SOC_EVTS.
|
||||
* @note The jitter in the start time of the radio timeslots is +/- NRF_RADIO_START_JITTER_US us.
|
||||
* @note The nrf_radio_signal_callback_t(NRF_RADIO_CALLBACK_SIGNAL_TYPE_START) call has a latency relative to the
|
||||
* specified radio timeslot start, but this does not affect the actual start time of the timeslot.
|
||||
* @note NRF_TIMER0 is reset at the start of the radio timeslot, and is clocked at 1MHz from the high frequency
|
||||
* (16 MHz) clock source. If p_request->hfclk_force_xtal is true, the high frequency clock is
|
||||
* guaranteed to be clocked from the external crystal.
|
||||
* @note The SoftDevice will neither access the NRF_RADIO peripheral nor the NRF_TIMER0 peripheral
|
||||
* during the radio timeslot.
|
||||
*
|
||||
* @param[in] p_request Pointer to the request parameters.
|
||||
*
|
||||
* @retval ::NRF_ERROR_FORBIDDEN If session not opened or the session is not IDLE.
|
||||
* @retval ::NRF_ERROR_INVALID_ADDR If the p_request pointer is invalid.
|
||||
* @retval ::NRF_ERROR_INVALID_PARAM If the parameters of p_request are not valid.
|
||||
* @retval ::NRF_SUCCESS Otherwise.
|
||||
*/
|
||||
SVCALL(SD_RADIO_REQUEST, uint32_t, sd_radio_request(nrf_radio_request_t * p_request ));
|
||||
|
||||
/** @} */
|
||||
|
||||
#endif // NRF_SOC_H__
|
||||
|
||||
/**@} */
|
|
@ -0,0 +1,33 @@
|
|||
#ifndef NRF_SVC__
|
||||
#define NRF_SVC__
|
||||
|
||||
#ifdef SVCALL_AS_NORMAL_FUNCTION
|
||||
#define SVCALL(number, return_type, signature) return_type signature
|
||||
#else
|
||||
|
||||
#ifndef SVCALL
|
||||
#if defined (__CC_ARM)
|
||||
#define SVCALL(number, return_type, signature) return_type __svc(number) signature
|
||||
#elif defined (__GNUC__)
|
||||
#define SVCALL(number, return_type, signature) \
|
||||
_Pragma("GCC diagnostic ignored \"-Wreturn-type\"") \
|
||||
_Pragma("GCC diagnostic ignored \"-Wunused-function\"") \
|
||||
__attribute__((naked)) static return_type signature \
|
||||
{ \
|
||||
__asm( \
|
||||
"svc %0\n" \
|
||||
"bx r14" : : "I" (number) : "r0" \
|
||||
); \
|
||||
}
|
||||
#elif defined (__ICCARM__)
|
||||
#define PRAGMA(x) _Pragma(#x)
|
||||
#define SVCALL(number, return_type, signature) \
|
||||
PRAGMA(swi_number = number) \
|
||||
__swi return_type signature;
|
||||
#else
|
||||
#define SVCALL(number, return_type, signature) return_type signature
|
||||
#endif
|
||||
#endif // SVCALL
|
||||
|
||||
#endif // SVCALL_AS_NORMAL_FUNCTION
|
||||
#endif // NRF_SVC__
|
|
@ -0,0 +1,46 @@
|
|||
/*
|
||||
* Copyright (c) 2012 Nordic Semiconductor. All Rights Reserved.
|
||||
*
|
||||
* The information contained herein is confidential property of Nordic Semiconductor. The use,
|
||||
* copying, transfer or disclosure of such information is prohibited except by express written
|
||||
* agreement with Nordic Semiconductor.
|
||||
*
|
||||
*/
|
||||
|
||||
/** @brief Utilities for verifying program logic
|
||||
*/
|
||||
|
||||
#ifndef SOFTDEVICE_ASSERT_H_
|
||||
#define SOFTDEVICE_ASSERT_H_
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
/** @brief This function handles assertions.
|
||||
*
|
||||
*
|
||||
* @note
|
||||
* This function is called when an assertion has triggered.
|
||||
*
|
||||
*
|
||||
* @param line_num The line number where the assertion is called
|
||||
* @param file_name Pointer to the file name
|
||||
*/
|
||||
void assert_softdevice_callback(uint16_t line_num, const uint8_t *file_name);
|
||||
|
||||
|
||||
/*lint -emacro(506, ASSERT) */ /* Suppress "Constant value Boolean */
|
||||
/*lint -emacro(774, ASSERT) */ /* Suppress "Boolean within 'if' always evaluates to True" */ \
|
||||
/** @brief Check intended for production code
|
||||
*
|
||||
* Check passes if "expr" evaluates to true. */
|
||||
#define ASSERT(expr) \
|
||||
if (expr) \
|
||||
{ \
|
||||
} \
|
||||
else \
|
||||
{ \
|
||||
assert_softdevice_callback((uint16_t)__LINE__, (uint8_t *)__FILE__); \
|
||||
/*lint -unreachable */ \
|
||||
}
|
||||
|
||||
#endif /* SOFTDEVICE_ASSERT_H_ */
|
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,14 @@
|
|||
s110_nrf51822_7.0.0
|
||||
|
||||
This release consists of the following:
|
||||
- This readme file
|
||||
- The s110_nrf51822_7.0.0 license
|
||||
- The s110_nrf51822_7.0.0 softdevice (binary hex file)
|
||||
- The s110_nrf51822_7.0.0 API (softdevice header files)
|
||||
- The s110_nrf51822_7.0.0 release notes
|
||||
- The s110_nrf51822_7.0.0 migration document
|
||||
|
||||
|
||||
IMPORTANT NOTE: If you intend to use the softdevice with the nRF51
|
||||
SDK only, you do _not_ need the API files. The API header files are
|
||||
already installed as part of the nRF51 SDK versions 6.0.0.
|
Binary file not shown.
File diff suppressed because it is too large
Load Diff
|
@ -30,18 +30,25 @@ const PinMap PinMap_ADC[] = {
|
|||
{NC , NC , 0 }
|
||||
};
|
||||
|
||||
/************I2C***************/
|
||||
const PinMap PinMap_I2C_SDA[] = {
|
||||
{P0_5, I2C_0, 1},
|
||||
{NC , NC , 0}
|
||||
};
|
||||
|
||||
const PinMap PinMap_I2C_SCL[] = {
|
||||
{P0_4, I2C_0, 1},
|
||||
{NC , NC, 0}
|
||||
};
|
||||
|
||||
/************UART***************/
|
||||
const PinMap PinMap_UART_TX[] = {
|
||||
{P0_19, UART_0, 1},
|
||||
// {P1_13, UART_0, 3},
|
||||
// {P1_27, UART_0, 2},
|
||||
{ NC , NC , 0}
|
||||
};
|
||||
|
||||
const PinMap PinMap_UART_RX[] = {
|
||||
{P0_18, UART_0, 1},
|
||||
// {P1_14, UART_0, 3},
|
||||
// {P1_26, UART_0, 2},
|
||||
{NC , NC , 0}
|
||||
};
|
||||
|
||||
|
@ -49,30 +56,25 @@ const PinMap PinMap_UART_RX[] = {
|
|||
const PinMap PinMap_SPI_SCLK[] = {
|
||||
{P0_6 , SPI_0, 0x02},
|
||||
{P0_10, SPI_0, 0x02},
|
||||
// {P1_29, SPI_0, 0x01},
|
||||
{P1_15, SPI_1, 0x03},
|
||||
// {P1_20, SPI_1, 0x02},
|
||||
{NC , NC , 0}
|
||||
};
|
||||
|
||||
const PinMap PinMap_SPI_MOSI[] = {
|
||||
{P0_9 , SPI_0, 0x01},
|
||||
{P0_21, SPI_1, 0x02},
|
||||
// {P1_22, SPI_1, 0x02},
|
||||
{NC , NC , 0}
|
||||
};
|
||||
|
||||
const PinMap PinMap_SPI_MISO[] = {
|
||||
{P0_8 , SPI_0, 0x01},
|
||||
{P0_22, SPI_1, 0x03},
|
||||
// {P1_21, SPI_1, 0x02},
|
||||
{NC , NC , 0}
|
||||
};
|
||||
|
||||
const PinMap PinMap_SPI_SSEL[] = {
|
||||
{P0_2 , SPI_0, 0x01},
|
||||
{P1_19, SPI_1, 0x02},
|
||||
// {P1_23, SPI_1, 0x02},
|
||||
{NC , NC , 0}
|
||||
};
|
||||
|
||||
|
|
|
@ -0,0 +1,179 @@
|
|||
/* mbed Microcontroller Library
|
||||
* Copyright (c) 2006-2013 ARM Limited
|
||||
*
|
||||
* Licensed 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.
|
||||
*/
|
||||
#ifndef MBED_PINNAMES_H
|
||||
#define MBED_PINNAMES_H
|
||||
|
||||
#include "cmsis.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef enum {
|
||||
PIN_INPUT,
|
||||
PIN_OUTPUT
|
||||
} PinDirection;
|
||||
|
||||
#define PORT_SHIFT 5
|
||||
|
||||
typedef enum {
|
||||
// LPC11U Pin Names
|
||||
P0_0 = 0,
|
||||
P0_1 = 1,
|
||||
P0_2 = 2,
|
||||
P0_3 = 3,
|
||||
P0_4 = 4,
|
||||
P0_5 = 5,
|
||||
P0_6 = 6,
|
||||
P0_7 = 7,
|
||||
P0_8 = 8,
|
||||
P0_9 = 9,
|
||||
P0_10 = 10,
|
||||
P0_11 = 11,
|
||||
P0_12 = 12,
|
||||
P0_13 = 13,
|
||||
P0_14 = 14,
|
||||
P0_15 = 15,
|
||||
P0_16 = 16,
|
||||
P0_17 = 17,
|
||||
P0_18 = 18,
|
||||
P0_19 = 19,
|
||||
P0_20 = 20,
|
||||
P0_21 = 21,
|
||||
P0_22 = 22,
|
||||
P0_23 = 23,
|
||||
P0_24 = 24,
|
||||
P0_25 = 25,
|
||||
P0_26 = 26,
|
||||
P0_27 = 27,
|
||||
|
||||
P1_0 = 32,
|
||||
P1_1 = 33,
|
||||
P1_2 = 34,
|
||||
P1_3 = 35,
|
||||
P1_4 = 36,
|
||||
P1_5 = 37,
|
||||
P1_6 = 38,
|
||||
P1_7 = 39,
|
||||
P1_8 = 40,
|
||||
P1_9 = 41,
|
||||
P1_10 = 42,
|
||||
P1_11 = 43,
|
||||
P1_12 = 44,
|
||||
P1_13 = 45,
|
||||
P1_14 = 46,
|
||||
P1_15 = 47,
|
||||
P1_16 = 48,
|
||||
P1_17 = 49,
|
||||
P1_18 = 50,
|
||||
P1_19 = 51,
|
||||
P1_20 = 52,
|
||||
P1_21 = 53,
|
||||
P1_22 = 54,
|
||||
P1_23 = 55,
|
||||
P1_24 = 56,
|
||||
P1_25 = 57,
|
||||
P1_26 = 58,
|
||||
P1_27 = 59,
|
||||
P1_28 = 60,
|
||||
P1_29 = 61,
|
||||
|
||||
P1_31 = 63,
|
||||
|
||||
// mbed DIP Pin Names
|
||||
// CN1-1 (GND)
|
||||
// CN1-2 (EXTPOWER)
|
||||
// CN1-3 (NC)
|
||||
p4 = P0_0, // CN1-4
|
||||
p5 = P0_9, // CN1-5
|
||||
p6 = P0_8, // CN1-6
|
||||
p7 = P0_10, // CN1-7
|
||||
p8 = P0_7, // CN1-8
|
||||
p9 = P0_19, // CN1-9
|
||||
p10 = P0_18, // CN1-10
|
||||
p11 = P0_21, // CN1-11
|
||||
p12 = P0_22, // CN1-12
|
||||
p13 = P1_15, // CN1-13
|
||||
p14 = P0_6, // CN1-14
|
||||
p15 = P0_11, // CN1-15
|
||||
p16 = P0_12, // CN1-16
|
||||
p17 = P0_13, // CN1-17
|
||||
p18 = P0_14, // CN1-18
|
||||
p19 = P0_15, // CN1-19
|
||||
p20 = P0_16, // CN1-20
|
||||
|
||||
p21 = P0_14, // CN2-20
|
||||
p22 = P0_2, // CN2-19
|
||||
p23 = P0_23, // CN2-18
|
||||
p24 = P0_17, // CN2-17
|
||||
p25 = P0_20, // CN2-16
|
||||
p26 = P1_15, // CN2-15
|
||||
p27 = P0_4, // CN2-14
|
||||
p28 = P0_5, // CN2-13
|
||||
p29 = P1_19, // CN2-12
|
||||
p30 = P0_1, // CN2-11
|
||||
// CN2-10 (D+USB)
|
||||
// CN2-9 (D-USB)
|
||||
p33 = P0_3, // CN2-8 (USB-VBUS)
|
||||
// CN2-7 (NC)
|
||||
// CN2-6 (NC)
|
||||
// CN2-5 (NC)
|
||||
// CN2-4 (NC)
|
||||
// CN2-3 (NC)
|
||||
// CN2-2 (VDD)
|
||||
// CN2-1 (VDD)
|
||||
|
||||
// Other mbed Pin Names
|
||||
LED1 = P0_20,
|
||||
LED2 = P0_23,
|
||||
LED3 = P0_20,
|
||||
LED4 = P0_23,
|
||||
|
||||
UART_TX = P0_19,
|
||||
UART_RX = P0_18,
|
||||
|
||||
I2C_SCL = P0_4,
|
||||
I2C_SDA = P0_5,
|
||||
|
||||
// Not connected
|
||||
NC = (int)0xFFFFFFFF,
|
||||
} PinName;
|
||||
|
||||
typedef enum {
|
||||
CHANNEL0 = FLEX_INT0_IRQn,
|
||||
CHANNEL1 = FLEX_INT1_IRQn,
|
||||
CHANNEL2 = FLEX_INT2_IRQn,
|
||||
CHANNEL3 = FLEX_INT3_IRQn,
|
||||
CHANNEL4 = FLEX_INT4_IRQn,
|
||||
CHANNEL5 = FLEX_INT5_IRQn,
|
||||
CHANNEL6 = FLEX_INT6_IRQn,
|
||||
CHANNEL7 = FLEX_INT7_IRQn
|
||||
} Channel;
|
||||
|
||||
typedef enum {
|
||||
PullUp = 2,
|
||||
PullDown = 1,
|
||||
PullNone = 0,
|
||||
Repeater = 3,
|
||||
OpenDrain = 4,
|
||||
PullDefault = PullDown
|
||||
} PinMode;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
|
@ -0,0 +1,59 @@
|
|||
/* mbed Microcontroller Library
|
||||
* Copyright (c) 2006-2013 ARM Limited
|
||||
*
|
||||
* Licensed 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.
|
||||
*/
|
||||
#ifndef MBED_DEVICE_H
|
||||
#define MBED_DEVICE_H
|
||||
|
||||
#define DEVICE_PORTIN 1
|
||||
#define DEVICE_PORTOUT 1
|
||||
#define DEVICE_PORTINOUT 1
|
||||
|
||||
#define DEVICE_INTERRUPTIN 1
|
||||
|
||||
#define DEVICE_ANALOGIN 1
|
||||
#define DEVICE_ANALOGOUT 0
|
||||
|
||||
#define DEVICE_SERIAL 1
|
||||
|
||||
#define DEVICE_I2C 1
|
||||
#define DEVICE_I2CSLAVE 1
|
||||
|
||||
#define DEVICE_SPI 1
|
||||
#define DEVICE_SPISLAVE 1
|
||||
|
||||
#define DEVICE_CAN 0
|
||||
|
||||
#define DEVICE_RTC 0
|
||||
|
||||
#define DEVICE_ETHERNET 0
|
||||
|
||||
#define DEVICE_PWMOUT 1
|
||||
|
||||
#define DEVICE_SEMIHOST 0
|
||||
#define DEVICE_LOCALFILESYSTEM 0
|
||||
#define DEVICE_ID_LENGTH 32
|
||||
#define DEVICE_MAC_OFFSET 20
|
||||
|
||||
#define DEVICE_SLEEP 1
|
||||
|
||||
#define DEVICE_DEBUG_AWARENESS 0
|
||||
|
||||
#define DEVICE_STDIO_MESSAGES 0
|
||||
|
||||
#define DEVICE_ERROR_PATTERN 1
|
||||
|
||||
#include "objects.h"
|
||||
|
||||
#endif
|
|
@ -20,17 +20,20 @@
|
|||
#include "pinmap.h"
|
||||
#include "error.h"
|
||||
|
||||
// SCU mode for I2C SCL/SDA pins
|
||||
#define SCU_PINIO_I2C SCU_PINIO_PULLNONE
|
||||
|
||||
static const PinMap PinMap_I2C_SDA[] = {
|
||||
{P_DED, I2C_0, 0},
|
||||
{P2_3, I2C_1, 1},
|
||||
{PE_13, I2C_1, 2},
|
||||
{P2_3, I2C_1, (SCU_PINIO_I2C | 1)},
|
||||
{PE_13, I2C_1, (SCU_PINIO_I2C | 2)},
|
||||
{NC, NC, 0}
|
||||
};
|
||||
|
||||
static const PinMap PinMap_I2C_SCL[] = {
|
||||
{P_DED, I2C_0, 0},
|
||||
{P2_4, I2C_1, 1},
|
||||
{PE_14, I2C_1, 2},
|
||||
{P2_4, I2C_1, (SCU_PINIO_I2C | 1)},
|
||||
{PE_14, I2C_1, (SCU_PINIO_I2C | 2)},
|
||||
{NC, NC, 0}
|
||||
};
|
||||
|
||||
|
|
|
@ -31,45 +31,49 @@
|
|||
******************************************************************************/
|
||||
#define UART_NUM 4
|
||||
|
||||
// SCU mode for UART pins
|
||||
#define SCU_PINIO_UART_TX SCU_MODE_PULLDOWN
|
||||
#define SCU_PINIO_UART_RX SCU_PINIO_PULLNONE
|
||||
|
||||
static const PinMap PinMap_UART_TX[] = {
|
||||
{P1_13, UART_1, (SCU_MODE_PULLDOWN | 1)},
|
||||
{P1_15, UART_2, (SCU_MODE_PULLDOWN | 1)},
|
||||
{P2_0, UART_0, (SCU_MODE_PULLDOWN | 1)},
|
||||
{P2_3, UART_3, (SCU_MODE_PULLDOWN | 2)},
|
||||
{P2_10, UART_2, (SCU_MODE_PULLDOWN | 2)},
|
||||
{P3_4, UART_1, (SCU_MODE_PULLDOWN | 4)},
|
||||
{P4_1, UART_3, (SCU_MODE_PULLDOWN | 6)},
|
||||
{P5_6, UART_1, (SCU_MODE_PULLDOWN | 4)},
|
||||
{P6_4, UART_0, (SCU_MODE_PULLDOWN | 2)},
|
||||
{P7_1, UART_2, (SCU_MODE_PULLDOWN | 6)},
|
||||
{P9_3, UART_3, (SCU_MODE_PULLDOWN | 7)},
|
||||
{P9_5, UART_0, (SCU_MODE_PULLDOWN | 7)},
|
||||
{PA_1, UART_2, (SCU_MODE_PULLDOWN | 3)},
|
||||
{PC_13, UART_1, (SCU_MODE_PULLDOWN | 2)},
|
||||
{PE_11, UART_1, (SCU_MODE_PULLDOWN | 2)},
|
||||
{PF_2, UART_3, (SCU_MODE_PULLDOWN | 1)},
|
||||
{PF_10, UART_0, (SCU_MODE_PULLDOWN | 1)},
|
||||
{P1_13, UART_1, (SCU_PINIO_UART_TX | 1)},
|
||||
{P1_15, UART_2, (SCU_PINIO_UART_TX | 1)},
|
||||
{P2_0, UART_0, (SCU_PINIO_UART_TX | 1)},
|
||||
{P2_3, UART_3, (SCU_PINIO_UART_TX | 2)},
|
||||
{P2_10, UART_2, (SCU_PINIO_UART_TX | 2)},
|
||||
{P3_4, UART_1, (SCU_PINIO_UART_TX | 4)},
|
||||
{P4_1, UART_3, (SCU_PINIO_UART_TX | 6)},
|
||||
{P5_6, UART_1, (SCU_PINIO_UART_TX | 4)},
|
||||
{P6_4, UART_0, (SCU_PINIO_UART_TX | 2)},
|
||||
{P7_1, UART_2, (SCU_PINIO_UART_TX | 6)},
|
||||
{P9_3, UART_3, (SCU_PINIO_UART_TX | 7)},
|
||||
{P9_5, UART_0, (SCU_PINIO_UART_TX | 7)},
|
||||
{PA_1, UART_2, (SCU_PINIO_UART_TX | 3)},
|
||||
{PC_13, UART_1, (SCU_PINIO_UART_TX | 2)},
|
||||
{PE_11, UART_1, (SCU_PINIO_UART_TX | 2)},
|
||||
{PF_2, UART_3, (SCU_PINIO_UART_TX | 1)},
|
||||
{PF_10, UART_0, (SCU_PINIO_UART_TX | 1)},
|
||||
{NC, NC, 0}
|
||||
};
|
||||
|
||||
static const PinMap PinMap_UART_RX[] = {
|
||||
{P1_14, UART_1, (SCU_PINIO_PULLNONE | 1)},
|
||||
{P1_16, UART_2, (SCU_PINIO_PULLNONE | 1)},
|
||||
{P2_1, UART_0, (SCU_PINIO_PULLNONE | 1)},
|
||||
{P2_4, UART_3, (SCU_PINIO_PULLNONE | 2)},
|
||||
{P2_11, UART_2, (SCU_PINIO_PULLNONE | 2)},
|
||||
{P3_5, UART_1, (SCU_PINIO_PULLNONE | 4)},
|
||||
{P4_2, UART_3, (SCU_PINIO_PULLNONE | 6)},
|
||||
{P5_7, UART_1, (SCU_PINIO_PULLNONE | 4)},
|
||||
{P6_5, UART_0, (SCU_PINIO_PULLNONE | 2)},
|
||||
{P7_2, UART_2, (SCU_PINIO_PULLNONE | 6)},
|
||||
{P9_4, UART_3, (SCU_PINIO_PULLNONE | 7)},
|
||||
{P9_6, UART_0, (SCU_PINIO_PULLNONE | 7)},
|
||||
{PA_2, UART_2, (SCU_PINIO_PULLNONE | 3)},
|
||||
{PC_14, UART_1, (SCU_PINIO_PULLNONE | 2)},
|
||||
{PE_12, UART_1, (SCU_PINIO_PULLNONE | 2)},
|
||||
{PF_3, UART_3, (SCU_PINIO_PULLNONE | 1)},
|
||||
{PF_11, UART_0, (SCU_PINIO_PULLNONE | 1)},
|
||||
{P1_14, UART_1, (SCU_PINIO_UART_RX | 1)},
|
||||
{P1_16, UART_2, (SCU_PINIO_UART_RX | 1)},
|
||||
{P2_1, UART_0, (SCU_PINIO_UART_RX | 1)},
|
||||
{P2_4, UART_3, (SCU_PINIO_UART_RX | 2)},
|
||||
{P2_11, UART_2, (SCU_PINIO_UART_RX | 2)},
|
||||
{P3_5, UART_1, (SCU_PINIO_UART_RX | 4)},
|
||||
{P4_2, UART_3, (SCU_PINIO_UART_RX | 6)},
|
||||
{P5_7, UART_1, (SCU_PINIO_UART_RX | 4)},
|
||||
{P6_5, UART_0, (SCU_PINIO_UART_RX | 2)},
|
||||
{P7_2, UART_2, (SCU_PINIO_UART_RX | 6)},
|
||||
{P9_4, UART_3, (SCU_PINIO_UART_RX | 7)},
|
||||
{P9_6, UART_0, (SCU_PINIO_UART_RX | 7)},
|
||||
{PA_2, UART_2, (SCU_PINIO_UART_RX | 3)},
|
||||
{PC_14, UART_1, (SCU_PINIO_UART_RX | 2)},
|
||||
{PE_12, UART_1, (SCU_PINIO_UART_RX | 2)},
|
||||
{PF_3, UART_3, (SCU_PINIO_UART_RX | 1)},
|
||||
{PF_11, UART_0, (SCU_PINIO_UART_RX | 1)},
|
||||
{NC, NC, 0}
|
||||
};
|
||||
|
||||
|
|
|
@ -23,48 +23,51 @@
|
|||
#include "pinmap.h"
|
||||
#include "error.h"
|
||||
|
||||
// SCU mode for SPI pins
|
||||
#define SCU_PINIO_SPI SCU_PINIO_FAST
|
||||
|
||||
static const PinMap PinMap_SPI_SCLK[] = {
|
||||
{P1_19, SPI_1, (SCU_PINIO_FAST | 1)},
|
||||
{P3_0, SPI_0, (SCU_PINIO_FAST | 4)},
|
||||
{P3_3, SPI_0, (SCU_PINIO_FAST | 2)},
|
||||
{PF_0, SPI_0, (SCU_PINIO_FAST | 0)},
|
||||
{PF_4, SPI_1, (SCU_PINIO_FAST | 0)},
|
||||
{P1_19, SPI_1, (SCU_PINIO_SPI | 1)},
|
||||
{P3_0, SPI_0, (SCU_PINIO_SPI | 4)},
|
||||
{P3_3, SPI_0, (SCU_PINIO_SPI | 2)},
|
||||
{PF_0, SPI_0, (SCU_PINIO_SPI | 0)},
|
||||
{PF_4, SPI_1, (SCU_PINIO_SPI | 0)},
|
||||
{NC, NC, 0}
|
||||
};
|
||||
|
||||
static const PinMap PinMap_SPI_MOSI[] = {
|
||||
{P0_1, SPI_1, (SCU_PINIO_FAST | 1)},
|
||||
{P1_2, SPI_0, (SCU_PINIO_FAST | 5)},
|
||||
{P1_4, SPI_1, (SCU_PINIO_FAST | 5)},
|
||||
{P3_7, SPI_0, (SCU_PINIO_FAST | 5)},
|
||||
{P3_8, SPI_0, (SCU_PINIO_FAST | 2)},
|
||||
{P9_2, SPI_0, (SCU_PINIO_FAST | 7)},
|
||||
{PF_3, SPI_0, (SCU_PINIO_FAST | 2)},
|
||||
{PF_7, SPI_1, (SCU_PINIO_FAST | 2)},
|
||||
{P0_1, SPI_1, (SCU_PINIO_SPI | 1)},
|
||||
{P1_2, SPI_0, (SCU_PINIO_SPI | 5)},
|
||||
{P1_4, SPI_1, (SCU_PINIO_SPI | 5)},
|
||||
{P3_7, SPI_0, (SCU_PINIO_SPI | 5)},
|
||||
{P3_8, SPI_0, (SCU_PINIO_SPI | 2)},
|
||||
{P9_2, SPI_0, (SCU_PINIO_SPI | 7)},
|
||||
{PF_3, SPI_0, (SCU_PINIO_SPI | 2)},
|
||||
{PF_7, SPI_1, (SCU_PINIO_SPI | 2)},
|
||||
{NC, NC, 0}
|
||||
};
|
||||
|
||||
static const PinMap PinMap_SPI_MISO[] = {
|
||||
{P0_0, SPI_1, (SCU_PINIO_FAST | 1)},
|
||||
{P1_1, SPI_0, (SCU_PINIO_FAST | 5)},
|
||||
{P1_3, SPI_1, (SCU_PINIO_FAST | 5)},
|
||||
{P3_6, SPI_0, (SCU_PINIO_FAST | 5)},
|
||||
{P3_7, SPI_0, (SCU_PINIO_FAST | 2)},
|
||||
{P9_1, SPI_0, (SCU_PINIO_FAST | 7)},
|
||||
{PF_2, SPI_0, (SCU_PINIO_FAST | 2)},
|
||||
{PF_6, SPI_1, (SCU_PINIO_FAST | 2)},
|
||||
{P0_0, SPI_1, (SCU_PINIO_SPI | 1)},
|
||||
{P1_1, SPI_0, (SCU_PINIO_SPI | 5)},
|
||||
{P1_3, SPI_1, (SCU_PINIO_SPI | 5)},
|
||||
{P3_6, SPI_0, (SCU_PINIO_SPI | 5)},
|
||||
{P3_7, SPI_0, (SCU_PINIO_SPI | 2)},
|
||||
{P9_1, SPI_0, (SCU_PINIO_SPI | 7)},
|
||||
{PF_2, SPI_0, (SCU_PINIO_SPI | 2)},
|
||||
{PF_6, SPI_1, (SCU_PINIO_SPI | 2)},
|
||||
{NC, NC, 0}
|
||||
};
|
||||
|
||||
static const PinMap PinMap_SPI_SSEL[] = {
|
||||
{P1_0, SPI_0, (SCU_PINIO_FAST | 5)},
|
||||
{P1_5, SPI_1, (SCU_PINIO_FAST | 5)},
|
||||
{P1_20, SPI_1, (SCU_PINIO_FAST | 2)},
|
||||
{P3_6, SPI_0, (SCU_PINIO_FAST | 2)},
|
||||
{P3_8, SPI_0, (SCU_PINIO_FAST | 5)},
|
||||
{P9_0, SPI_0, (SCU_PINIO_FAST | 7)},
|
||||
{PF_1, SPI_0, (SCU_PINIO_FAST | 2)},
|
||||
{PF_5, SPI_1, (SCU_PINIO_FAST | 2)},
|
||||
{P1_0, SPI_0, (SCU_PINIO_SPI | 5)},
|
||||
{P1_5, SPI_1, (SCU_PINIO_SPI | 5)},
|
||||
{P1_20, SPI_1, (SCU_PINIO_SPI | 2)},
|
||||
{P3_6, SPI_0, (SCU_PINIO_SPI | 2)},
|
||||
{P3_8, SPI_0, (SCU_PINIO_SPI | 5)},
|
||||
{P9_0, SPI_0, (SCU_PINIO_SPI | 7)},
|
||||
{PF_1, SPI_0, (SCU_PINIO_SPI | 2)},
|
||||
{PF_5, SPI_1, (SCU_PINIO_SPI | 2)},
|
||||
{NC, NC, 0}
|
||||
};
|
||||
|
||||
|
@ -82,6 +85,12 @@ void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel
|
|||
|
||||
obj->spi = (LPC_SSP_T*)pinmap_merge(spi_data, spi_cntl);
|
||||
MBED_ASSERT((int)obj->spi != NC);
|
||||
|
||||
// enable clocking
|
||||
switch ((int)obj->spi) {
|
||||
case SPI_0: LPC_CGU->BASE_CLK[CLK_BASE_SSP0] = (1 << 11) | (CLKIN_MAINPLL << 24); break;
|
||||
case SPI_1: LPC_CGU->BASE_CLK[CLK_BASE_SSP1] = (1 << 11) | (CLKIN_MAINPLL << 24); break;
|
||||
}
|
||||
|
||||
// set default format and frequency
|
||||
if (ssel == NC) {
|
||||
|
|
|
@ -38,7 +38,7 @@ OFFICIAL_MBED_LIBRARY_BUILD = (
|
|||
('LPC1114', ('uARM','GCC_ARM')),
|
||||
('LPC11U35_401', ('ARM', 'uARM','GCC_ARM','GCC_CR')),
|
||||
('LPC11U35_501', ('ARM', 'uARM','GCC_ARM','GCC_CR')),
|
||||
('LPC1549', ('uARM','GCC_CR')),
|
||||
('LPC1549', ('uARM','GCC_ARM','GCC_CR')),
|
||||
('XADOW_M0', ('ARM', 'uARM','GCC_ARM','GCC_CR')),
|
||||
('ARCH_GPRS', ('ARM', 'uARM', 'GCC_ARM', 'GCC_CR')),
|
||||
|
||||
|
@ -64,7 +64,7 @@ OFFICIAL_MBED_LIBRARY_BUILD = (
|
|||
('RBLAB_NRF51822', ('ARM', )),
|
||||
|
||||
('LPC11U68', ('uARM','GCC_ARM','GCC_CR')),
|
||||
('GHI_MBUINO', ('ARM', 'uARM', 'GCC_ARM')),
|
||||
('GHI_MBUINO', ('ARM', 'uARM', 'GCC_ARM')),
|
||||
)
|
||||
|
||||
|
||||
|
|
|
@ -49,6 +49,7 @@ build_list = (
|
|||
{ "target": "K64F", "toolchains": "GCC_ARM", "libs": ["dsp", "rtos", "usb", "fat"] },
|
||||
{ "target": "LPC4088", "toolchains": "GCC_ARM", "libs": ["dsp", "rtos", "usb", "fat"] },
|
||||
{ "target": "ARCH_PRO", "toolchains": "GCC_ARM", "libs": ["dsp", "rtos", "fat"] },
|
||||
{ "target": "LPC1549", "toolchains": "GCC_ARM", "libs": ["dsp", "rtos", "fat"] },
|
||||
)
|
||||
|
||||
################################################################################
|
||||
|
@ -59,7 +60,7 @@ def run_builds(dry_run):
|
|||
toolchain_list = build["toolchains"]
|
||||
if type(toolchain_list) != type([]): toolchain_list = [toolchain_list]
|
||||
for toolchain in toolchain_list:
|
||||
cmdline = "python workspace_tools/build.py -m %s -t %s -c " % (build["target"], toolchain)
|
||||
cmdline = "python workspace_tools/build.py -m %s -t %s -j 4 -c " % (build["target"], toolchain)
|
||||
libs = build.get("libs", [])
|
||||
if libs:
|
||||
cmdline = cmdline + " ".join(["--" + l for l in libs])
|
||||
|
|
|
@ -22,6 +22,16 @@ Exporter Toolchain/Platform Support
|
|||
<td>✓</td>
|
||||
<td>✓</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>NXP LPC1549</td>
|
||||
<td>✓</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td>✓</td>
|
||||
<td></td>
|
||||
<td>✓</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>NXP LPC11U24</td>
|
||||
<td></td>
|
||||
|
|
|
@ -0,0 +1,57 @@
|
|||
# This file was automagically generated by mbed.org. For more information,
|
||||
# see http://mbed.org/handbook/Exporting-to-GCC-ARM-Embedded
|
||||
|
||||
GCC_BIN =
|
||||
PROJECT = {{name}}
|
||||
OBJECTS = {% for f in to_be_compiled %}{{f}} {% endfor %}
|
||||
SYS_OBJECTS = {% for f in object_files %}{{f}} {% endfor %}
|
||||
INCLUDE_PATHS = {% for p in include_paths %}-I{{p}} {% endfor %}
|
||||
LIBRARY_PATHS = {% for p in library_paths %}-L{{p}} {% endfor %}
|
||||
LIBRARIES = {% for lib in libraries %}-l{{lib}} {% endfor %}
|
||||
LINKER_SCRIPT = {{linker_script}}
|
||||
|
||||
###############################################################################
|
||||
AS = $(GCC_BIN)arm-none-eabi-as
|
||||
CC = $(GCC_BIN)arm-none-eabi-gcc
|
||||
CPP = $(GCC_BIN)arm-none-eabi-g++
|
||||
LD = $(GCC_BIN)arm-none-eabi-gcc
|
||||
OBJCOPY = $(GCC_BIN)arm-none-eabi-objcopy
|
||||
|
||||
CPU = -mcpu=cortex-m3 -mthumb
|
||||
CC_FLAGS = $(CPU) -c -g -fno-common -fmessage-length=0 -Wall -fno-exceptions -ffunction-sections -fdata-sections
|
||||
CC_FLAGS += -MMD -MP
|
||||
CC_SYMBOLS = {% for s in symbols %}-D{{s}} {% endfor %}
|
||||
|
||||
LD_FLAGS = -mcpu=cortex-m3 -mthumb -Wl,--gc-sections --specs=nano.specs -u _printf_float -u _scanf_float
|
||||
LD_SYS_LIBS = -lstdc++ -lsupc++ -lm -lc -lgcc -lnosys
|
||||
|
||||
ifeq ($(DEBUG), 1)
|
||||
CC_FLAGS += -DDEBUG -O0
|
||||
else
|
||||
CC_FLAGS += -DNDEBUG -Os
|
||||
endif
|
||||
|
||||
all: $(PROJECT).bin
|
||||
|
||||
clean:
|
||||
rm -f $(PROJECT).bin $(PROJECT).elf $(OBJECTS) $(DEPS)
|
||||
|
||||
.s.o:
|
||||
$(AS) $(CPU) -o $@ $<
|
||||
|
||||
.c.o:
|
||||
$(CC) $(CC_FLAGS) $(CC_SYMBOLS) -std=gnu99 $(INCLUDE_PATHS) -o $@ $<
|
||||
|
||||
.cpp.o:
|
||||
$(CPP) $(CC_FLAGS) $(CC_SYMBOLS) -std=gnu++98 $(INCLUDE_PATHS) -o $@ $<
|
||||
|
||||
|
||||
$(PROJECT).elf: $(OBJECTS) $(SYS_OBJECTS)
|
||||
$(LD) $(LD_FLAGS) -T$(LINKER_SCRIPT) $(LIBRARY_PATHS) -o $@ $^ $(LIBRARIES) $(LD_SYS_LIBS) $(LIBRARIES) $(LD_SYS_LIBS)
|
||||
|
||||
$(PROJECT).bin: $(PROJECT).elf
|
||||
$(OBJCOPY) -O binary $< $@
|
||||
|
||||
DEPS = $(OBJECTS:.o=.d) $(SYS_OBJECTS:.o=.d)
|
||||
-include $(DEPS)
|
||||
|
|
@ -23,7 +23,7 @@ CPU = -mcpu=cortex-m0 -mthumb
|
|||
CC_FLAGS = $(CPU) -c -g -fno-common -fmessage-length=0 -Wall -fno-exceptions -ffunction-sections -fdata-sections
|
||||
CC_SYMBOLS = {% for s in symbols %}-D{{s}} {% endfor %}
|
||||
|
||||
LD_FLAGS = -mcpu=cortex-m0 -mthumb -Wl,--gc-sections --specs=nano.specs -u _printf_float -u _scanf_float
|
||||
LD_FLAGS = -mcpu=cortex-m0 -mthumb -Wl,--gc-sections -Wl,--wrap=main --specs=nano.specs -u _printf_float -u _scanf_float
|
||||
LD_SYS_LIBS = -lstdc++ -lsupc++ -lm -lc -lgcc -lnosys
|
||||
|
||||
ifeq ($(DEBUG), 1)
|
||||
|
|
|
@ -24,6 +24,7 @@ class GccArm(Exporter):
|
|||
|
||||
TARGETS = [
|
||||
'LPC1768',
|
||||
'LPC1549',
|
||||
'KL05Z',
|
||||
'KL25Z',
|
||||
'KL46Z',
|
||||
|
|
|
@ -50,6 +50,7 @@ class Uvision4(Exporter):
|
|||
'NRF51822',
|
||||
'ARCH_PRO',
|
||||
'ARCH_BLE',
|
||||
'DISCO_F407VG',
|
||||
]
|
||||
|
||||
USING_MICROLIB = [
|
||||
|
|
|
@ -0,0 +1,210 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
|
||||
<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd">
|
||||
|
||||
<SchemaVersion>1.0</SchemaVersion>
|
||||
|
||||
<Header>### uVision Project, (C) Keil Software</Header>
|
||||
|
||||
<Extensions>
|
||||
<cExt>*.c</cExt>
|
||||
<aExt>*.s*; *.src; *.a*</aExt>
|
||||
<oExt>*.obj</oExt>
|
||||
<lExt>*.lib</lExt>
|
||||
<tExt>*.txt; *.h; *.inc</tExt>
|
||||
<pExt>*.plm</pExt>
|
||||
<CppX>*.cpp</CppX>
|
||||
</Extensions>
|
||||
|
||||
<DaveTm>
|
||||
<dwLowDateTime>0</dwLowDateTime>
|
||||
<dwHighDateTime>0</dwHighDateTime>
|
||||
</DaveTm>
|
||||
|
||||
<Target>
|
||||
<TargetName>STM32F407</TargetName>
|
||||
<ToolsetNumber>0x4</ToolsetNumber>
|
||||
<ToolsetName>ARM-ADS</ToolsetName>
|
||||
<TargetOption>
|
||||
<CLKADS>25000000</CLKADS>
|
||||
<OPTTT>
|
||||
<gFlags>1</gFlags>
|
||||
<BeepAtEnd>1</BeepAtEnd>
|
||||
<RunSim>1</RunSim>
|
||||
<RunTarget>0</RunTarget>
|
||||
</OPTTT>
|
||||
<OPTHX>
|
||||
<HexSelection>1</HexSelection>
|
||||
<FlashByte>65535</FlashByte>
|
||||
<HexRangeLowAddress>0</HexRangeLowAddress>
|
||||
<HexRangeHighAddress>0</HexRangeHighAddress>
|
||||
<HexOffset>0</HexOffset>
|
||||
</OPTHX>
|
||||
<OPTLEX>
|
||||
<PageWidth>79</PageWidth>
|
||||
<PageLength>66</PageLength>
|
||||
<TabStop>8</TabStop>
|
||||
<ListingPath>.\build\</ListingPath>
|
||||
</OPTLEX>
|
||||
<ListingPage>
|
||||
<CreateCListing>1</CreateCListing>
|
||||
<CreateAListing>1</CreateAListing>
|
||||
<CreateLListing>1</CreateLListing>
|
||||
<CreateIListing>0</CreateIListing>
|
||||
<AsmCond>1</AsmCond>
|
||||
<AsmSymb>1</AsmSymb>
|
||||
<AsmXref>0</AsmXref>
|
||||
<CCond>1</CCond>
|
||||
<CCode>0</CCode>
|
||||
<CListInc>0</CListInc>
|
||||
<CSymb>0</CSymb>
|
||||
<LinkerCodeListing>0</LinkerCodeListing>
|
||||
</ListingPage>
|
||||
<OPTXL>
|
||||
<LMap>1</LMap>
|
||||
<LComments>1</LComments>
|
||||
<LGenerateSymbols>1</LGenerateSymbols>
|
||||
<LLibSym>1</LLibSym>
|
||||
<LLines>1</LLines>
|
||||
<LLocSym>1</LLocSym>
|
||||
<LPubSym>1</LPubSym>
|
||||
<LXref>0</LXref>
|
||||
<LExpSel>0</LExpSel>
|
||||
</OPTXL>
|
||||
<OPTFL>
|
||||
<tvExp>1</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<IsCurrentTarget>1</IsCurrentTarget>
|
||||
</OPTFL>
|
||||
<CpuCode>255</CpuCode>
|
||||
<Books>
|
||||
<Book>
|
||||
<Number>0</Number>
|
||||
<Title>Datasheet</Title>
|
||||
<Path>DATASHTS\ST\STM32F4xx\DM00037051.pdf</Path>
|
||||
</Book>
|
||||
<Book>
|
||||
<Number>1</Number>
|
||||
<Title>Reference Manual</Title>
|
||||
<Path>DATASHTS\ST\STM32F4xx\DM00031020.pdf</Path>
|
||||
</Book>
|
||||
<Book>
|
||||
<Number>2</Number>
|
||||
<Title>Technical Reference Manual</Title>
|
||||
<Path>datashts\arm\cortex_m4\r0p1\DDI0439C_CORTEX_M4_R0P1_TRM.PDF</Path>
|
||||
</Book>
|
||||
<Book>
|
||||
<Number>3</Number>
|
||||
<Title>Generic User Guide</Title>
|
||||
<Path>datashts\arm\cortex_m4\r0p1\DUI0553A_CORTEX_M4_DGUG.PDF</Path>
|
||||
</Book>
|
||||
</Books>
|
||||
<DllOpt>
|
||||
<SimDllName>SARMCM3.DLL</SimDllName>
|
||||
<SimDllArguments>-MPU -REMAP</SimDllArguments>
|
||||
<SimDlgDllName>DCM.DLL</SimDlgDllName>
|
||||
<SimDlgDllArguments>-pCM4</SimDlgDllArguments>
|
||||
<TargetDllName>SARMCM3.DLL</TargetDllName>
|
||||
<TargetDllArguments>-MPU</TargetDllArguments>
|
||||
<TargetDlgDllName>TCM.DLL</TargetDlgDllName>
|
||||
<TargetDlgDllArguments>-pCM4</TargetDlgDllArguments>
|
||||
</DllOpt>
|
||||
<DebugOpt>
|
||||
<uSim>0</uSim>
|
||||
<uTrg>1</uTrg>
|
||||
<sLdApp>1</sLdApp>
|
||||
<sGomain>1</sGomain>
|
||||
<sRbreak>1</sRbreak>
|
||||
<sRwatch>1</sRwatch>
|
||||
<sRmem>1</sRmem>
|
||||
<sRfunc>1</sRfunc>
|
||||
<sRbox>1</sRbox>
|
||||
<tLdApp>1</tLdApp>
|
||||
<tGomain>1</tGomain>
|
||||
<tRbreak>1</tRbreak>
|
||||
<tRwatch>1</tRwatch>
|
||||
<tRmem>1</tRmem>
|
||||
<tRfunc>0</tRfunc>
|
||||
<tRbox>1</tRbox>
|
||||
<tRtrace>0</tRtrace>
|
||||
<sRunDeb>0</sRunDeb>
|
||||
<sLrtime>0</sLrtime>
|
||||
<nTsel>13</nTsel>
|
||||
<sDll></sDll>
|
||||
<sDllPa></sDllPa>
|
||||
<sDlgDll></sDlgDll>
|
||||
<sDlgPa></sDlgPa>
|
||||
<sIfile></sIfile>
|
||||
<tDll></tDll>
|
||||
<tDllPa></tDllPa>
|
||||
<tDlgDll></tDlgDll>
|
||||
<tDlgPa></tDlgPa>
|
||||
<tIfile></tIfile>
|
||||
<pMon>BIN\CMSIS_AGDI.dll</pMon>
|
||||
</DebugOpt>
|
||||
<TargetDriverDllRegistry>
|
||||
<SetRegEntry>
|
||||
<Number>0</Number>
|
||||
<Key>CMSIS_AGDI</Key>
|
||||
<Name>-X"MBED CMSIS-DAP" -UA000000001 -O4559 -S0 -C0 -P00 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -FO15 -FD20000000 -FC800 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000</Name>
|
||||
</SetRegEntry>
|
||||
</TargetDriverDllRegistry>
|
||||
<Breakpoint/>
|
||||
<DebugFlag>
|
||||
<trace>0</trace>
|
||||
<periodic>0</periodic>
|
||||
<aLwin>0</aLwin>
|
||||
<aCover>0</aCover>
|
||||
<aSer1>0</aSer1>
|
||||
<aSer2>0</aSer2>
|
||||
<aPa>0</aPa>
|
||||
<viewmode>1</viewmode>
|
||||
<vrSel>0</vrSel>
|
||||
<aSym>0</aSym>
|
||||
<aTbox>0</aTbox>
|
||||
<AscS1>0</AscS1>
|
||||
<AscS2>0</AscS2>
|
||||
<AscS3>0</AscS3>
|
||||
<aSer3>0</aSer3>
|
||||
<eProf>0</eProf>
|
||||
<aLa>0</aLa>
|
||||
<aPa1>0</aPa1>
|
||||
<AscS4>0</AscS4>
|
||||
<aSer4>0</aSer4>
|
||||
<StkLoc>0</StkLoc>
|
||||
<TrcWin>0</TrcWin>
|
||||
<newCpu>0</newCpu>
|
||||
<uProt>0</uProt>
|
||||
</DebugFlag>
|
||||
<Tracepoint>
|
||||
<THDelay>0</THDelay>
|
||||
</Tracepoint>
|
||||
<LintExecutable></LintExecutable>
|
||||
<LintConfigFile></LintConfigFile>
|
||||
</TargetOption>
|
||||
</Target>
|
||||
|
||||
<Group>
|
||||
<GroupName>src</GroupName>
|
||||
<tvExp>1</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<cbSel>0</cbSel>
|
||||
<RteFlg>0</RteFlg>
|
||||
<File>
|
||||
<GroupNumber>1</GroupNumber>
|
||||
<FileNumber>1</FileNumber>
|
||||
<FileType>8</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<Focus>0</Focus>
|
||||
<ColumnNumber>1</ColumnNumber>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<TopLine>1</TopLine>
|
||||
<CurrentLine>18</CurrentLine>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>main.cpp</PathWithFileName>
|
||||
<FilenameWithoutPath>main.cpp</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
</Group>
|
||||
|
||||
</ProjectOpt>
|
|
@ -0,0 +1,425 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
|
||||
<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
|
||||
|
||||
<SchemaVersion>1.1</SchemaVersion>
|
||||
|
||||
<Header>###This file was automagically generated by mbed.org. For more information, see http://mbed.org/handbook/Exporting-To-Uvision </Header>
|
||||
|
||||
<Targets>
|
||||
<Target>
|
||||
<TargetName>STM32F407</TargetName>
|
||||
<ToolsetNumber>0x4</ToolsetNumber>
|
||||
<ToolsetName>ARM-ADS</ToolsetName>
|
||||
<TargetOption>
|
||||
<TargetCommonOption>
|
||||
<Device>STM32F407VG</Device>
|
||||
<Vendor>STMicroelectronics</Vendor>
|
||||
<Cpu>IRAM(0x20000000-0x2001FFFF) IRAM2(0x10000000-0x1000FFFF) IROM(0x8000000-0x80FFFFF) CLOCK(25000000) CPUTYPE("Cortex-M4") FPU2</Cpu>
|
||||
<FlashUtilSpec></FlashUtilSpec>
|
||||
<StartupFile>"Startup\ST\STM32F4xx\startup_stm32f4xx.s" ("STM32F4xx Startup Code")</StartupFile>
|
||||
<FlashDriverDll>UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000)</FlashDriverDll>
|
||||
<DeviceId>6103</DeviceId>
|
||||
<RegisterFile>stm32f4xx.h</RegisterFile>
|
||||
<MemoryEnv></MemoryEnv>
|
||||
<Cmp></Cmp>
|
||||
<Asm></Asm>
|
||||
<Linker></Linker>
|
||||
<OHString></OHString>
|
||||
<InfinionOptionDll></InfinionOptionDll>
|
||||
<SLE66CMisc></SLE66CMisc>
|
||||
<SLE66AMisc></SLE66AMisc>
|
||||
<SLE66LinkerMisc></SLE66LinkerMisc>
|
||||
<SFDFile>SFD\ST\STM32F4xx\STM32F40x.sfr</SFDFile>
|
||||
<UseEnv>0</UseEnv>
|
||||
<BinPath></BinPath>
|
||||
<IncludePath></IncludePath>
|
||||
<LibPath></LibPath>
|
||||
<RegisterFilePath>ST\STM32F4xx\</RegisterFilePath>
|
||||
<DBRegisterFilePath>ST\STM32F4xx\</DBRegisterFilePath>
|
||||
<TargetStatus>
|
||||
<Error>0</Error>
|
||||
<ExitCodeStop>0</ExitCodeStop>
|
||||
<ButtonStop>0</ButtonStop>
|
||||
<NotGenerated>0</NotGenerated>
|
||||
<InvalidFlash>1</InvalidFlash>
|
||||
</TargetStatus>
|
||||
<OutputDirectory>.\build\</OutputDirectory>
|
||||
<OutputName>{{name}}</OutputName>
|
||||
<CreateExecutable>1</CreateExecutable>
|
||||
<CreateLib>0</CreateLib>
|
||||
<CreateHexFile>0</CreateHexFile>
|
||||
<DebugInformation>1</DebugInformation>
|
||||
<BrowseInformation>1</BrowseInformation>
|
||||
<ListingPath>.\build\</ListingPath>
|
||||
<HexFormatSelection>1</HexFormatSelection>
|
||||
<Merge32K>0</Merge32K>
|
||||
<CreateBatchFile>0</CreateBatchFile>
|
||||
<BeforeCompile>
|
||||
<RunUserProg1>0</RunUserProg1>
|
||||
<RunUserProg2>0</RunUserProg2>
|
||||
<UserProg1Name></UserProg1Name>
|
||||
<UserProg2Name></UserProg2Name>
|
||||
<UserProg1Dos16Mode>0</UserProg1Dos16Mode>
|
||||
<UserProg2Dos16Mode>0</UserProg2Dos16Mode>
|
||||
<nStopU1X>0</nStopU1X>
|
||||
<nStopU2X>0</nStopU2X>
|
||||
</BeforeCompile>
|
||||
<BeforeMake>
|
||||
<RunUserProg1>0</RunUserProg1>
|
||||
<RunUserProg2>0</RunUserProg2>
|
||||
<UserProg1Name></UserProg1Name>
|
||||
<UserProg2Name></UserProg2Name>
|
||||
<UserProg1Dos16Mode>0</UserProg1Dos16Mode>
|
||||
<UserProg2Dos16Mode>0</UserProg2Dos16Mode>
|
||||
</BeforeMake>
|
||||
<AfterMake>
|
||||
<RunUserProg1>1</RunUserProg1>
|
||||
<RunUserProg2>0</RunUserProg2>
|
||||
<UserProg1Name>fromelf --bin -o build\{{name}}_STM32F407.bin build\{{name}}.axf</UserProg1Name>
|
||||
<UserProg2Name></UserProg2Name>
|
||||
<UserProg1Dos16Mode>0</UserProg1Dos16Mode>
|
||||
<UserProg2Dos16Mode>0</UserProg2Dos16Mode>
|
||||
</AfterMake>
|
||||
<SelectedForBatchBuild>0</SelectedForBatchBuild>
|
||||
<SVCSIdString></SVCSIdString>
|
||||
</TargetCommonOption>
|
||||
<CommonProperty>
|
||||
<UseCPPCompiler>0</UseCPPCompiler>
|
||||
<RVCTCodeConst>0</RVCTCodeConst>
|
||||
<RVCTZI>0</RVCTZI>
|
||||
<RVCTOtherData>0</RVCTOtherData>
|
||||
<ModuleSelection>0</ModuleSelection>
|
||||
<IncludeInBuild>1</IncludeInBuild>
|
||||
<AlwaysBuild>0</AlwaysBuild>
|
||||
<GenerateAssemblyFile>0</GenerateAssemblyFile>
|
||||
<AssembleAssemblyFile>0</AssembleAssemblyFile>
|
||||
<PublicsOnly>0</PublicsOnly>
|
||||
<StopOnExitCode>3</StopOnExitCode>
|
||||
<CustomArgument></CustomArgument>
|
||||
<IncludeLibraryModules></IncludeLibraryModules>
|
||||
</CommonProperty>
|
||||
<DllOption>
|
||||
<SimDllName>SARMCM3.DLL</SimDllName>
|
||||
<SimDllArguments>-MPU -REMAP</SimDllArguments>
|
||||
<SimDlgDll>DCM.DLL</SimDlgDll>
|
||||
<SimDlgDllArguments>-pCM4</SimDlgDllArguments>
|
||||
<TargetDllName>SARMCM3.DLL</TargetDllName>
|
||||
<TargetDllArguments>-MPU</TargetDllArguments>
|
||||
<TargetDlgDll>TCM.DLL</TargetDlgDll>
|
||||
<TargetDlgDllArguments>-pCM4</TargetDlgDllArguments>
|
||||
</DllOption>
|
||||
<DebugOption>
|
||||
<OPTHX>
|
||||
<HexSelection>1</HexSelection>
|
||||
<HexRangeLowAddress>0</HexRangeLowAddress>
|
||||
<HexRangeHighAddress>0</HexRangeHighAddress>
|
||||
<HexOffset>0</HexOffset>
|
||||
<Oh166RecLen>16</Oh166RecLen>
|
||||
</OPTHX>
|
||||
<Simulator>
|
||||
<UseSimulator>0</UseSimulator>
|
||||
<LoadApplicationAtStartup>1</LoadApplicationAtStartup>
|
||||
<RunToMain>1</RunToMain>
|
||||
<RestoreBreakpoints>1</RestoreBreakpoints>
|
||||
<RestoreWatchpoints>1</RestoreWatchpoints>
|
||||
<RestoreMemoryDisplay>1</RestoreMemoryDisplay>
|
||||
<RestoreFunctions>1</RestoreFunctions>
|
||||
<RestoreToolbox>1</RestoreToolbox>
|
||||
<LimitSpeedToRealTime>0</LimitSpeedToRealTime>
|
||||
</Simulator>
|
||||
<Target>
|
||||
<UseTarget>1</UseTarget>
|
||||
<LoadApplicationAtStartup>1</LoadApplicationAtStartup>
|
||||
<RunToMain>1</RunToMain>
|
||||
<RestoreBreakpoints>1</RestoreBreakpoints>
|
||||
<RestoreWatchpoints>1</RestoreWatchpoints>
|
||||
<RestoreMemoryDisplay>1</RestoreMemoryDisplay>
|
||||
<RestoreFunctions>0</RestoreFunctions>
|
||||
<RestoreToolbox>1</RestoreToolbox>
|
||||
<RestoreTracepoints>0</RestoreTracepoints>
|
||||
</Target>
|
||||
<RunDebugAfterBuild>0</RunDebugAfterBuild>
|
||||
<TargetSelection>13</TargetSelection>
|
||||
<SimDlls>
|
||||
<CpuDll></CpuDll>
|
||||
<CpuDllArguments></CpuDllArguments>
|
||||
<PeripheralDll></PeripheralDll>
|
||||
<PeripheralDllArguments></PeripheralDllArguments>
|
||||
<InitializationFile></InitializationFile>
|
||||
</SimDlls>
|
||||
<TargetDlls>
|
||||
<CpuDll></CpuDll>
|
||||
<CpuDllArguments></CpuDllArguments>
|
||||
<PeripheralDll></PeripheralDll>
|
||||
<PeripheralDllArguments></PeripheralDllArguments>
|
||||
<InitializationFile></InitializationFile>
|
||||
<Driver>BIN\CMSIS_AGDI.dll</Driver>
|
||||
</TargetDlls>
|
||||
</DebugOption>
|
||||
<Utilities>
|
||||
<Flash1>
|
||||
<UseTargetDll>1</UseTargetDll>
|
||||
<UseExternalTool>0</UseExternalTool>
|
||||
<RunIndependent>0</RunIndependent>
|
||||
<UpdateFlashBeforeDebugging>1</UpdateFlashBeforeDebugging>
|
||||
<Capability>1</Capability>
|
||||
<DriverSelection>4105</DriverSelection>
|
||||
</Flash1>
|
||||
<Flash2>BIN\CMSIS_AGDI.dll</Flash2>
|
||||
<Flash3>"" ()</Flash3>
|
||||
<Flash4></Flash4>
|
||||
</Utilities>
|
||||
<TargetArmAds>
|
||||
<ArmAdsMisc>
|
||||
<GenerateListings>0</GenerateListings>
|
||||
<asHll>1</asHll>
|
||||
<asAsm>1</asAsm>
|
||||
<asMacX>1</asMacX>
|
||||
<asSyms>1</asSyms>
|
||||
<asFals>1</asFals>
|
||||
<asDbgD>1</asDbgD>
|
||||
<asForm>1</asForm>
|
||||
<ldLst>0</ldLst>
|
||||
<ldmm>1</ldmm>
|
||||
<ldXref>1</ldXref>
|
||||
<BigEnd>0</BigEnd>
|
||||
<AdsALst>1</AdsALst>
|
||||
<AdsACrf>1</AdsACrf>
|
||||
<AdsANop>0</AdsANop>
|
||||
<AdsANot>0</AdsANot>
|
||||
<AdsLLst>1</AdsLLst>
|
||||
<AdsLmap>1</AdsLmap>
|
||||
<AdsLcgr>1</AdsLcgr>
|
||||
<AdsLsym>1</AdsLsym>
|
||||
<AdsLszi>1</AdsLszi>
|
||||
<AdsLtoi>1</AdsLtoi>
|
||||
<AdsLsun>1</AdsLsun>
|
||||
<AdsLven>1</AdsLven>
|
||||
<AdsLsxf>1</AdsLsxf>
|
||||
<RvctClst>0</RvctClst>
|
||||
<GenPPlst>0</GenPPlst>
|
||||
<AdsCpuType>"Cortex-M4"</AdsCpuType>
|
||||
<RvctDeviceName></RvctDeviceName>
|
||||
<mOS>0</mOS>
|
||||
<uocRom>0</uocRom>
|
||||
<uocRam>0</uocRam>
|
||||
<hadIROM>1</hadIROM>
|
||||
<hadIRAM>1</hadIRAM>
|
||||
<hadXRAM>0</hadXRAM>
|
||||
<uocXRam>0</uocXRam>
|
||||
<RvdsVP>2</RvdsVP>
|
||||
<hadIRAM2>1</hadIRAM2>
|
||||
<hadIROM2>0</hadIROM2>
|
||||
<StupSel>8</StupSel>
|
||||
<useUlib>0</useUlib>
|
||||
<EndSel>0</EndSel>
|
||||
<uLtcg>0</uLtcg>
|
||||
<RoSelD>3</RoSelD>
|
||||
<RwSelD>3</RwSelD>
|
||||
<CodeSel>0</CodeSel>
|
||||
<OptFeed>0</OptFeed>
|
||||
<NoZi1>0</NoZi1>
|
||||
<NoZi2>0</NoZi2>
|
||||
<NoZi3>0</NoZi3>
|
||||
<NoZi4>0</NoZi4>
|
||||
<NoZi5>0</NoZi5>
|
||||
<Ro1Chk>0</Ro1Chk>
|
||||
<Ro2Chk>0</Ro2Chk>
|
||||
<Ro3Chk>0</Ro3Chk>
|
||||
<Ir1Chk>1</Ir1Chk>
|
||||
<Ir2Chk>0</Ir2Chk>
|
||||
<Ra1Chk>0</Ra1Chk>
|
||||
<Ra2Chk>0</Ra2Chk>
|
||||
<Ra3Chk>0</Ra3Chk>
|
||||
<Im1Chk>1</Im1Chk>
|
||||
<Im2Chk>0</Im2Chk>
|
||||
<OnChipMemories>
|
||||
<Ocm1>
|
||||
<Type>0</Type>
|
||||
<StartAddress>0x0</StartAddress>
|
||||
<Size>0x0</Size>
|
||||
</Ocm1>
|
||||
<Ocm2>
|
||||
<Type>0</Type>
|
||||
<StartAddress>0x0</StartAddress>
|
||||
<Size>0x0</Size>
|
||||
</Ocm2>
|
||||
<Ocm3>
|
||||
<Type>0</Type>
|
||||
<StartAddress>0x0</StartAddress>
|
||||
<Size>0x0</Size>
|
||||
</Ocm3>
|
||||
<Ocm4>
|
||||
<Type>0</Type>
|
||||
<StartAddress>0x0</StartAddress>
|
||||
<Size>0x0</Size>
|
||||
</Ocm4>
|
||||
<Ocm5>
|
||||
<Type>0</Type>
|
||||
<StartAddress>0x0</StartAddress>
|
||||
<Size>0x0</Size>
|
||||
</Ocm5>
|
||||
<Ocm6>
|
||||
<Type>0</Type>
|
||||
<StartAddress>0x0</StartAddress>
|
||||
<Size>0x0</Size>
|
||||
</Ocm6>
|
||||
<IRAM>
|
||||
<Type>0</Type>
|
||||
<StartAddress>0x20000000</StartAddress>
|
||||
<Size>0x20000</Size>
|
||||
</IRAM>
|
||||
<IROM>
|
||||
<Type>1</Type>
|
||||
<StartAddress>0x8000000</StartAddress>
|
||||
<Size>0x100000</Size>
|
||||
</IROM>
|
||||
<XRAM>
|
||||
<Type>0</Type>
|
||||
<StartAddress>0x0</StartAddress>
|
||||
<Size>0x0</Size>
|
||||
</XRAM>
|
||||
<OCR_RVCT1>
|
||||
<Type>1</Type>
|
||||
<StartAddress>0x0</StartAddress>
|
||||
<Size>0x0</Size>
|
||||
</OCR_RVCT1>
|
||||
<OCR_RVCT2>
|
||||
<Type>1</Type>
|
||||
<StartAddress>0x0</StartAddress>
|
||||
<Size>0x0</Size>
|
||||
</OCR_RVCT2>
|
||||
<OCR_RVCT3>
|
||||
<Type>1</Type>
|
||||
<StartAddress>0x0</StartAddress>
|
||||
<Size>0x0</Size>
|
||||
</OCR_RVCT3>
|
||||
<OCR_RVCT4>
|
||||
<Type>1</Type>
|
||||
<StartAddress>0x8000000</StartAddress>
|
||||
<Size>0x100000</Size>
|
||||
</OCR_RVCT4>
|
||||
<OCR_RVCT5>
|
||||
<Type>1</Type>
|
||||
<StartAddress>0x0</StartAddress>
|
||||
<Size>0x0</Size>
|
||||
</OCR_RVCT5>
|
||||
<OCR_RVCT6>
|
||||
<Type>0</Type>
|
||||
<StartAddress>0x0</StartAddress>
|
||||
<Size>0x0</Size>
|
||||
</OCR_RVCT6>
|
||||
<OCR_RVCT7>
|
||||
<Type>0</Type>
|
||||
<StartAddress>0x0</StartAddress>
|
||||
<Size>0x0</Size>
|
||||
</OCR_RVCT7>
|
||||
<OCR_RVCT8>
|
||||
<Type>0</Type>
|
||||
<StartAddress>0x0</StartAddress>
|
||||
<Size>0x0</Size>
|
||||
</OCR_RVCT8>
|
||||
<OCR_RVCT9>
|
||||
<Type>0</Type>
|
||||
<StartAddress>0x20000000</StartAddress>
|
||||
<Size>0x20000</Size>
|
||||
</OCR_RVCT9>
|
||||
<OCR_RVCT10>
|
||||
<Type>0</Type>
|
||||
<StartAddress>0x10000000</StartAddress>
|
||||
<Size>0x10000</Size>
|
||||
</OCR_RVCT10>
|
||||
</OnChipMemories>
|
||||
<RvctStartVector></RvctStartVector>
|
||||
</ArmAdsMisc>
|
||||
<Cads>
|
||||
<interw>1</interw>
|
||||
<Optim>1</Optim>
|
||||
<oTime>0</oTime>
|
||||
<SplitLS>0</SplitLS>
|
||||
<OneElfS>0</OneElfS>
|
||||
<Strict>0</Strict>
|
||||
<EnumInt>0</EnumInt>
|
||||
<PlainCh>0</PlainCh>
|
||||
<Ropi>0</Ropi>
|
||||
<Rwpi>0</Rwpi>
|
||||
<wLevel>0</wLevel>
|
||||
<uThumb>0</uThumb>
|
||||
<uSurpInc>0</uSurpInc>
|
||||
<VariousControls>
|
||||
<MiscControls>--gnu</MiscControls>
|
||||
<Define>{% for s in symbols %} {{s}}, {% endfor %}</Define>
|
||||
<Undefine></Undefine>
|
||||
<IncludePath> {% for path in include_paths %} {{path}}; {% endfor %} </IncludePath>
|
||||
</VariousControls>
|
||||
</Cads>
|
||||
<Aads>
|
||||
<interw>1</interw>
|
||||
<Ropi>0</Ropi>
|
||||
<Rwpi>0</Rwpi>
|
||||
<thumb>0</thumb>
|
||||
<SplitLS>0</SplitLS>
|
||||
<SwStkChk>0</SwStkChk>
|
||||
<NoWarn>0</NoWarn>
|
||||
<uSurpInc>0</uSurpInc>
|
||||
<VariousControls>
|
||||
<MiscControls></MiscControls>
|
||||
<Define></Define>
|
||||
<Undefine></Undefine>
|
||||
<IncludePath></IncludePath>
|
||||
</VariousControls>
|
||||
</Aads>
|
||||
<LDads>
|
||||
<umfTarg>0</umfTarg>
|
||||
<Ropi>0</Ropi>
|
||||
<Rwpi>0</Rwpi>
|
||||
<noStLib>0</noStLib>
|
||||
<RepFail>1</RepFail>
|
||||
<useFile>0</useFile>
|
||||
<TextAddressRange>0x00000000</TextAddressRange>
|
||||
<DataAddressRange>0x10000000</DataAddressRange>
|
||||
<ScatterFile>{{scatter_file}}</ScatterFile>
|
||||
<IncludeLibs></IncludeLibs>
|
||||
<IncludeLibsPath></IncludeLibsPath>
|
||||
<Misc>
|
||||
{% for file in object_files %}
|
||||
{{file}}
|
||||
{% endfor %}
|
||||
--any_placement=first_fit
|
||||
</Misc>
|
||||
<LinkerInputFile></LinkerInputFile>
|
||||
<DisabledWarnings></DisabledWarnings>
|
||||
</LDads>
|
||||
</TargetArmAds>
|
||||
</TargetOption>
|
||||
<Groups>
|
||||
{% for group,files in source_files %}
|
||||
<Group>
|
||||
<GroupName>{{group}}</GroupName>
|
||||
<Files>
|
||||
{% for file in files %}
|
||||
<File>
|
||||
<FileName>{{file.name}}</FileName>
|
||||
<FileType>{{file.type}}</FileType>
|
||||
<FilePath>{{file.path}}</FilePath>
|
||||
{%if file.type == "1" %}
|
||||
<FileOption>
|
||||
<FileArmAds>
|
||||
<Cads>
|
||||
<VariousControls>
|
||||
<MiscControls>--c99</MiscControls>
|
||||
</VariousControls>
|
||||
</Cads>
|
||||
</FileArmAds>
|
||||
</FileOption>
|
||||
{% endif %}
|
||||
</File>
|
||||
{% endfor %}
|
||||
</Files>
|
||||
</Group>
|
||||
{% endfor %}
|
||||
</Groups>
|
||||
</Target>
|
||||
</Targets>
|
||||
|
||||
</Project>
|
|
@ -125,7 +125,7 @@
|
|||
<SetRegEntry>
|
||||
<Number>0</Number>
|
||||
<Key>JL2CM3</Key>
|
||||
<Name>-U480204337 -O78 -S0 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(0BB11477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8004 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO31 -FD20000000 -FC800 -FN1 -FF0nrf51xxx.flm -FS00 -FL0200000 -FP0($$Device:nRF51822_xxAA$Flash\nrf51xxx.flm)</Name>
|
||||
<Name>-U480204337 -O78 -S0 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(0BB11477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8004 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO31 -FD20000000 -FC2000 -FN1 -FF0nrf51xxx.flm -FS00 -FL0200000 -FP0($$Device:nRF51822_xxAA$Flash\nrf51xxx.flm)</Name>
|
||||
</SetRegEntry>
|
||||
<SetRegEntry>
|
||||
<Number>0</Number>
|
||||
|
|
|
@ -76,7 +76,7 @@
|
|||
<AfterMake>
|
||||
<RunUserProg1>1</RunUserProg1>
|
||||
<RunUserProg2>0</RunUserProg2>
|
||||
<UserProg1Name>mergehex -m !H {% for hex in hex_files %} {{hex}} {% endfor %} -o $H@H.hex</UserProg1Name>
|
||||
<UserProg1Name></UserProg1Name>
|
||||
<UserProg2Name></UserProg2Name>
|
||||
<UserProg1Dos16Mode>0</UserProg1Dos16Mode>
|
||||
<UserProg2Dos16Mode>0</UserProg2Dos16Mode>
|
||||
|
|
|
@ -108,6 +108,7 @@ if __name__ == '__main__':
|
|||
# Linux path: /home/emimon01/bin/gcc-arm/bin/
|
||||
# Windows path: C:/arm-none-eabi-gcc-4_7/bin/
|
||||
('gcc_arm', 'LPC1768'),
|
||||
('gcc_arm', 'LPC1549'),
|
||||
('gcc_arm', 'LPC1114'),
|
||||
('gcc_arm', 'LPC11U35_401'),
|
||||
('gcc_arm', 'LPC11U35_501'),
|
||||
|
|
|
@ -29,7 +29,7 @@ class EchoTest(Test):
|
|||
TEST="longer serial test"
|
||||
check = True
|
||||
for i in range(1, 100):
|
||||
self.mbed.serial.write(TEST + "\n")
|
||||
self.mbed.serial_write(TEST + "\n")
|
||||
l = self.mbed.serial.readline().strip()
|
||||
if not l: continue
|
||||
|
||||
|
|
|
@ -28,8 +28,7 @@ from time import sleep
|
|||
from sys import stdout
|
||||
|
||||
class Mbed:
|
||||
"""
|
||||
Base class for a host driven test
|
||||
""" Base class for a host driven test
|
||||
"""
|
||||
def __init__(self):
|
||||
parser = OptionParser()
|
||||
|
@ -63,8 +62,17 @@ class Mbed:
|
|||
dest="forced_reset_type",
|
||||
help="Forces different type of reset")
|
||||
|
||||
parser.add_option("-R", "--reset-timeout",
|
||||
dest="forced_reset_timeout",
|
||||
metavar="NUMBER",
|
||||
type="int",
|
||||
help="When forcing a reset using option -r you can set up after reset timeout in seconds")
|
||||
|
||||
(self.options, _) = parser.parse_args()
|
||||
|
||||
self.DEFAULT_RESET_TOUT = 2
|
||||
self.DEFAULT_TOUT = 10
|
||||
|
||||
if self.options.port is None:
|
||||
raise Exception("The serial port of the target mbed have to be provided as command line arguments")
|
||||
|
||||
|
@ -73,10 +81,12 @@ class Mbed:
|
|||
self.extra_port = self.options.extra
|
||||
self.extra_serial = None
|
||||
self.serial = None
|
||||
self.timeout = 10 if self.options.timeout is None else self.options.timeout
|
||||
print 'Mbed: "%s" "%s"' % (self.port, self.disk)
|
||||
self.timeout = self.DEFAULT_TOUT if self.options.timeout is None else self.options.timeout
|
||||
print 'Host test instrumentation on port: "%s" with serial: "%s"' % (self.port, self.disk)
|
||||
|
||||
def init_serial(self, baud=9600, extra_baud=9600):
|
||||
""" Initialize serial port. Function will return error is port can't be opened or initialized
|
||||
"""
|
||||
result = True
|
||||
try:
|
||||
self.serial = Serial(self.port, timeout=1)
|
||||
|
@ -91,8 +101,18 @@ class Mbed:
|
|||
self.flush()
|
||||
return result
|
||||
|
||||
def serial_timeout(self, timeout):
|
||||
""" Wraps self.mbed.serial object timeout property
|
||||
"""
|
||||
result = None
|
||||
if self.serial:
|
||||
self.serial.timeout = timeout
|
||||
result = True
|
||||
return result
|
||||
|
||||
def serial_read(self, count=1):
|
||||
""" Wraps self.mbed.serial object read method """
|
||||
""" Wraps self.mbed.serial object read method
|
||||
"""
|
||||
result = None
|
||||
if self.serial:
|
||||
try:
|
||||
|
@ -102,23 +122,24 @@ class Mbed:
|
|||
return result
|
||||
|
||||
def serial_write(self, write_buffer):
|
||||
""" Wraps self.mbed.serial object write method """
|
||||
result = -1
|
||||
""" Wraps self.mbed.serial object write method
|
||||
"""
|
||||
result = None
|
||||
if self.serial:
|
||||
try:
|
||||
result = self.serial.write(write_buffer)
|
||||
except:
|
||||
result = -1
|
||||
result = None
|
||||
return result
|
||||
|
||||
def safe_sendBreak(self, serial):
|
||||
""" Wraps serial.sendBreak() to avoid serial::serialposix.py exception on Linux
|
||||
Traceback (most recent call last):
|
||||
File "make.py", line 189, in <module>
|
||||
serial.sendBreak()
|
||||
File "/usr/lib/python2.7/dist-packages/serial/serialposix.py", line 511, in sendBreak
|
||||
termios.tcsendbreak(self.fd, int(duration/0.25))
|
||||
error: (32, 'Broken pipe')
|
||||
Traceback (most recent call last):
|
||||
File "make.py", line 189, in <module>
|
||||
serial.sendBreak()
|
||||
File "/usr/lib/python2.7/dist-packages/serial/serialposix.py", line 511, in sendBreak
|
||||
termios.tcsendbreak(self.fd, int(duration/0.25))
|
||||
error: (32, 'Broken pipe')
|
||||
"""
|
||||
result = True
|
||||
try:
|
||||
|
@ -132,24 +153,38 @@ class Mbed:
|
|||
result = False
|
||||
return result
|
||||
|
||||
def touch_file(self, path, name):
|
||||
with os.open(path, 'a'):
|
||||
def touch_file(self, path):
|
||||
""" Touch file and set timestamp to items
|
||||
"""
|
||||
with open(path, 'a'):
|
||||
os.utime(path, None)
|
||||
|
||||
def reset_timeout(self, timeout):
|
||||
""" Timeout executed just after reset command is issued
|
||||
"""
|
||||
for n in range(0, timeout):
|
||||
sleep(1)
|
||||
|
||||
def reset(self):
|
||||
""" reboot.txt - startup from standby state, reboots when in run mode.
|
||||
""" Reset function. Supports 'standard' send break command via Mbed's CDC,
|
||||
also handles other reset modes.
|
||||
E.g. reset by touching file with specific file name:
|
||||
reboot.txt - startup from standby state, reboots when in run mode.
|
||||
shutdown.txt - shutdown from run mode
|
||||
reset.txt - reset fpga during run mode """
|
||||
if self.options.forced_reset_type:
|
||||
path = os.path.join([self.disk, self.options.forced_reset_type.lower()])
|
||||
if self.options.forced_reset_type.endswith('.txt'):
|
||||
self.touch_file(path)
|
||||
reset.txt - reset FPGA during run mode
|
||||
"""
|
||||
if self.options.forced_reset_type and self.options.forced_reset_type.endswith('.txt'):
|
||||
reset_file_path = os.path.join(self.disk, self.options.forced_reset_type.lower())
|
||||
self.touch_file(reset_file_path)
|
||||
else:
|
||||
self.safe_sendBreak(self.serial) # Instead of serial.sendBreak()
|
||||
# Give time to wait for the image loading
|
||||
sleep(2)
|
||||
reset_tout_s = self.options.forced_reset_timeout if self.options.forced_reset_timeout is not None else self.DEFAULT_RESET_TOUT
|
||||
self.reset_timeout(reset_tout_s)
|
||||
|
||||
def flush(self):
|
||||
""" Flush serial ports
|
||||
"""
|
||||
self.serial.flushInput()
|
||||
self.serial.flushOutput()
|
||||
if self.extra_serial:
|
||||
|
@ -158,10 +193,15 @@ class Mbed:
|
|||
|
||||
|
||||
class Test:
|
||||
""" Baseclass for host test's test runner
|
||||
"""
|
||||
def __init__(self):
|
||||
self.mbed = Mbed()
|
||||
|
||||
def run(self):
|
||||
""" Test runner for host test. This function will start executing
|
||||
test and forward test result via serial port to test suite
|
||||
"""
|
||||
try:
|
||||
result = self.test()
|
||||
self.print_result("success" if result else "failure")
|
||||
|
@ -170,7 +210,8 @@ class Test:
|
|||
self.print_result("error")
|
||||
|
||||
def setup(self):
|
||||
""" Setup and check if configuration for test is correct. E.g. if serial port can be opened """
|
||||
""" Setup and check if configuration for test is correct. E.g. if serial port can be opened
|
||||
"""
|
||||
result = True
|
||||
if not self.mbed.serial:
|
||||
result = False
|
||||
|
@ -178,16 +219,20 @@ class Test:
|
|||
return result
|
||||
|
||||
def notify(self, message):
|
||||
""" On screen notification function """
|
||||
""" On screen notification function
|
||||
"""
|
||||
print message
|
||||
stdout.flush()
|
||||
|
||||
def print_result(self, result):
|
||||
""" Test result unified printing function """
|
||||
""" Test result unified printing function
|
||||
"""
|
||||
self.notify("\n{%s}\n{end}" % result)
|
||||
|
||||
|
||||
class DefaultTest(Test):
|
||||
""" Test class with serial port initialization
|
||||
"""
|
||||
def __init__(self):
|
||||
Test.__init__(self)
|
||||
serial_init_res = self.mbed.init_serial()
|
||||
|
@ -195,6 +240,10 @@ class DefaultTest(Test):
|
|||
|
||||
|
||||
class Simple(DefaultTest):
|
||||
""" Simple, basic host test's test runner waiting for serial port
|
||||
output from MUT, no supervision over test running in MUT is executed.
|
||||
Just waiting for result
|
||||
"""
|
||||
def run(self):
|
||||
try:
|
||||
while True:
|
||||
|
@ -207,5 +256,6 @@ class Simple(DefaultTest):
|
|||
except KeyboardInterrupt, _:
|
||||
print "\n[CTRL+c] exit"
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
Simple().run()
|
||||
|
|
|
@ -26,7 +26,9 @@ class RTCTest(DefaultTest):
|
|||
|
||||
def run(self):
|
||||
test_result = True
|
||||
c = self.mbed.serial.timeout = None
|
||||
if self.mbed.serial_timeout(None) is None:
|
||||
self.print_result("ioerr_serial")
|
||||
return
|
||||
for i in range(0, 5):
|
||||
c = self.mbed.serial_read(38) # 38 len("[1256729742] [2009-10-28 11:35:42 AM]\n"
|
||||
if c is None:
|
||||
|
|
|
@ -31,7 +31,7 @@ class StdioTest(DefaultTest):
|
|||
for i in range(1, 5):
|
||||
random_integer = random.randint(-10000, 10000)
|
||||
print "Generated number: " + str(random_integer)
|
||||
self.mbed.serial.write(str(random_integer) + "\n")
|
||||
self.mbed.serial_write(str(random_integer) + "\n")
|
||||
serial_stdio_msg = ""
|
||||
|
||||
ip_msg_timeout = self.mbed.options.timeout
|
||||
|
|
|
@ -33,7 +33,7 @@ class TCPEchoClientTest(Test):
|
|||
self.mbed.reset()
|
||||
print "Sending server IP Address to target..."
|
||||
connection_str = ip_address + ":" + str(port_no) + "\n"
|
||||
self.mbed.serial.write(connection_str)
|
||||
self.mbed.serial_write(connection_str)
|
||||
|
||||
|
||||
class TCPEchoClient_Handler(BaseRequestHandler):
|
||||
|
|
|
@ -32,7 +32,7 @@ class UDPEchoClientTest(Test):
|
|||
self.mbed.reset()
|
||||
print "Sending server IP Address to target..."
|
||||
connection_str = ip_address + ":" + str(port_no) + "\n"
|
||||
self.mbed.serial.write(connection_str)
|
||||
self.mbed.serial_write(connection_str)
|
||||
|
||||
|
||||
class UDPEchoClient_Handler(BaseRequestHandler):
|
||||
|
|
|
@ -23,7 +23,9 @@ class WaitusTest(DefaultTest):
|
|||
def run(self):
|
||||
test_result = True
|
||||
# First character to start test (to know after reset when test starts)
|
||||
self.mbed.serial.timeout = None
|
||||
if self.mbed.serial_timeout(None) is None:
|
||||
self.print_result("ioerr_serial")
|
||||
return
|
||||
c = self.mbed.serial_read(1)
|
||||
if c is None:
|
||||
self.print_result("ioerr_serial")
|
||||
|
|
|
@ -91,7 +91,8 @@ from workspace_tools.test_api import get_default_test_options_parser
|
|||
|
||||
|
||||
def get_version():
|
||||
""" Returns test script version """
|
||||
""" Returns test script version
|
||||
"""
|
||||
single_test_version_major = 1
|
||||
single_test_version_minor = 1
|
||||
return (single_test_version_major, single_test_version_minor)
|
||||
|
@ -168,6 +169,7 @@ if __name__ == '__main__':
|
|||
single_test = SingleTestRunner(_global_loops_count=opts.test_global_loops_value,
|
||||
_test_loops_list=opts.test_loops_list,
|
||||
_muts=MUTs,
|
||||
_opts_log_file_name=opts.log_file_name,
|
||||
_test_spec=test_spec,
|
||||
_opts_goanna_for_mbed_sdk=opts.goanna_for_mbed_sdk,
|
||||
_opts_goanna_for_tests=opts.goanna_for_tests,
|
||||
|
@ -184,8 +186,9 @@ if __name__ == '__main__':
|
|||
_opts_suppress_summary=opts.suppress_summary,
|
||||
_opts_test_x_toolchain_summary=opts.test_x_toolchain_summary,
|
||||
_opts_copy_method=opts.copy_method,
|
||||
_opts_mut_reset_type=opts.mut_reset_type
|
||||
)
|
||||
_opts_mut_reset_type=opts.mut_reset_type,
|
||||
_opts_jobs=opts.jobs,
|
||||
_opts_extend_test_timeout=opts.extend_test_timeout)
|
||||
|
||||
# Runs test suite in CLI mode
|
||||
singletest_in_cli_mode(single_test)
|
||||
|
|
|
@ -26,7 +26,7 @@ CORE_LABELS = {
|
|||
|
||||
import os
|
||||
import shutil
|
||||
|
||||
from workspace_tools.patch import patch
|
||||
|
||||
class Target:
|
||||
def __init__(self):
|
||||
|
@ -59,35 +59,47 @@ class Target:
|
|||
def init_hooks(self, hook, toolchain_name):
|
||||
pass
|
||||
|
||||
|
||||
class LPC2368(Target):
|
||||
# This class implements the post-link patching step needed by LPC targets
|
||||
class LPCTarget(Target):
|
||||
def __init__(self):
|
||||
Target.__init__(self)
|
||||
|
||||
def init_hooks(self, hook, toolchain_name):
|
||||
hook.hook_add_binary("post", self.lpc_patch)
|
||||
|
||||
@staticmethod
|
||||
def lpc_patch(t_self, resources, elf, binf):
|
||||
t_self.debug("LPC Patch: %s" % os.path.split(binf)[1])
|
||||
patch(binf)
|
||||
|
||||
class LPC2368(LPCTarget):
|
||||
def __init__(self):
|
||||
LPCTarget.__init__(self)
|
||||
self.core = "ARM7TDMI-S"
|
||||
self.extra_labels = ['NXP', 'LPC23XX']
|
||||
self.supported_toolchains = ["ARM", "GCC_ARM", "GCC_CR"]
|
||||
|
||||
|
||||
class LPC1768(Target):
|
||||
class LPC1768(LPCTarget):
|
||||
def __init__(self):
|
||||
Target.__init__(self)
|
||||
LPCTarget.__init__(self)
|
||||
self.core = "Cortex-M3"
|
||||
self.extra_labels = ['NXP', 'LPC176X', 'MBED_LPC1768']
|
||||
self.supported_toolchains = ["ARM", "uARM", "GCC_ARM", "GCC_CS", "GCC_CR", "IAR"]
|
||||
|
||||
|
||||
class LPC11U24(Target):
|
||||
class LPC11U24(LPCTarget):
|
||||
def __init__(self):
|
||||
Target.__init__(self)
|
||||
LPCTarget.__init__(self)
|
||||
self.core = "Cortex-M0"
|
||||
self.extra_labels = ['NXP', 'LPC11UXX', 'LPC11U24_401']
|
||||
self.supported_toolchains = ["ARM", "uARM", "GCC_ARM"]
|
||||
self.default_toolchain = "uARM"
|
||||
|
||||
|
||||
class LPC11U24_301(Target):
|
||||
class LPC11U24_301(LPCTarget):
|
||||
def __init__(self):
|
||||
Target.__init__(self)
|
||||
LPCTarget.__init__(self)
|
||||
self.core = "Cortex-M0"
|
||||
self.extra_labels = ['NXP', 'LPC11UXX']
|
||||
self.supported_toolchains = ["ARM", "uARM", "GCC_ARM"]
|
||||
|
@ -145,9 +157,9 @@ class K64F(Target):
|
|||
self.default_toolchain = "ARM"
|
||||
|
||||
|
||||
class LPC812(Target):
|
||||
class LPC812(LPCTarget):
|
||||
def __init__(self):
|
||||
Target.__init__(self)
|
||||
LPCTarget.__init__(self)
|
||||
self.core = "Cortex-M0+"
|
||||
self.extra_labels = ['NXP', 'LPC81X']
|
||||
self.supported_toolchains = ["uARM"]
|
||||
|
@ -156,9 +168,9 @@ class LPC812(Target):
|
|||
self.is_disk_virtual = True
|
||||
|
||||
|
||||
class LPC810(Target):
|
||||
class LPC810(LPCTarget):
|
||||
def __init__(self):
|
||||
Target.__init__(self)
|
||||
LPCTarget.__init__(self)
|
||||
self.core = "Cortex-M0+"
|
||||
self.extra_labels = ['NXP', 'LPC81X']
|
||||
self.supported_toolchains = ["uARM"]
|
||||
|
@ -166,9 +178,9 @@ class LPC810(Target):
|
|||
self.is_disk_virtual = True
|
||||
|
||||
|
||||
class LPC4088(Target):
|
||||
class LPC4088(LPCTarget):
|
||||
def __init__(self):
|
||||
Target.__init__(self)
|
||||
LPCTarget.__init__(self)
|
||||
self.core = "Cortex-M4F"
|
||||
self.extra_labels = ['NXP', 'LPC408X']
|
||||
self.supported_toolchains = ["ARM", "GCC_CR", "GCC_ARM"]
|
||||
|
@ -182,6 +194,7 @@ class LPC4088(Target):
|
|||
def binary_hook(t_self, resources, elf, binf):
|
||||
if not os.path.isdir(binf):
|
||||
# Regular binary file, nothing to do
|
||||
LPCTarget.lpc_patch(t_self, resources, elf, binf)
|
||||
return
|
||||
outbin = open(binf + ".temp", "wb")
|
||||
partf = open(os.path.join(binf, "ER_IROM1"), "rb")
|
||||
|
@ -205,27 +218,27 @@ class LPC4088(Target):
|
|||
shutil.rmtree(binf, True)
|
||||
os.rename(binf + '.temp', binf)
|
||||
t_self.debug("Generated custom binary file (internal flash + SPIFI)")
|
||||
LPCTarget.lpc_patch(t_self, resources, elf, binf)
|
||||
|
||||
|
||||
class LPC4330_M4(Target):
|
||||
class LPC4330_M4(LPCTarget):
|
||||
def __init__(self):
|
||||
Target.__init__(self)
|
||||
LPCTarget.__init__(self)
|
||||
self.core = "Cortex-M4F"
|
||||
self.extra_labels = ['NXP', 'LPC43XX']
|
||||
self.supported_toolchains = ["ARM", "GCC_CR", "IAR", "GCC_ARM"]
|
||||
|
||||
|
||||
class LPC4330_M0(Target):
|
||||
class LPC4330_M0(LPCTarget):
|
||||
def __init__(self):
|
||||
Target.__init__(self)
|
||||
LPCTarget.__init__(self)
|
||||
self.core = "Cortex-M0"
|
||||
self.extra_labels = ['NXP', 'LPC43XX']
|
||||
self.supported_toolchains = ["ARM", "GCC_CR", "IAR"]
|
||||
|
||||
|
||||
class LPC1800(Target):
|
||||
class LPC1800(LPCTarget):
|
||||
def __init__(self):
|
||||
Target.__init__(self)
|
||||
LPCTarget.__init__(self)
|
||||
self.core = "Cortex-M3"
|
||||
self.extra_labels = ['NXP', 'LPC43XX']
|
||||
self.supported_toolchains = ["ARM", "GCC_CR", "IAR"]
|
||||
|
@ -338,61 +351,61 @@ class STM32F3XX(Target):
|
|||
self.default_toolchain = "uARM"
|
||||
|
||||
|
||||
class LPC1347(Target):
|
||||
class LPC1347(LPCTarget):
|
||||
def __init__(self):
|
||||
Target.__init__(self)
|
||||
LPCTarget.__init__(self)
|
||||
self.core = "Cortex-M3"
|
||||
self.extra_labels = ['NXP', 'LPC13XX']
|
||||
self.supported_toolchains = ["ARM", "GCC_ARM"]
|
||||
|
||||
|
||||
class LPC1114(Target):
|
||||
class LPC1114(LPCTarget):
|
||||
def __init__(self):
|
||||
Target.__init__(self)
|
||||
LPCTarget.__init__(self)
|
||||
self.core = "Cortex-M0"
|
||||
self.extra_labels = ['NXP', 'LPC11XX_11CXX', 'LPC11XX']
|
||||
self.supported_toolchains = ["ARM", "uARM", "GCC_ARM", "GCC_CR"]
|
||||
self.default_toolchain = "uARM"
|
||||
|
||||
|
||||
class LPC11C24(Target):
|
||||
class LPC11C24(LPCTarget):
|
||||
def __init__(self):
|
||||
Target.__init__(self)
|
||||
LPCTarget.__init__(self)
|
||||
self.core = "Cortex-M0"
|
||||
self.extra_labels = ['NXP', 'LPC11XX_11CXX', 'LPC11CXX']
|
||||
self.supported_toolchains = ["ARM", "uARM", "GCC_ARM"]
|
||||
|
||||
|
||||
class LPC11U35_401(Target):
|
||||
class LPC11U35_401(LPCTarget):
|
||||
def __init__(self):
|
||||
Target.__init__(self)
|
||||
LPCTarget.__init__(self)
|
||||
self.core = "Cortex-M0"
|
||||
self.extra_labels = ['NXP', 'LPC11UXX']
|
||||
self.supported_toolchains = ["ARM", "uARM", "GCC_ARM", "GCC_CR"]
|
||||
self.default_toolchain = "uARM"
|
||||
|
||||
|
||||
class LPC11U35_501(Target):
|
||||
class LPC11U35_501(LPCTarget):
|
||||
def __init__(self):
|
||||
Target.__init__(self)
|
||||
LPCTarget.__init__(self)
|
||||
self.core = "Cortex-M0"
|
||||
self.extra_labels = ['NXP', 'LPC11UXX', 'MCU_LPC11U35_501']
|
||||
self.supported_toolchains = ["ARM", "uARM", "GCC_ARM", "GCC_CR"]
|
||||
self.default_toolchain = "uARM"
|
||||
|
||||
|
||||
class LPC11U37_501(LPCTarget):
|
||||
def __init__(self):
|
||||
LPCTarget.__init__(self)
|
||||
self.core = "Cortex-M0"
|
||||
self.extra_labels = ['NXP', 'LPC11UXX']
|
||||
self.supported_toolchains = ["ARM", "uARM", "GCC_ARM", "GCC_CR"]
|
||||
self.default_toolchain = "uARM"
|
||||
|
||||
|
||||
class LPC11U37_501(Target):
|
||||
class UBLOX_C027(LPCTarget):
|
||||
def __init__(self):
|
||||
Target.__init__(self)
|
||||
self.core = "Cortex-M0"
|
||||
self.extra_labels = ['NXP', 'LPC11UXX']
|
||||
self.supported_toolchains = ["ARM", "uARM", "GCC_ARM", "GCC_CR"]
|
||||
self.default_toolchain = "uARM"
|
||||
|
||||
|
||||
class UBLOX_C027(Target):
|
||||
def __init__(self):
|
||||
Target.__init__(self)
|
||||
LPCTarget.__init__(self)
|
||||
self.core = "Cortex-M3"
|
||||
self.extra_labels = ['NXP', 'LPC176X']
|
||||
self.supported_toolchains = ["ARM", "uARM", "GCC_ARM", "GCC_CS", "GCC_CR", "IAR"]
|
||||
|
@ -456,19 +469,19 @@ class NRF51822(Target):
|
|||
sdh.tofile(f, format='hex')
|
||||
|
||||
|
||||
class LPC1549(Target):
|
||||
class LPC1549(LPCTarget):
|
||||
def __init__(self):
|
||||
Target.__init__(self)
|
||||
LPCTarget.__init__(self)
|
||||
self.core = "Cortex-M3"
|
||||
self.extra_labels = ['NXP', 'LPC15XX']
|
||||
self.supported_toolchains = ["uARM", "GCC_CR"]
|
||||
self.supported_toolchains = ["uARM", "GCC_CR", "GCC_ARM"]
|
||||
self.default_toolchain = "uARM"
|
||||
self.supported_form_factors = ["ARDUINO"]
|
||||
|
||||
|
||||
class LPC11U68(Target):
|
||||
class LPC11U68(LPCTarget):
|
||||
def __init__(self):
|
||||
Target.__init__(self)
|
||||
LPCTarget.__init__(self)
|
||||
self.core = "Cortex-M0+"
|
||||
self.extra_labels = ['NXP', 'LPC11U6X']
|
||||
self.supported_toolchains = ["uARM", "GCC_CR", "GCC_ARM"]
|
||||
|
@ -499,7 +512,7 @@ class DISCO_F407VG(Target):
|
|||
Target.__init__(self)
|
||||
self.core = "Cortex-M4F"
|
||||
self.extra_labels = ['STM', 'STM32F4', 'STM32F407', 'STM32F407VG']
|
||||
self.supported_toolchains = ["GCC_ARM"]
|
||||
self.supported_toolchains = ["ARM", "GCC_ARM"]
|
||||
self.default_toolchain = "uARM"
|
||||
|
||||
|
||||
|
@ -512,11 +525,13 @@ class DISCO_F303VC(Target):
|
|||
self.default_toolchain = "uARM"
|
||||
|
||||
|
||||
class XADOW_M0(LPC11U35_501):
|
||||
class XADOW_M0(LPCTarget):
|
||||
def __init__(self):
|
||||
LPC11U35_501.__init__(self)
|
||||
self.extra_labels = ['NXP', 'LPC11UXX', 'LPC11U35_501']
|
||||
self.macros = ['TARGET_LPC11U35_501']
|
||||
LPCTarget.__init__(self)
|
||||
self.core = "Cortex-M0"
|
||||
self.extra_labels = ['NXP', 'LPC11UXX', 'MCU_LPC11U35_501']
|
||||
self.supported_toolchains = ["ARM", "uARM", "GCC_ARM", "GCC_CR"]
|
||||
self.default_toolchain = "uARM"
|
||||
|
||||
|
||||
class ARCH_BLE(NRF51822):
|
||||
|
@ -524,11 +539,12 @@ class ARCH_BLE(NRF51822):
|
|||
NRF51822.__init__(self)
|
||||
self.extra_labels = ['NORDIC', 'MCU_NRF51822']
|
||||
self.macros = ['TARGET_NRF51822']
|
||||
self.supported_form_factors = ["ARDUINO"]
|
||||
|
||||
|
||||
class ARCH_PRO(Target):
|
||||
class ARCH_PRO(LPCTarget):
|
||||
def __init__(self):
|
||||
Target.__init__(self)
|
||||
LPCTarget.__init__(self)
|
||||
self.core = "Cortex-M3"
|
||||
self.extra_labels = ['NXP', 'LPC176X']
|
||||
self.supported_toolchains = ["ARM", "uARM", "GCC_ARM", "GCC_CS", "GCC_CR", "IAR"]
|
||||
|
@ -536,9 +552,14 @@ class ARCH_PRO(Target):
|
|||
self.supported_form_factors = ["ARDUINO"]
|
||||
|
||||
|
||||
class ARCH_GPRS(LPC11U37_501):
|
||||
class ARCH_GPRS(LPCTarget):
|
||||
def __init__(self):
|
||||
LPC11U37_501.__init__(self)
|
||||
LPCTarget.__init__(self)
|
||||
self.core = "Cortex-M0"
|
||||
self.extra_labels = ['NXP', 'LPC11UXX', 'LPC11U37_501']
|
||||
self.supported_toolchains = ["ARM", "uARM", "GCC_ARM", "GCC_CR"]
|
||||
self.default_toolchain = "uARM"
|
||||
self.supported_form_factors = ["ARDUINO"]
|
||||
|
||||
|
||||
class LPCCAPPUCCINO(LPC11U37_501):
|
||||
|
|
|
@ -19,10 +19,13 @@ Author: Przemyslaw Wirkus <Przemyslaw.wirkus@arm.com>
|
|||
|
||||
import os
|
||||
import re
|
||||
import sys
|
||||
import json
|
||||
import time
|
||||
import pprint
|
||||
import random
|
||||
import optparse
|
||||
import datetime
|
||||
import threading
|
||||
from types import ListType
|
||||
from prettytable import PrettyTable
|
||||
|
@ -35,10 +38,11 @@ from threading import Thread
|
|||
from subprocess import Popen, PIPE, call
|
||||
|
||||
# Imports related to mbed build api
|
||||
from workspace_tools.tests import TESTS
|
||||
from workspace_tools.tests import TEST_MAP
|
||||
from workspace_tools.paths import BUILD_DIR
|
||||
from workspace_tools.paths import HOST_TESTS
|
||||
from workspace_tools.tests import TEST_MAP
|
||||
from workspace_tools.tests import TESTS
|
||||
from workspace_tools.utils import construct_enum
|
||||
from workspace_tools.targets import TARGET_MAP
|
||||
from workspace_tools.build_api import build_project, build_mbed_libs, build_lib
|
||||
from workspace_tools.build_api import get_target_supported_toolchains
|
||||
|
@ -68,7 +72,8 @@ class ProcessObserver(Thread):
|
|||
|
||||
|
||||
class SingleTestExecutor(threading.Thread):
|
||||
""" Example: Single test class in separate thread usage """
|
||||
""" Example: Single test class in separate thread usage
|
||||
"""
|
||||
def __init__(self, single_test):
|
||||
self.single_test = single_test
|
||||
threading.Thread.__init__(self)
|
||||
|
@ -86,12 +91,12 @@ class SingleTestExecutor(threading.Thread):
|
|||
# prints well-formed summary with results (SQL table like)
|
||||
# table shows text x toolchain test result matrix
|
||||
print self.single_test.generate_test_summary_by_target(test_summary, shuffle_seed)
|
||||
print "Completed in %d sec"% (elapsed_time)
|
||||
print "Completed in %.2f sec"% (elapsed_time)
|
||||
|
||||
|
||||
class SingleTestRunner(object):
|
||||
""" Object wrapper for single test run which may involve multiple MUTs."""
|
||||
|
||||
""" Object wrapper for single test run which may involve multiple MUTs
|
||||
"""
|
||||
RE_DETECT_TESTCASE_RESULT = None
|
||||
|
||||
# Return codes for test script
|
||||
|
@ -127,6 +132,7 @@ class SingleTestRunner(object):
|
|||
_global_loops_count=1,
|
||||
_test_loops_list=None,
|
||||
_muts={},
|
||||
_opts_log_file_name=None,
|
||||
_test_spec={},
|
||||
_opts_goanna_for_mbed_sdk=None,
|
||||
_opts_goanna_for_tests=None,
|
||||
|
@ -144,9 +150,10 @@ class SingleTestRunner(object):
|
|||
_opts_test_x_toolchain_summary=False,
|
||||
_opts_copy_method=None,
|
||||
_opts_mut_reset_type=None,
|
||||
_opts_jobs=None
|
||||
):
|
||||
""" Let's try hard to init this object """
|
||||
_opts_jobs=None,
|
||||
_opts_extend_test_timeout=None):
|
||||
""" Let's try hard to init this object
|
||||
"""
|
||||
PATTERN = "\\{(" + "|".join(self.TEST_RESULT_MAPPING.keys()) + ")\\}"
|
||||
self.RE_DETECT_TESTCASE_RESULT = re.compile(PATTERN)
|
||||
# Settings related to test loops counters
|
||||
|
@ -168,6 +175,7 @@ class SingleTestRunner(object):
|
|||
self.test_spec = _test_spec
|
||||
|
||||
# Settings passed e.g. from command line
|
||||
self.opts_log_file_name = _opts_log_file_name
|
||||
self.opts_goanna_for_mbed_sdk = _opts_goanna_for_mbed_sdk
|
||||
self.opts_goanna_for_tests = _opts_goanna_for_tests
|
||||
self.opts_shuffle_test_order = _opts_shuffle_test_order
|
||||
|
@ -184,13 +192,17 @@ class SingleTestRunner(object):
|
|||
self.opts_test_x_toolchain_summary = _opts_test_x_toolchain_summary
|
||||
self.opts_copy_method = _opts_copy_method
|
||||
self.opts_mut_reset_type = _opts_mut_reset_type
|
||||
self.opts_jobs = _opts_jobs
|
||||
self.opts_jobs = _opts_jobs if _opts_jobs is not None else 1
|
||||
self.opts_extend_test_timeout = _opts_extend_test_timeout
|
||||
|
||||
self.logger = CLITestLogger(file_name=self.opts_log_file_name) # Default test logger
|
||||
|
||||
def shuffle_random_func(self):
|
||||
return self.shuffle_random_seed
|
||||
|
||||
def is_shuffle_seed_float(self):
|
||||
""" return true if function parameter can be converted to float """
|
||||
""" return true if function parameter can be converted to float
|
||||
"""
|
||||
result = True
|
||||
try:
|
||||
float(self.shuffle_random_seed)
|
||||
|
@ -214,7 +226,7 @@ class SingleTestRunner(object):
|
|||
# print '=== %s::%s ===' % (target, toolchain)
|
||||
# Let's build our test
|
||||
if target not in TARGET_MAP:
|
||||
print 'Skipped tests for %s target. Target platform not found' % (target)
|
||||
print self.logger.log_line(self.logger.LogType.NOTIF, 'Skipped tests for %s target. Target platform not found' % (target))
|
||||
continue
|
||||
|
||||
T = TARGET_MAP[target]
|
||||
|
@ -227,7 +239,7 @@ class SingleTestRunner(object):
|
|||
clean=clean_mbed_libs_options,
|
||||
jobs=self.opts_jobs)
|
||||
if not build_mbed_libs_result:
|
||||
print 'Skipped tests for %s target. Toolchain %s is not yet supported for this target' % (T.name, toolchain)
|
||||
print self.logger.log_line(self.logger.LogType.NOTIF, 'Skipped tests for %s target. Toolchain %s is not yet supported for this target' % (T.name, toolchain))
|
||||
continue
|
||||
|
||||
build_dir = join(BUILD_DIR, "test", target, toolchain)
|
||||
|
@ -247,19 +259,19 @@ class SingleTestRunner(object):
|
|||
|
||||
if self.opts_test_only_peripheral and not test.peripherals:
|
||||
if self.opts_verbose_skipped_tests:
|
||||
print "TargetTest::%s::NotPeripheralTestSkipped()" % (target)
|
||||
print self.logger.log_line(self.logger.LogType.INFO, 'Common test skipped for target %s'% (target))
|
||||
continue
|
||||
|
||||
if self.opts_test_only_common and test.peripherals:
|
||||
if self.opts_verbose_skipped_tests:
|
||||
print "TargetTest::%s::PeripheralTestSkipped()" % (target)
|
||||
print self.logger.log_line(self.logger.LogType.INFO, 'Peripheral test skipped for target %s'% (target))
|
||||
continue
|
||||
|
||||
if test.automated and test.is_supported(target, toolchain):
|
||||
if not self.is_peripherals_available(target, test.peripherals):
|
||||
if self.opts_verbose_skipped_tests:
|
||||
test_peripherals = test.peripherals if test.peripherals else []
|
||||
print "TargetTest::%s::TestSkipped(%s)" % (target, ",".join(test_peripherals))
|
||||
print self.logger.log_line(self.logger.LogType.INFO, 'Peripheral %s test skipped for target %s'% (",".join(test_peripherals), target))
|
||||
continue
|
||||
|
||||
build_project_options = ["analyze"] if self.opts_goanna_for_tests else None
|
||||
|
@ -310,9 +322,14 @@ class SingleTestRunner(object):
|
|||
# With this option we are skipping testing phase
|
||||
continue
|
||||
|
||||
# Test duration can be increased by global value
|
||||
test_duration = test.duration
|
||||
if self.opts_extend_test_timeout is not None:
|
||||
test_duration += self.opts_extend_test_timeout
|
||||
|
||||
# For an automated test the duration act as a timeout after
|
||||
# which the test gets interrupted
|
||||
test_spec = self.shape_test_request(target, path, test_id, test.duration)
|
||||
test_spec = self.shape_test_request(target, path, test_id, test_duration)
|
||||
test_loops = self.get_test_loop_count(test_id)
|
||||
single_test_result = self.handle(test_spec, target, toolchain, test_loops=test_loops)
|
||||
if single_test_result is not None:
|
||||
|
@ -321,7 +338,8 @@ class SingleTestRunner(object):
|
|||
|
||||
def generate_test_summary_by_target(self, test_summary, shuffle_seed=None):
|
||||
""" Prints well-formed summary with results (SQL table like)
|
||||
table shows text x toolchain test result matrix """
|
||||
table shows text x toolchain test result matrix
|
||||
"""
|
||||
RESULT_INDEX = 0
|
||||
TARGET_INDEX = 1
|
||||
TOOLCHAIN_INDEX = 2
|
||||
|
@ -334,25 +352,32 @@ class SingleTestRunner(object):
|
|||
unique_toolchains = get_unique_value_from_summary(test_summary, TOOLCHAIN_INDEX)
|
||||
|
||||
result = "Test summary:\n"
|
||||
result_dict = {} # test : { toolchain : result }
|
||||
for target in unique_targets:
|
||||
result_dict = {} # test : { toolchain : result }
|
||||
unique_target_toolchains = []
|
||||
for test in test_summary:
|
||||
if test[TEST_INDEX] not in result_dict:
|
||||
result_dict[test[TEST_INDEX]] = {}
|
||||
result_dict[test[TEST_INDEX]][test[TOOLCHAIN_INDEX]] = test[RESULT_INDEX]
|
||||
if test[TARGET_INDEX] == target:
|
||||
if test[TOOLCHAIN_INDEX] not in unique_target_toolchains:
|
||||
unique_target_toolchains.append(test[TOOLCHAIN_INDEX])
|
||||
if test[TEST_INDEX] not in result_dict:
|
||||
result_dict[test[TEST_INDEX]] = {}
|
||||
result_dict[test[TEST_INDEX]][test[TOOLCHAIN_INDEX]] = test[RESULT_INDEX]
|
||||
|
||||
pt_cols = ["Target", "Test ID", "Test Description"] + unique_toolchains
|
||||
pt_cols = ["Target", "Test ID", "Test Description"] + unique_target_toolchains
|
||||
pt = PrettyTable(pt_cols)
|
||||
for col in pt_cols:
|
||||
pt.align[col] = "l"
|
||||
pt.padding_width = 1 # One space between column edges and contents (default)
|
||||
|
||||
for test in unique_tests:
|
||||
test_results = result_dict[test]
|
||||
row = [target, test, unique_test_desc[test]]
|
||||
for toolchain in unique_toolchains:
|
||||
row.append(test_results[toolchain])
|
||||
pt.add_row(row)
|
||||
if test in result_dict:
|
||||
test_results = result_dict[test]
|
||||
if test in unique_test_desc:
|
||||
row = [target, test, unique_test_desc[test]]
|
||||
for toolchain in unique_toolchains:
|
||||
if toolchain in test_results:
|
||||
row.append(test_results[toolchain])
|
||||
pt.add_row(row)
|
||||
result += pt.get_string()
|
||||
shuffle_seed_text = "Shuffle Seed: %.*f"% (self.SHUFFLE_SEED_ROUND,
|
||||
shuffle_seed if shuffle_seed else self.shuffle_random_seed)
|
||||
|
@ -361,7 +386,8 @@ class SingleTestRunner(object):
|
|||
|
||||
def generate_test_summary(self, test_summary, shuffle_seed=None):
|
||||
""" Prints well-formed summary with results (SQL table like)
|
||||
table shows target x test results matrix across """
|
||||
table shows target x test results matrix across
|
||||
"""
|
||||
result = "Test summary:\n"
|
||||
# Pretty table package is used to print results
|
||||
pt = PrettyTable(["Result", "Target", "Toolchain", "Test ID", "Test Description",
|
||||
|
@ -399,7 +425,8 @@ class SingleTestRunner(object):
|
|||
return result
|
||||
|
||||
def test_loop_list_to_dict(self, test_loops_str):
|
||||
""" Transforms test_id=X,test_id=X,test_id=X into dictionary {test_id : test_id_loops_count} """
|
||||
""" Transforms test_id=X,test_id=X,test_id=X into dictionary {test_id : test_id_loops_count}
|
||||
"""
|
||||
result = {}
|
||||
if test_loops_str:
|
||||
test_loops = test_loops_str.split(',')
|
||||
|
@ -416,7 +443,8 @@ class SingleTestRunner(object):
|
|||
|
||||
def get_test_loop_count(self, test_id):
|
||||
""" This function returns no. of loops per test (deducted by test_id_.
|
||||
If test is not in list of redefined loop counts it will use default value. """
|
||||
If test is not in list of redefined loop counts it will use default value.
|
||||
"""
|
||||
result = self.GLOBAL_LOOPS_COUNT
|
||||
if test_id in self.TEST_LOOPS_DICT:
|
||||
result = self.TEST_LOOPS_DICT[test_id]
|
||||
|
@ -433,21 +461,39 @@ class SingleTestRunner(object):
|
|||
profile.set_preference('browser.download.manager.showWhenStarting', False)
|
||||
profile.set_preference('browser.download.dir', dest_disk)
|
||||
profile.set_preference('browser.helperApps.neverAsk.saveToDisk', 'application/octet-stream')
|
||||
|
||||
# Launch browser with profile and get file
|
||||
browser = webdriver.Firefox(profile)
|
||||
browser.get(file_path)
|
||||
browser.close()
|
||||
|
||||
def file_copy_method_selector(self, image_path, disk, copy_method):
|
||||
def image_copy_method_selector(self, target_name, image_path, disk, copy_method,
|
||||
images_config=None, image_dest=None):
|
||||
""" Function copied image file and fiddles with image configuration files in needed.
|
||||
This function will select proper image configuration (modify image config file
|
||||
if needed) after image is copied.
|
||||
"""
|
||||
image_dest = image_dest if image_dest is not None else ''
|
||||
_copy_res, _err_msg, _copy_method = self.file_copy_method_selector(image_path, disk, self.opts_copy_method, image_dest=image_dest)
|
||||
|
||||
if images_config is not None:
|
||||
# For different targets additional configuration file has to be changed
|
||||
# Here we select target and proper function to handle configuration change
|
||||
if target == 'ARM_MPS2':
|
||||
images_cfg_path = images_config
|
||||
image0file_path = os.path.join(disk, image_dest, basename(image_path))
|
||||
mps2_set_board_image_file(disk, images_cfg_path, image0file_path)
|
||||
|
||||
return _copy_res, _err_msg, _copy_method
|
||||
|
||||
def file_copy_method_selector(self, image_path, disk, copy_method, image_dest=''):
|
||||
""" Copy file depending on method you want to use. Handles exception
|
||||
and return code from shell copy commands. """
|
||||
and return code from shell copy commands.
|
||||
"""
|
||||
result = True
|
||||
resutl_msg = ""
|
||||
if copy_method == 'cp' or copy_method == 'copy' or copy_method == 'xcopy':
|
||||
source_path = image_path.encode('ascii', 'ignore')
|
||||
destination_path = os.path.join(disk.encode('ascii', 'ignore'), basename(image_path).encode('ascii', 'ignore'))
|
||||
|
||||
destination_path = os.path.join(disk.encode('ascii', 'ignore'), image_dest, basename(image_path).encode('ascii', 'ignore'))
|
||||
cmd = [copy_method, source_path, destination_path]
|
||||
try:
|
||||
ret = call(cmd, shell=True)
|
||||
|
@ -457,10 +503,10 @@ class SingleTestRunner(object):
|
|||
except Exception, e:
|
||||
resutl_msg = e
|
||||
result = False
|
||||
if copy_method == 'firefox':
|
||||
elif copy_method == 'firefox':
|
||||
try:
|
||||
source_path = image_path.encode('ascii', 'ignore')
|
||||
destination_path = disk.encode('ascii', 'ignore')
|
||||
destination_path = os.path.join(disk.encode('ascii', 'ignore'), image_dest)
|
||||
self.file_store_firefox(source_path, destination_path)
|
||||
except Exception, e:
|
||||
resutl_msg = e
|
||||
|
@ -473,10 +519,12 @@ class SingleTestRunner(object):
|
|||
except Exception, e:
|
||||
resutl_msg = e
|
||||
result = False
|
||||
|
||||
return result, resutl_msg, copy_method
|
||||
|
||||
def delete_file(self, file_path):
|
||||
""" Remove file from the system """
|
||||
""" Remove file from the system
|
||||
"""
|
||||
result = True
|
||||
resutl_msg = ""
|
||||
try:
|
||||
|
@ -488,7 +536,8 @@ class SingleTestRunner(object):
|
|||
|
||||
def handle(self, test_spec, target_name, toolchain_name, test_loops=1):
|
||||
""" Function determines MUT's mbed disk/port and copies binary to
|
||||
target. Test is being invoked afterwards. """
|
||||
target. Test is being invoked afterwards.
|
||||
"""
|
||||
data = json.loads(test_spec)
|
||||
# Get test information, image and test timeout
|
||||
test_id = data['test_id']
|
||||
|
@ -511,13 +560,19 @@ class SingleTestRunner(object):
|
|||
disk = mut['disk']
|
||||
port = mut['port']
|
||||
target_by_mcu = TARGET_MAP[mut['mcu']]
|
||||
# Some extra stuff can be declared in MUTs structure
|
||||
reset_type = mut.get('reset_type') # reboot.txt, reset.txt, shutdown.txt
|
||||
reset_tout = mut.get('reset_tout') # COPY_IMAGE -> RESET_PROC -> SLEEP(RESET_TOUT)
|
||||
image_dest = mut.get('image_dest') # Image file destination DISK + IMAGE_DEST + BINARY_NAME
|
||||
images_config = mut.get('images_config') # Available images selection via config file
|
||||
mobo_config = mut.get('mobo_config') # Available board configuration selection e.g. core selection etc.
|
||||
|
||||
# Program
|
||||
# When the build and test system were separate, this was relative to a
|
||||
# base network folder base path: join(NETWORK_BASE_PATH, )
|
||||
image_path = image
|
||||
if not exists(image_path):
|
||||
print "Error: Image file does not exist: %s" % image_path
|
||||
print self.logger.log_line(self.logger.LogType.ERROR, 'Image file does not exist: %s' % image_path)
|
||||
elapsed_time = 0
|
||||
test_result = self.TEST_RESULT_NO_IMAGE
|
||||
return (test_result, target_name, toolchain_name,
|
||||
|
@ -532,7 +587,10 @@ class SingleTestRunner(object):
|
|||
test_all_result = []
|
||||
for test_index in range(test_loops):
|
||||
# Choose one method of copy files to mbed virtual drive
|
||||
_copy_res, _err_msg, _copy_method = self.file_copy_method_selector(image_path, disk, self.opts_copy_method)
|
||||
#_copy_res, _err_msg, _copy_method = self.file_copy_method_selector(image_path, disk, self.opts_copy_method, image_dest=image_dest)
|
||||
|
||||
_copy_res, _err_msg, _copy_method = self.image_copy_method_selector(target_name, image_path, disk, self.opts_copy_method,
|
||||
images_config, image_dest)
|
||||
|
||||
# Host test execution
|
||||
start_host_exec_time = time()
|
||||
|
@ -540,7 +598,7 @@ class SingleTestRunner(object):
|
|||
single_test_result = self.TEST_RESULT_UNDEF # singe test run result
|
||||
if not _copy_res: # Serial port copy error
|
||||
single_test_result = self.TEST_RESULT_IOERR_COPY
|
||||
print "Error: Copy method '%s'. %s"% (_copy_method, _err_msg)
|
||||
print self.logger.log_line(self.logger.LogType.ERROR, "Copy method '%s' failed. Reason: %s"% (_copy_method, _err_msg))
|
||||
else:
|
||||
# Copy Extra Files
|
||||
if not target_by_mcu.is_disk_virtual and test.extra_files:
|
||||
|
@ -552,7 +610,11 @@ class SingleTestRunner(object):
|
|||
start_host_exec_time = time()
|
||||
|
||||
host_test_verbose = self.opts_verbose_test_result_only or self.opts_verbose
|
||||
single_test_result = self.run_host_test(test.host_test, disk, port, duration, host_test_verbose)
|
||||
host_test_reset = self.opts_mut_reset_type if reset_type is None else reset_type
|
||||
single_test_result = self.run_host_test(test.host_test, disk, port, duration,
|
||||
verbose=host_test_verbose,
|
||||
reset=host_test_reset,
|
||||
reset_tout=reset_tout)
|
||||
|
||||
# Store test result
|
||||
test_all_result.append(single_test_result)
|
||||
|
@ -566,7 +628,8 @@ class SingleTestRunner(object):
|
|||
|
||||
def print_test_result(self, test_result, target_name, toolchain_name,
|
||||
test_id, test_description, elapsed_time, duration):
|
||||
""" Use specific convention to print test result and related data."""
|
||||
""" Use specific convention to print test result and related data
|
||||
"""
|
||||
tokens = []
|
||||
tokens.append("TargetTest")
|
||||
tokens.append(target_name)
|
||||
|
@ -579,22 +642,25 @@ class SingleTestRunner(object):
|
|||
return result
|
||||
|
||||
def shape_test_loop_ok_result_count(self, test_all_result):
|
||||
""" Reformats list of results to simple string """
|
||||
""" Reformats list of results to simple string
|
||||
"""
|
||||
test_loop_count = len(test_all_result)
|
||||
test_loop_ok_result = test_all_result.count(self.TEST_RESULT_OK)
|
||||
return "%d/%d"% (test_loop_ok_result, test_loop_count)
|
||||
|
||||
def shape_global_test_loop_result(self, test_all_result):
|
||||
""" Reformats list of results to simple string """
|
||||
""" Reformats list of results to simple string
|
||||
"""
|
||||
result = self.TEST_RESULT_FAIL
|
||||
if all(test_all_result[0] == res for res in test_all_result):
|
||||
result = test_all_result[0]
|
||||
return result
|
||||
|
||||
def run_host_test(self, name, disk, port, duration, reset=None, verbose=False, extra_serial=None):
|
||||
def run_host_test(self, name, disk, port, duration, reset=None, reset_tout=None, verbose=False, extra_serial=None):
|
||||
""" Function creates new process with host test configured with particular test case.
|
||||
Function also is pooling for serial port activity from process to catch all data
|
||||
printed by test runner and host test during test execution."""
|
||||
printed by test runner and host test during test execution
|
||||
"""
|
||||
# print "{%s} port:%s disk:%s" % (name, port, disk),
|
||||
cmd = ["python", "%s.py" % name, '-p', port, '-d', disk, '-t', str(duration)]
|
||||
|
||||
|
@ -603,6 +669,11 @@ class SingleTestRunner(object):
|
|||
cmd += ["-e", extra_serial]
|
||||
if reset is not None:
|
||||
cmd += ["-r", reset]
|
||||
if reset_tout is not None:
|
||||
cmd += ["-R", str(reset_tout)]
|
||||
|
||||
if verbose:
|
||||
print "Host test cmd: " + " ".join(cmd)
|
||||
|
||||
proc = Popen(cmd, stdout=PIPE, cwd=HOST_TESTS)
|
||||
obs = ProcessObserver(proc)
|
||||
|
@ -611,7 +682,7 @@ class SingleTestRunner(object):
|
|||
output = []
|
||||
while (time() - start_time) < duration:
|
||||
try:
|
||||
c = obs.queue.get(block=True, timeout=1)
|
||||
c = obs.queue.get(block=True, timeout=0.5)
|
||||
except Empty, _:
|
||||
c = None
|
||||
|
||||
|
@ -619,7 +690,8 @@ class SingleTestRunner(object):
|
|||
output.append(c)
|
||||
# Give the mbed under test a way to communicate the end of the test
|
||||
if c in ['\n', '\r']:
|
||||
if '{end}' in line: break
|
||||
if '{end}' in line:
|
||||
break
|
||||
line = ''
|
||||
else:
|
||||
line += c
|
||||
|
@ -643,7 +715,8 @@ class SingleTestRunner(object):
|
|||
return result
|
||||
|
||||
def is_peripherals_available(self, target_mcu_name, peripherals=None):
|
||||
""" Checks if specified target should run specific peripheral test case."""
|
||||
""" Checks if specified target should run specific peripheral test case
|
||||
"""
|
||||
if peripherals is not None:
|
||||
peripherals = set(peripherals)
|
||||
for id, mut in self.muts.iteritems():
|
||||
|
@ -660,7 +733,8 @@ class SingleTestRunner(object):
|
|||
return False
|
||||
|
||||
def shape_test_request(self, mcu, image_path, test_id, duration=10):
|
||||
""" Function prepares JOSN structure describing test specification."""
|
||||
""" Function prepares JOSN structure describing test specification
|
||||
"""
|
||||
test_spec = {
|
||||
"mcu": mcu,
|
||||
"image": image_path,
|
||||
|
@ -671,7 +745,8 @@ class SingleTestRunner(object):
|
|||
|
||||
|
||||
def get_unique_value_from_summary(test_summary, index):
|
||||
""" Gets list of unique target names """
|
||||
""" Gets list of unique target names
|
||||
"""
|
||||
result = []
|
||||
for test in test_summary:
|
||||
target_name = test[index]
|
||||
|
@ -681,7 +756,8 @@ def get_unique_value_from_summary(test_summary, index):
|
|||
|
||||
|
||||
def get_unique_value_from_summary_ext(test_summary, index_key, index_val):
|
||||
""" Gets list of unique target names and return dictionary """
|
||||
""" Gets list of unique target names and return dictionary
|
||||
"""
|
||||
result = {}
|
||||
for test in test_summary:
|
||||
key = test[index_key]
|
||||
|
@ -692,7 +768,8 @@ def get_unique_value_from_summary_ext(test_summary, index_key, index_val):
|
|||
|
||||
|
||||
def show_json_file_format_error(json_spec_filename, line, column):
|
||||
""" Prints JSON broken content """
|
||||
""" Prints JSON broken content
|
||||
"""
|
||||
with open(json_spec_filename) as data_file:
|
||||
line_no = 1
|
||||
for json_line in data_file:
|
||||
|
@ -706,7 +783,8 @@ def show_json_file_format_error(json_spec_filename, line, column):
|
|||
|
||||
def json_format_error_defect_pos(json_error_msg):
|
||||
""" Gets first error line and column in JSON file format.
|
||||
Parsed from exception thrown by json.loads() string """
|
||||
Parsed from exception thrown by json.loads() string
|
||||
"""
|
||||
result = None
|
||||
line, column = 0, 0
|
||||
# Line value search
|
||||
|
@ -726,7 +804,8 @@ def json_format_error_defect_pos(json_error_msg):
|
|||
|
||||
|
||||
def get_json_data_from_file(json_spec_filename, verbose=False):
|
||||
""" Loads from file JSON formatted string to data structure """
|
||||
""" Loads from file JSON formatted string to data structure
|
||||
"""
|
||||
result = None
|
||||
try:
|
||||
with open(json_spec_filename) as data_file:
|
||||
|
@ -734,7 +813,7 @@ def get_json_data_from_file(json_spec_filename, verbose=False):
|
|||
result = json.load(data_file)
|
||||
except ValueError as json_error_msg:
|
||||
result = None
|
||||
print "Error in '%s' file. %s" % (json_spec_filename, json_error_msg)
|
||||
print 'JSON file %s parsing failed. Reason: %s' % (json_spec_filename, json_error_msg)
|
||||
# We can print where error occurred inside JSON file if we can parse exception msg
|
||||
json_format_defect_pos = json_format_error_defect_pos(str(json_error_msg))
|
||||
if json_format_defect_pos is not None:
|
||||
|
@ -744,7 +823,8 @@ def get_json_data_from_file(json_spec_filename, verbose=False):
|
|||
show_json_file_format_error(json_spec_filename, line, column)
|
||||
|
||||
except IOError as fileopen_error_msg:
|
||||
print "Error: %s" % (fileopen_error_msg)
|
||||
print 'JSON file %s not opened. Reason: %s'% (json_spec_filename, fileopen_error_msg)
|
||||
print
|
||||
if verbose and result:
|
||||
pp = pprint.PrettyPrinter(indent=4)
|
||||
pp.pprint(result)
|
||||
|
@ -752,7 +832,8 @@ def get_json_data_from_file(json_spec_filename, verbose=False):
|
|||
|
||||
|
||||
def print_muts_configuration_from_json(json_data, join_delim=", "):
|
||||
""" Prints MUTs configuration passed to test script for verboseness. """
|
||||
""" Prints MUTs configuration passed to test script for verboseness
|
||||
"""
|
||||
muts_info_cols = []
|
||||
# We need to check all unique properties for each defined MUT
|
||||
for k in json_data:
|
||||
|
@ -781,7 +862,8 @@ def print_muts_configuration_from_json(json_data, join_delim=", "):
|
|||
|
||||
|
||||
def print_test_configuration_from_json(json_data, join_delim=", "):
|
||||
""" Prints test specification configuration passed to test script for verboseness. """
|
||||
""" Prints test specification configuration passed to test script for verboseness
|
||||
"""
|
||||
toolchains_info_cols = []
|
||||
# We need to check all toolchains for each device
|
||||
for k in json_data:
|
||||
|
@ -811,7 +893,7 @@ def print_test_configuration_from_json(json_data, join_delim=", "):
|
|||
target_name = target if target in TARGET_MAP else "%s*"% target
|
||||
row = [target_name]
|
||||
toolchains = targets[target]
|
||||
for toolchain in toolchains_info_cols:
|
||||
for toolchain in sorted(toolchains_info_cols):
|
||||
# Check for conflicts
|
||||
conflict = False
|
||||
if toolchain in toolchains:
|
||||
|
@ -829,7 +911,7 @@ def print_test_configuration_from_json(json_data, join_delim=", "):
|
|||
|
||||
# generate result string
|
||||
result = pt.get_string() # Test specification table
|
||||
if toolchain_conflicts: # Print conflicts if the exist
|
||||
if toolchain_conflicts: # Print conflicts if exist
|
||||
result += "\n"
|
||||
result += "Toolchain conflicts:\n"
|
||||
for target in toolchain_conflicts:
|
||||
|
@ -844,7 +926,8 @@ def print_test_configuration_from_json(json_data, join_delim=", "):
|
|||
def get_avail_tests_summary_table(cols=None, result_summary=True, join_delim=','):
|
||||
""" Generates table summary with all test cases and additional test cases
|
||||
information using pretty print functionality. Allows test suite user to
|
||||
see test cases. """
|
||||
see test cases
|
||||
"""
|
||||
# get all unique test ID prefixes
|
||||
unique_test_id = []
|
||||
for test in TESTS:
|
||||
|
@ -931,7 +1014,8 @@ def get_avail_tests_summary_table(cols=None, result_summary=True, join_delim=','
|
|||
|
||||
|
||||
def progress_bar(percent_progress, saturation=0):
|
||||
""" This function creates progress bar with optional simple saturation mark"""
|
||||
""" This function creates progress bar with optional simple saturation mark
|
||||
"""
|
||||
step = int(percent_progress / 2) # Scale by to (scale: 1 - 50)
|
||||
str_progress = '#' * step + '.' * int(50 - step)
|
||||
c = '!' if str_progress[38] == '.' else '|'
|
||||
|
@ -942,7 +1026,8 @@ def progress_bar(percent_progress, saturation=0):
|
|||
|
||||
|
||||
def singletest_in_cli_mode(single_test):
|
||||
""" Runs SingleTestRunner object in CLI (Command line interface) mode """
|
||||
""" Runs SingleTestRunner object in CLI (Command line interface) mode
|
||||
"""
|
||||
start = time()
|
||||
# Execute tests depending on options and filter applied
|
||||
test_summary, shuffle_seed = single_test.execute()
|
||||
|
@ -955,11 +1040,135 @@ def singletest_in_cli_mode(single_test):
|
|||
# prints well-formed summary with results (SQL table like)
|
||||
# table shows text x toolchain test result matrix
|
||||
print single_test.generate_test_summary_by_target(test_summary, shuffle_seed)
|
||||
print "Completed in %d sec"% (elapsed_time)
|
||||
print "Completed in %.2f sec"% (elapsed_time)
|
||||
|
||||
|
||||
def mps2_set_board_image_file(disk, images_cfg_path, image0file_path, image_name='images.txt'):
|
||||
""" This function will alter image cfg file.
|
||||
Main goal of this function is to change number of images to 1, comment all
|
||||
existing image entries and append at the end of file new entry with test path.
|
||||
@return True when all steps succeed.
|
||||
"""
|
||||
MBED_SDK_TEST_STAMP = 'test suite entry'
|
||||
image_path = os.path.join(disk, images_cfg_path, image_name)
|
||||
new_file_lines = [] # New configuration file lines (entries)
|
||||
|
||||
# Check each line of the image configuration file
|
||||
try:
|
||||
with open(image_path, 'r') as file:
|
||||
for line in file:
|
||||
if re.search('^TOTALIMAGES', line):
|
||||
# Check number of total images, should be 1
|
||||
new_file_lines.append(re.sub('^TOTALIMAGES:[\t ]*[\d]+', 'TOTALIMAGES: 1', line))
|
||||
pass
|
||||
|
||||
elif re.search('; - %s[\n\r]*$'% MBED_SDK_TEST_STAMP, line):
|
||||
# Look for test suite entries and remove them
|
||||
pass # Omit all test suite entries
|
||||
|
||||
elif re.search('^IMAGE[\d]+FILE', line):
|
||||
# Check all image entries and mark the ';'
|
||||
new_file_lines.append(';' + line) # Comment non test suite lines
|
||||
else:
|
||||
# Append line to new file
|
||||
new_file_lines.append(line)
|
||||
except IOError as e:
|
||||
return False
|
||||
|
||||
# Add new image entry with proper commented stamp
|
||||
new_file_lines.append('IMAGE0FILE: %s ; - %s\r\n'% (image0file_path, MBED_SDK_TEST_STAMP))
|
||||
|
||||
# Write all lines to file
|
||||
try:
|
||||
with open(image_path, 'w') as file:
|
||||
for line in new_file_lines:
|
||||
file.write(line),
|
||||
except IOError as e:
|
||||
return False
|
||||
|
||||
return True
|
||||
|
||||
|
||||
def mps2_select_core(disk, mobo_config_name=""):
|
||||
""" Function selects actual core
|
||||
"""
|
||||
# TODO: implement core selection
|
||||
pass
|
||||
|
||||
|
||||
def mps2_switch_usb_auto_mounting_after_restart(disk, usb_config_name=""):
|
||||
""" Function alters configuration to allow USB MSD to be mounted after restarts
|
||||
"""
|
||||
# TODO: implement USB MSD restart detection
|
||||
pass
|
||||
|
||||
|
||||
class TestLogger():
|
||||
""" Super-class for logging and printing ongoing events for test suite pass
|
||||
"""
|
||||
def __init__(self, store_log=True):
|
||||
""" We can control if logger actually stores log in memory
|
||||
or just handled all log entries immediately
|
||||
"""
|
||||
self.log = []
|
||||
self.log_to_file = False
|
||||
self.log_file_name = None
|
||||
self.store_log = store_log
|
||||
|
||||
self.LogType = construct_enum(INFO='Info',
|
||||
WARN='Warning',
|
||||
NOTIF='Notification',
|
||||
ERROR='Error',
|
||||
EXCEPT='Exception')
|
||||
|
||||
self.LogToFileAttr = construct_enum(CREATE=1, # Create or overwrite existing log file
|
||||
APPEND=2) # Append to existing log file
|
||||
|
||||
def log_line(self, LogType, log_line):
|
||||
""" Log one line of text
|
||||
"""
|
||||
log_timestamp = time()
|
||||
log_entry = {'log_type' : LogType,
|
||||
'log_timestamp' : log_timestamp,
|
||||
'log_line' : log_line,
|
||||
'_future' : None}
|
||||
# Store log in memory
|
||||
if self.store_log:
|
||||
self.log.append(log_entry)
|
||||
return log_entry
|
||||
|
||||
|
||||
class CLITestLogger(TestLogger):
|
||||
""" Logger used with CLI (Command line interface) test suite. Logs on screen and to file if needed
|
||||
"""
|
||||
def __init__(self, store_log=True, file_name=None):
|
||||
TestLogger.__init__(self)
|
||||
self.log_file_name = file_name
|
||||
#self.TIMESTAMP_FORMAT = '%y-%m-%d %H:%M:%S' # Full date and time
|
||||
self.TIMESTAMP_FORMAT = '%H:%M:%S' # Time only
|
||||
|
||||
def log_print(self, log_entry, timestamp=True):
|
||||
""" Prints on screen formatted log entry
|
||||
"""
|
||||
ts = log_entry['log_timestamp']
|
||||
timestamp_str = datetime.datetime.fromtimestamp(ts).strftime("[%s] "% self.TIMESTAMP_FORMAT) if timestamp else ''
|
||||
log_line_str = "%(log_type)s: %(log_line)s"% (log_entry)
|
||||
return timestamp_str + log_line_str
|
||||
|
||||
def log_line(self, LogType, log_line, timestamp=True, line_delim='\n'):
|
||||
log_entry = TestLogger.log_line(self, LogType, log_line)
|
||||
log_line_str = self.log_print(log_entry, timestamp)
|
||||
if self.log_file_name is not None:
|
||||
try:
|
||||
with open(self.log_file_name, 'a') as file:
|
||||
file.write(log_line_str + line_delim)
|
||||
except IOError:
|
||||
pass
|
||||
return log_line_str
|
||||
|
||||
def get_default_test_options_parser():
|
||||
""" Get common test script options used by CLI, webservices etc. """
|
||||
""" Get common test script options used by CLI, webservices etc.
|
||||
"""
|
||||
parser = optparse.OptionParser()
|
||||
parser.add_option('-i', '--tests',
|
||||
dest='test_spec_filename',
|
||||
|
@ -1061,7 +1270,7 @@ def get_default_test_options_parser():
|
|||
|
||||
parser.add_option('', '--firmware-name',
|
||||
dest='firmware_global_name',
|
||||
help='Set global name for all produced projects. E.g. you can call all test binaries firmware.bin')
|
||||
help='Set global name for all produced projects. Note, proper file extension will be added by buid scripts.')
|
||||
|
||||
parser.add_option('-u', '--shuffle',
|
||||
dest='shuffle_test_order',
|
||||
|
@ -1084,6 +1293,16 @@ def get_default_test_options_parser():
|
|||
default=None,
|
||||
help='For some commands you can use filter to filter out results')
|
||||
|
||||
parser.add_option('', '--inc-timeout',
|
||||
dest='extend_test_timeout',
|
||||
metavar="NUMBER",
|
||||
type="int",
|
||||
help='You can increase global timeout for each test by specifying additional test timeout in seconds')
|
||||
|
||||
parser.add_option('-l', '--log',
|
||||
dest='log_file_name',
|
||||
help='Log events to external file (note not all console entries may be visible in log file)')
|
||||
|
||||
parser.add_option('', '--verbose-skipped',
|
||||
dest='verbose_skipped_tests',
|
||||
default=False,
|
||||
|
|
|
@ -53,20 +53,23 @@ class SingleTestRunnerWebService(SingleTestRunner):
|
|||
REST_TEST_RESULTS='test_results')
|
||||
|
||||
def get_rest_result_template(self, result, command, success_code):
|
||||
""" Returns common part of every web service request """
|
||||
result = {"result": result,
|
||||
""" Returns common part of every web service request
|
||||
"""
|
||||
result = {"result" : result,
|
||||
"command" : command,
|
||||
"success_code": success_code} # 0 - OK, >0 - Error number
|
||||
return result
|
||||
|
||||
# REST API handlers for Flask framework
|
||||
def rest_api_status(self):
|
||||
""" Returns current test execution status. E.g. running / finished etc. """
|
||||
""" Returns current test execution status. E.g. running / finished etc.
|
||||
"""
|
||||
with self.resource_lock:
|
||||
pass
|
||||
|
||||
def rest_api_config(self):
|
||||
""" Returns configuration passed to SingleTest executor """
|
||||
""" Returns configuration passed to SingleTest executor
|
||||
"""
|
||||
with self.resource_lock:
|
||||
pass
|
||||
|
||||
|
@ -76,7 +79,8 @@ class SingleTestRunnerWebService(SingleTestRunner):
|
|||
pass
|
||||
|
||||
def rest_api_request_handler(self, request_type):
|
||||
""" Returns various data structures. Both static and mutable during test """
|
||||
""" Returns various data structures. Both static and mutable during test
|
||||
"""
|
||||
result = {}
|
||||
success_code = 0
|
||||
with self.resource_lock:
|
||||
|
@ -97,7 +101,8 @@ def singletest_in_webservice_mode():
|
|||
|
||||
|
||||
def get_default_test_webservice_options_parser():
|
||||
""" Get test script web service options used by CLI, webservices etc. """
|
||||
""" Get test script web service options used by CLI, webservices etc.
|
||||
"""
|
||||
parser = get_default_test_options_parser()
|
||||
|
||||
# Things related to web services offered by test suite scripts
|
||||
|
|
|
@ -233,7 +233,6 @@ class mbedToolchain:
|
|||
self.symbols = None
|
||||
self.labels = None
|
||||
self.has_config = False
|
||||
self.stat_cache = {}
|
||||
|
||||
self.build_all = False
|
||||
self.timestamp = time()
|
||||
|
@ -314,31 +313,6 @@ class mbedToolchain:
|
|||
|
||||
return False
|
||||
|
||||
def need_update_new(self, target, dependencies):
|
||||
if self.build_all:
|
||||
return True
|
||||
|
||||
if not exists(target):
|
||||
return True
|
||||
|
||||
target_mod_time = stat(target).st_mtime
|
||||
for d in dependencies:
|
||||
# Some objects are not provided with full path and here we do not have
|
||||
# information about the library paths. Safe option: assume an update
|
||||
if not d:
|
||||
return True
|
||||
|
||||
if self.stat_cache.has_key(d):
|
||||
if self.stat_cache[d] >= target_mod_time:
|
||||
return True
|
||||
else:
|
||||
if not exists(d): return True
|
||||
|
||||
self.stat_cache[d] = stat(d).st_mtime
|
||||
if self.stat_cache[d] >= target_mod_time: return True
|
||||
|
||||
return False
|
||||
|
||||
def scan_resources(self, path):
|
||||
labels = self.get_labels()
|
||||
resources = Resources(path)
|
||||
|
@ -487,7 +461,7 @@ class mbedToolchain:
|
|||
mkdir(work_dir)
|
||||
|
||||
# Queue mode (multiprocessing)
|
||||
commands = self._compile_command(source, object, inc_paths)
|
||||
commands = self.compile_command(source, object, inc_paths)
|
||||
if commands is not None:
|
||||
queue.append({
|
||||
'source': source,
|
||||
|
@ -514,7 +488,7 @@ class mbedToolchain:
|
|||
self.progress("compile", item['source'], build_update=True)
|
||||
for res in result['results']:
|
||||
self.debug("Command: %s" % ' '.join(res['command']))
|
||||
self._compile_output([
|
||||
self.compile_output([
|
||||
res['code'],
|
||||
res['output'],
|
||||
res['command']
|
||||
|
@ -549,7 +523,7 @@ class mbedToolchain:
|
|||
self.progress("compile", result['source'], build_update=True)
|
||||
for res in result['results']:
|
||||
self.debug("Command: %s" % ' '.join(res['command']))
|
||||
self._compile_output([
|
||||
self.compile_output([
|
||||
res['code'],
|
||||
res['output'],
|
||||
res['command']
|
||||
|
@ -576,7 +550,7 @@ class mbedToolchain:
|
|||
|
||||
return objects
|
||||
|
||||
def _compile_command(self, source, object, includes):
|
||||
def compile_command(self, source, object, includes):
|
||||
# Check dependencies
|
||||
_, ext = splitext(source)
|
||||
ext = ext.lower()
|
||||
|
@ -586,17 +560,20 @@ class mbedToolchain:
|
|||
dep_path = base + '.d'
|
||||
deps = self.parse_dependencies(dep_path) if (exists(dep_path)) else []
|
||||
if len(deps) == 0 or self.need_update(object, deps):
|
||||
return self._compile(source, object, includes)
|
||||
if ext == '.c':
|
||||
return self.compile_c(source, object, includes)
|
||||
else:
|
||||
return self.compile_cpp(source, object, includes)
|
||||
elif ext == '.s':
|
||||
deps = [source]
|
||||
if self.need_update(object, deps):
|
||||
return self._assemble(source, object, includes)
|
||||
return self.assemble(source, object, includes)
|
||||
else:
|
||||
return False
|
||||
|
||||
return None
|
||||
|
||||
def _compile_output(self, output=[]):
|
||||
def compile_output(self, output=[]):
|
||||
rc = output[0]
|
||||
stderr = output[1]
|
||||
command = output[2]
|
||||
|
@ -610,11 +587,10 @@ class mbedToolchain:
|
|||
if rc != 0:
|
||||
raise ToolException(stderr)
|
||||
|
||||
def _compile(self, source, object, includes):
|
||||
def compile(self, cc, source, object, includes):
|
||||
_, ext = splitext(source)
|
||||
ext = ext.lower()
|
||||
|
||||
cc = self.cppc if ext == ".cpp" else self.cc
|
||||
command = cc + ['-D%s' % s for s in self.get_symbols()] + ["-I%s" % i for i in includes] + ["-o", object, source]
|
||||
|
||||
if hasattr(self, "get_dep_opt"):
|
||||
|
@ -627,20 +603,11 @@ class mbedToolchain:
|
|||
|
||||
return [command]
|
||||
|
||||
def compile(self, source, object, includes):
|
||||
self.progress("compile", source, build_update=True)
|
||||
|
||||
commands = self._compile(source, object, includes)
|
||||
for command in commands:
|
||||
self.debug("Command: %s" % ' '.join(command))
|
||||
_, stderr, rc = run_cmd(command, dirname(object))
|
||||
self._compile_output([rc, stderr, command])
|
||||
|
||||
def compile_c(self, source, object, includes):
|
||||
self.compile(source, object, includes)
|
||||
return self.compile(self.cc, source, object, includes)
|
||||
|
||||
def compile_cpp(self, source, object, includes):
|
||||
self.compile(source, object, includes)
|
||||
return self.compile(self.cppc, source, object, includes)
|
||||
|
||||
def build_library(self, objects, dir, name):
|
||||
lib = self.STD_LIB_NAME % name
|
||||
|
@ -672,10 +639,6 @@ class mbedToolchain:
|
|||
|
||||
self.binary(r, elf, bin)
|
||||
|
||||
if self.target.name.startswith('LPC'):
|
||||
self.debug("LPC Patch: %s" % filename)
|
||||
patch(bin)
|
||||
|
||||
self.var("compile_succeded", True)
|
||||
self.var("binary", filename)
|
||||
|
||||
|
|
|
@ -80,7 +80,7 @@ class ARM(mbedToolchain):
|
|||
if option in tool:
|
||||
tool.remove(option)
|
||||
|
||||
def _assemble(self, source, object, includes):
|
||||
def assemble(self, source, object, includes):
|
||||
# Preprocess first, then assemble
|
||||
tempfile = object + '.E.s'
|
||||
return [
|
||||
|
@ -88,11 +88,6 @@ class ARM(mbedToolchain):
|
|||
self.hook.get_cmdline_assembler(self.asm + ["-o", object, tempfile])
|
||||
]
|
||||
|
||||
def assemble(self, source, object, includes):
|
||||
commands = self._assemble(source, object, includes);
|
||||
for command in commands:
|
||||
self.default_cmd(command)
|
||||
|
||||
def parse_dependencies(self, dep_path):
|
||||
dependencies = []
|
||||
for line in open(dep_path).readlines():
|
||||
|
|
|
@ -20,6 +20,7 @@ from os.path import join, basename, splitext
|
|||
from workspace_tools.toolchains import mbedToolchain
|
||||
from workspace_tools.settings import GCC_ARM_PATH, GCC_CR_PATH, GCC_CS_PATH, CW_EWL_PATH, CW_GCC_PATH
|
||||
from workspace_tools.settings import GOANNA_PATH
|
||||
from workspace_tools.hooks import hook_tool
|
||||
|
||||
class GCC(mbedToolchain):
|
||||
LINKER_EXT = '.ld'
|
||||
|
@ -81,13 +82,8 @@ class GCC(mbedToolchain):
|
|||
self.ar = join(tool_path, "arm-none-eabi-ar")
|
||||
self.elf2bin = join(tool_path, "arm-none-eabi-objcopy")
|
||||
|
||||
def _assemble(self, source, object, includes):
|
||||
return [self.hook.get_cmdline_assembler(self.asm + ['-D%s' % s for s in self.get_symbols() + self.macros] + ["-I%s" % i for i in includes] + ["-o", object, source])]
|
||||
|
||||
def assemble(self, source, object, includes):
|
||||
commands = self._assemble(source, object, includes);
|
||||
for command in commands:
|
||||
self.default_cmd(command)
|
||||
return [self.hook.get_cmdline_assembler(self.asm + ['-D%s' % s for s in self.get_symbols() + self.macros] + ["-I%s" % i for i in includes] + ["-o", object, source])]
|
||||
|
||||
def parse_dependencies(self, dep_path):
|
||||
dependencies = []
|
||||
|
@ -168,6 +164,7 @@ class GCC(mbedToolchain):
|
|||
self.default_cmd(self.hook.get_cmdline_linker(self.ld + ["-T%s" % mem_map, "-o", output] +
|
||||
objects + ["-L%s" % L for L in lib_dirs] + libs))
|
||||
|
||||
@hook_tool
|
||||
def binary(self, resources, elf, bin):
|
||||
self.default_cmd(self.hook.get_cmdline_binary([self.elf2bin, "-O", "binary", elf, bin]))
|
||||
|
||||
|
|
|
@ -21,6 +21,7 @@ from os.path import join, exists
|
|||
from workspace_tools.toolchains import mbedToolchain
|
||||
from workspace_tools.settings import IAR_PATH
|
||||
from workspace_tools.settings import GOANNA_PATH
|
||||
from workspace_tools.hooks import hook_tool
|
||||
|
||||
class IAR(mbedToolchain):
|
||||
LIBRARY_EXT = '.a'
|
||||
|
@ -94,13 +95,8 @@ class IAR(mbedToolchain):
|
|||
return [path.strip() for path in open(dep_path).readlines()
|
||||
if (path and not path.isspace())]
|
||||
|
||||
def _assemble(self, source, object, includes):
|
||||
return [self.hook.get_cmdline_assembler(self.asm + ['-D%s' % s for s in self.get_symbols() + self.macros] + ["-I%s" % i for i in includes] + ["-o", object, source])]
|
||||
|
||||
def assemble(self, source, object, includes):
|
||||
commands = self._assemble(source, object, includes);
|
||||
for command in commands:
|
||||
self.default_cmd(command)
|
||||
return [self.hook.get_cmdline_assembler(self.asm + ['-D%s' % s for s in self.get_symbols() + self.macros] + ["-I%s" % i for i in includes] + ["-o", object, source])]
|
||||
|
||||
def archive(self, objects, lib_path):
|
||||
if exists(lib_path):
|
||||
|
@ -111,5 +107,6 @@ class IAR(mbedToolchain):
|
|||
args = [self.ld, "-o", output, "--config", mem_map]
|
||||
self.default_cmd(self.hook.get_cmdline_linker(args + objects + libraries))
|
||||
|
||||
@hook_tool
|
||||
def binary(self, resources, elf, bin):
|
||||
self.default_cmd(self.hook.get_cmdline_binary([self.elf2bin, '--bin', elf, bin]))
|
||||
|
|
Loading…
Reference in New Issue