mirror of
https://github.com/espressif/esp-nimble.git
synced 2026-08-26 20:00:02 +00:00
porting: Add dummy NPL
This commit is contained in:
@@ -0,0 +1,35 @@
|
||||
# Configure NimBLE variables
|
||||
NIMBLE_ROOT := ../../..
|
||||
NIMBLE_CFG_TINYCRYPT := 1
|
||||
include $(NIMBLE_ROOT)/porting/nimble/Makefile.defs
|
||||
|
||||
# Add dummy NPL, dummy HCI transport and all NimBLE sources to build
|
||||
SRC = \
|
||||
$(NIMBLE_ROOT)/porting/npl/dummy/src/npl_os_dummy.c \
|
||||
$(NIMBLE_ROOT)/porting/npl/dummy/src/hci_dummy.c \
|
||||
$(NIMBLE_SRC) \
|
||||
main.c \
|
||||
|
||||
# Add dummy NPL and all NimBLE directories to include paths
|
||||
INC = \
|
||||
$(NIMBLE_ROOT)/porting/npl/dummy/include \
|
||||
$(NIMBLE_INCLUDE) \
|
||||
|
||||
OBJ := $(SRC:.c=.o)
|
||||
|
||||
CFLAGS := $(NIMBLE_CFLAGS) -DBLE_NPL_STORAGE_DECL=
|
||||
|
||||
.PHONY: all clean
|
||||
.DEFAULT: all
|
||||
|
||||
all: dummy
|
||||
|
||||
clean:
|
||||
rm $(OBJ) -f
|
||||
rm dummy -f
|
||||
|
||||
%.o: %.c
|
||||
$(CC) -m32 -c $(addprefix -I, $(INC)) $(CFLAGS) -o $@ $<
|
||||
|
||||
dummy: $(OBJ)
|
||||
$(CC) -m32 -o $@ $^
|
||||
@@ -0,0 +1,8 @@
|
||||
#include "nimble/nimble_port.h"
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
nimble_port_init();
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
NIMBLE_CFLAGS += \
|
||||
-DNIMBLE_CFG_CONTROLLER=1 \
|
||||
|
||||
NIMBLE_INCLUDE += \
|
||||
$(NIMBLE_ROOT)/nimble/transport/ram/include \
|
||||
$(NIMBLE_ROOT)/nimble/controller/include \
|
||||
$(NIMBLE_ROOT)/nimble/drivers/nrf52/include \
|
||||
|
||||
NIMBLE_SRC += \
|
||||
$(NIMBLE_ROOT)/nimble/transport/ram/src/ble_hci_ram.c \
|
||||
$(NIMBLE_ROOT)/nimble/controller/src/ble_ll_sched.c \
|
||||
$(NIMBLE_ROOT)/nimble/controller/src/ble_ll_xcvr.c \
|
||||
$(NIMBLE_ROOT)/nimble/controller/src/ble_ll_whitelist.c \
|
||||
$(NIMBLE_ROOT)/nimble/controller/src/ble_ll_ctrl.c \
|
||||
$(NIMBLE_ROOT)/nimble/controller/src/ble_ll_hci.c \
|
||||
$(NIMBLE_ROOT)/nimble/controller/src/ble_ll_supp_cmd.c \
|
||||
$(NIMBLE_ROOT)/nimble/controller/src/ble_ll_adv.c \
|
||||
$(NIMBLE_ROOT)/nimble/controller/src/ble_ll_conn.c \
|
||||
$(NIMBLE_ROOT)/nimble/controller/src/ble_ll_resolv.c \
|
||||
$(NIMBLE_ROOT)/nimble/controller/src/ble_ll_conn_hci.c \
|
||||
$(NIMBLE_ROOT)/nimble/controller/src/ble_ll_rand.c \
|
||||
$(NIMBLE_ROOT)/nimble/controller/src/ble_ll.c \
|
||||
$(NIMBLE_ROOT)/nimble/controller/src/ble_ll_scan.c \
|
||||
$(NIMBLE_ROOT)/nimble/controller/src/ble_ll_dtm.c \
|
||||
$(NIMBLE_ROOT)/nimble/controller/src/ble_ll_hci_ev.c \
|
||||
$(NIMBLE_ROOT)/nimble/drivers/nrf52/src/ble_hw.c \
|
||||
$(NIMBLE_ROOT)/nimble/drivers/nrf52/src/ble_phy.c \
|
||||
$(NIMBLE_ROOT)/porting/nimble/src/os_cputime.c \
|
||||
$(NIMBLE_ROOT)/porting/nimble/src/os_cputime_pwr2.c \
|
||||
$(NIMBLE_ROOT)/porting/nimble/src/hal_timer.c \
|
||||
@@ -0,0 +1,96 @@
|
||||
ifeq (,$(NIMBLE_ROOT))
|
||||
$(error NIMBLE_ROOT shall be defined)
|
||||
endif
|
||||
|
||||
NIMBLE_CFLAGS :=
|
||||
|
||||
NIMBLE_INCLUDE := \
|
||||
$(NIMBLE_ROOT)/nimble/include \
|
||||
$(NIMBLE_ROOT)/nimble/host/include \
|
||||
$(NIMBLE_ROOT)/nimble/host/services/ans/include \
|
||||
$(NIMBLE_ROOT)/nimble/host/services/bas/include \
|
||||
$(NIMBLE_ROOT)/nimble/host/services/bleuart/include \
|
||||
$(NIMBLE_ROOT)/nimble/host/services/gap/include \
|
||||
$(NIMBLE_ROOT)/nimble/host/services/gatt/include \
|
||||
$(NIMBLE_ROOT)/nimble/host/services/ias/include \
|
||||
$(NIMBLE_ROOT)/nimble/host/services/lls/include \
|
||||
$(NIMBLE_ROOT)/nimble/host/services/tps/include \
|
||||
$(NIMBLE_ROOT)/nimble/host/store/ram/include \
|
||||
$(NIMBLE_ROOT)/nimble/host/util/include \
|
||||
$(NIMBLE_ROOT)/porting/nimble/include \
|
||||
|
||||
NIMBLE_SRC := \
|
||||
$(NIMBLE_ROOT)/nimble/host/src/ble_att.c \
|
||||
$(NIMBLE_ROOT)/nimble/host/src/ble_att_clt.c \
|
||||
$(NIMBLE_ROOT)/nimble/host/src/ble_att_cmd.c \
|
||||
$(NIMBLE_ROOT)/nimble/host/src/ble_att_svr.c \
|
||||
$(NIMBLE_ROOT)/nimble/host/src/ble_eddystone.c \
|
||||
$(NIMBLE_ROOT)/nimble/host/src/ble_gap.c \
|
||||
$(NIMBLE_ROOT)/nimble/host/src/ble_gattc.c \
|
||||
$(NIMBLE_ROOT)/nimble/host/src/ble_gatts.c \
|
||||
$(NIMBLE_ROOT)/nimble/host/src/ble_hs_adv.c \
|
||||
$(NIMBLE_ROOT)/nimble/host/src/ble_hs_atomic.c \
|
||||
$(NIMBLE_ROOT)/nimble/host/src/ble_hs.c \
|
||||
$(NIMBLE_ROOT)/nimble/host/src/ble_hs_cfg.c \
|
||||
$(NIMBLE_ROOT)/nimble/host/src/ble_hs_conn.c \
|
||||
$(NIMBLE_ROOT)/nimble/host/src/ble_hs_dbg.c \
|
||||
$(NIMBLE_ROOT)/nimble/host/src/ble_hs_flow.c \
|
||||
$(NIMBLE_ROOT)/nimble/host/src/ble_hs_hci.c \
|
||||
$(NIMBLE_ROOT)/nimble/host/src/ble_hs_hci_cmd.c \
|
||||
$(NIMBLE_ROOT)/nimble/host/src/ble_hs_hci_evt.c \
|
||||
$(NIMBLE_ROOT)/nimble/host/src/ble_hs_hci_util.c \
|
||||
$(NIMBLE_ROOT)/nimble/host/src/ble_hs_id.c \
|
||||
$(NIMBLE_ROOT)/nimble/host/src/ble_hs_log.c \
|
||||
$(NIMBLE_ROOT)/nimble/host/src/ble_hs_mbuf.c \
|
||||
$(NIMBLE_ROOT)/nimble/host/src/ble_hs_mqueue.c \
|
||||
$(NIMBLE_ROOT)/nimble/host/src/ble_hs_misc.c \
|
||||
$(NIMBLE_ROOT)/nimble/host/src/ble_hs_pvcy.c \
|
||||
$(NIMBLE_ROOT)/nimble/host/src/ble_hs_startup.c \
|
||||
$(NIMBLE_ROOT)/nimble/host/src/ble_ibeacon.c \
|
||||
$(NIMBLE_ROOT)/nimble/host/src/ble_l2cap.c \
|
||||
$(NIMBLE_ROOT)/nimble/host/src/ble_l2cap_coc.c \
|
||||
$(NIMBLE_ROOT)/nimble/host/src/ble_l2cap_sig.c \
|
||||
$(NIMBLE_ROOT)/nimble/host/src/ble_l2cap_sig_cmd.c \
|
||||
$(NIMBLE_ROOT)/nimble/host/src/ble_monitor.c \
|
||||
$(NIMBLE_ROOT)/nimble/host/src/ble_sm_alg.c \
|
||||
$(NIMBLE_ROOT)/nimble/host/src/ble_sm.c \
|
||||
$(NIMBLE_ROOT)/nimble/host/src/ble_sm_cmd.c \
|
||||
$(NIMBLE_ROOT)/nimble/host/src/ble_sm_lgcy.c \
|
||||
$(NIMBLE_ROOT)/nimble/host/src/ble_sm_sc.c \
|
||||
$(NIMBLE_ROOT)/nimble/host/src/ble_store.c \
|
||||
$(NIMBLE_ROOT)/nimble/host/src/ble_store_util.c \
|
||||
$(NIMBLE_ROOT)/nimble/host/src/ble_uuid.c \
|
||||
$(NIMBLE_ROOT)/nimble/host/services/ans/src/ble_svc_ans.c \
|
||||
$(NIMBLE_ROOT)/nimble/host/services/bas/src/ble_svc_bas.c \
|
||||
$(NIMBLE_ROOT)/nimble/host/services/gap/src/ble_svc_gap.c \
|
||||
$(NIMBLE_ROOT)/nimble/host/services/gatt/src/ble_svc_gatt.c \
|
||||
$(NIMBLE_ROOT)/nimble/host/services/ias/src/ble_svc_ias.c \
|
||||
$(NIMBLE_ROOT)/nimble/host/services/lls/src/ble_svc_lls.c \
|
||||
$(NIMBLE_ROOT)/nimble/host/services/tps/src/ble_svc_tps.c \
|
||||
$(NIMBLE_ROOT)/nimble/host/store/ram/src/ble_store_ram.c \
|
||||
$(NIMBLE_ROOT)/nimble/host/util/src/addr.c \
|
||||
$(NIMBLE_ROOT)/nimble/src/ble_util.c \
|
||||
$(NIMBLE_ROOT)/nimble/src/hci_common.c \
|
||||
|
||||
# Few utils and data structures copied from Mynewt
|
||||
NIMBLE_SRC += \
|
||||
$(NIMBLE_ROOT)/porting/nimble/src/nimble_port.c \
|
||||
|
||||
# Few utils and data structures copied from Mynewt
|
||||
NIMBLE_SRC += \
|
||||
$(NIMBLE_ROOT)/porting/nimble/src/endian.c \
|
||||
$(NIMBLE_ROOT)/porting/nimble/src/mem.c \
|
||||
$(NIMBLE_ROOT)/porting/nimble/src/os_mbuf.c \
|
||||
$(NIMBLE_ROOT)/porting/nimble/src/os_mempool.c \
|
||||
$(NIMBLE_ROOT)/porting/nimble/src/os_msys_init.c \
|
||||
|
||||
ifneq (,$(NIMBLE_CFG_CONTROLLER))
|
||||
include $(NIMBLE_ROOT)/porting/nimble/Makefile.controller
|
||||
endif
|
||||
|
||||
# TinyCrypt (for SM)
|
||||
ifneq (,$(NIMBLE_CFG_TINYCRYPT))
|
||||
include $(NIMBLE_ROOT)/porting/nimble/Makefile.tinycrypt
|
||||
endif
|
||||
|
||||
NIMBLE_OBJ := $(NIMBLE_SRC:.c=.o)
|
||||
@@ -0,0 +1,10 @@
|
||||
NIMBLE_INCLUDE += \
|
||||
$(NIMBLE_ROOT)/ext/tinycrypt/include \
|
||||
|
||||
NIMBLE_SRC += \
|
||||
$(NIMBLE_ROOT)/ext/tinycrypt/src/aes_decrypt.c \
|
||||
$(NIMBLE_ROOT)/ext/tinycrypt/src/aes_encrypt.c \
|
||||
$(NIMBLE_ROOT)/ext/tinycrypt/src/cmac_mode.c \
|
||||
$(NIMBLE_ROOT)/ext/tinycrypt/src/ecc.c \
|
||||
$(NIMBLE_ROOT)/ext/tinycrypt/src/ecc_dh.c \
|
||||
$(NIMBLE_ROOT)/ext/tinycrypt/src/utils.c \
|
||||
@@ -0,0 +1,173 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* @addtogroup HAL
|
||||
* @{
|
||||
* @defgroup HALTimer HAL Timer
|
||||
* @{
|
||||
*/
|
||||
|
||||
#ifndef H_HAL_TIMER_
|
||||
#define H_HAL_TIMER_
|
||||
|
||||
#include <inttypes.h>
|
||||
#include "os/queue.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* HAL timer callback */
|
||||
typedef void (*hal_timer_cb)(void *arg);
|
||||
|
||||
/**
|
||||
* The HAL timer structure. The user can declare as many of these structures
|
||||
* as desired. They are enqueued on a particular HW timer queue when the user
|
||||
* calls the :c:func:`hal_timer_start()` or :c:func:`hal_timer_start_at()` API.
|
||||
* The user must have called :c:func:`hal_timer_set_cb()` before starting a
|
||||
* timer.
|
||||
*
|
||||
* NOTE: the user should not have to modify/examine the contents of this
|
||||
* structure; the hal timer API should be used.
|
||||
*/
|
||||
struct hal_timer {
|
||||
/** Internal platform specific pointer */
|
||||
void *bsp_timer;
|
||||
/** Callback function */
|
||||
hal_timer_cb cb_func;
|
||||
/** Callback argument */
|
||||
void *cb_arg;
|
||||
/** Tick at which timer should expire */
|
||||
uint32_t expiry;
|
||||
TAILQ_ENTRY(hal_timer) link; /* Queue linked list structure */
|
||||
};
|
||||
|
||||
/**
|
||||
* Initialize a HW timer.
|
||||
*
|
||||
* @param timer_num The number of the HW timer to initialize
|
||||
* @param cfg Hardware specific timer configuration. This is
|
||||
* passed from BSP directly to the MCU specific driver.
|
||||
*/
|
||||
int hal_timer_init(int timer_num, void *cfg);
|
||||
|
||||
/**
|
||||
* Un-initialize a HW timer.
|
||||
*
|
||||
* @param timer_num The number of the HW timer to un-initialize
|
||||
*/
|
||||
int hal_timer_deinit(int timer_num);
|
||||
|
||||
/**
|
||||
* Config a HW timer at the given frequency and start it. If the exact
|
||||
* frequency is not obtainable the closest obtainable frequency is set.
|
||||
*
|
||||
* @param timer_num The number of the HW timer to configure
|
||||
* @param freq_hz The frequency in Hz to configure the timer at
|
||||
*
|
||||
* @return 0 on success, non-zero error code on failure
|
||||
*/
|
||||
int hal_timer_config(int timer_num, uint32_t freq_hz);
|
||||
|
||||
/**
|
||||
* Returns the resolution of the HW timer. NOTE: the frequency may not be
|
||||
* obtainable so the caller can use this to determine the resolution.
|
||||
* Returns resolution in nanoseconds. A return value of 0 indicates an invalid
|
||||
* timer was used.
|
||||
*
|
||||
* @param timer_num The number of the HW timer to get resolution for
|
||||
*
|
||||
* @return The resolution of the timer
|
||||
*/
|
||||
uint32_t hal_timer_get_resolution(int timer_num);
|
||||
|
||||
/**
|
||||
* Returns the HW timer current tick value
|
||||
*
|
||||
* @param timer_num The HW timer to read the tick value from
|
||||
*
|
||||
* @return The current tick value
|
||||
*/
|
||||
uint32_t hal_timer_read(int timer_num);
|
||||
|
||||
/**
|
||||
* Perform a blocking delay for a number of ticks.
|
||||
*
|
||||
* @param timer_num The timer number to use for the blocking delay
|
||||
* @param ticks The number of ticks to delay for
|
||||
*
|
||||
* @return 0 on success, non-zero error code on failure
|
||||
*/
|
||||
int hal_timer_delay(int timer_num, uint32_t ticks);
|
||||
|
||||
/**
|
||||
* Set the timer structure prior to use. Should not be called if the timer
|
||||
* is running. Must be called at least once prior to using timer.
|
||||
*
|
||||
* @param timer_num The number of the HW timer to configure the callback on
|
||||
* @param tmr The timer structure to use for this timer
|
||||
* @param cb_func The timer callback to call when the timer fires
|
||||
* @param arg An opaque argument to provide the timer callback
|
||||
*
|
||||
* @return 0 on success, non-zero error code on failure.
|
||||
*/
|
||||
int hal_timer_set_cb(int timer_num, struct hal_timer *tmr, hal_timer_cb cb_func,
|
||||
void *arg);
|
||||
|
||||
/**
|
||||
* Start a timer that will expire in 'ticks' ticks. Ticks cannot be 0
|
||||
*
|
||||
* @param tmr The timer to start
|
||||
* @param ticks The number of ticks to expire the timer in
|
||||
*
|
||||
* @return 0 on success, non-zero error code on failure.
|
||||
*/
|
||||
int hal_timer_start(struct hal_timer *tmr, uint32_t ticks);
|
||||
|
||||
/**
|
||||
* Start a timer that will expire when the timer reaches 'tick'. If tick
|
||||
* has already passed the timer callback will be called "immediately" (at
|
||||
* interrupt context).
|
||||
*
|
||||
* @param tmr The timer to start
|
||||
* @param tick The absolute tick value to fire the timer at
|
||||
*
|
||||
* @return 0 on success, non-zero error code on failure.
|
||||
*/
|
||||
int hal_timer_start_at(struct hal_timer *tmr, uint32_t tick);
|
||||
|
||||
/**
|
||||
* Stop a currently running timer; associated callback will NOT be called
|
||||
*
|
||||
* @param tmr The timer to stop
|
||||
*/
|
||||
int hal_timer_stop(struct hal_timer *tmr);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* H_HAL_TIMER_ */
|
||||
|
||||
/**
|
||||
* @} HALTimer
|
||||
* @} HAL
|
||||
*/
|
||||
@@ -0,0 +1,45 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
#ifndef __LOG_H__
|
||||
#define __LOG_H__
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
static inline void
|
||||
log_dummy(void *log, ...)
|
||||
{
|
||||
}
|
||||
|
||||
#define LOG_DEBUG(_log, _mod, ...) log_dummy(_log, ## __VA_ARGS__)
|
||||
#define LOG_INFO(_log, _mod, ...) log_dummy(_log, ## __VA_ARGS__)
|
||||
#define LOG_WARN(_log, _mod, ...) log_dummy(_log, ## __VA_ARGS__)
|
||||
#define LOG_ERROR(_log, _mod, ...) log_dummy(_log, ## __VA_ARGS__)
|
||||
#define LOG_CRITICAL(_log, _mod, ...) log_dummy(_log, ## __VA_ARGS__)
|
||||
|
||||
struct log {
|
||||
};
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __LOG_H__ */
|
||||
@@ -0,0 +1,68 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
#ifndef H_UTIL_MEM_
|
||||
#define H_UTIL_MEM_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
struct os_mempool;
|
||||
struct os_mbuf_pool;
|
||||
|
||||
int mem_malloc_mempool(struct os_mempool *mempool, uint16_t num_blocks,
|
||||
uint32_t block_size, char *name, void **out_buf);
|
||||
int mem_malloc_mempool_ext(struct os_mempool_ext *mempool, uint16_t num_blocks,
|
||||
uint32_t block_size, char *name, void **out_buf);
|
||||
|
||||
int mem_malloc_mbuf_pool(struct os_mempool *mempool,
|
||||
struct os_mbuf_pool *mbuf_pool, uint16_t num_blocks,
|
||||
uint32_t block_size, char *name,
|
||||
void **out_buf);
|
||||
int mem_malloc_mbufpkt_pool(struct os_mempool *mempool,
|
||||
struct os_mbuf_pool *mbuf_pool, int num_blocks,
|
||||
int block_size, char *name,
|
||||
void **out_buf);
|
||||
int mem_init_mbuf_pool(void *mem, struct os_mempool *mempool,
|
||||
struct os_mbuf_pool *mbuf_pool, int num_blocks,
|
||||
int block_size, char *name);
|
||||
|
||||
/**
|
||||
* Specifies a function used as a callback. Functions of this type allocate an
|
||||
* mbuf chain meant to hold a packet fragment. The resulting mbuf must contain
|
||||
* a pkthdr.
|
||||
*
|
||||
* @param frag_size The number of data bytes that the mbuf will
|
||||
* eventually contain.
|
||||
* @param arg A generic parameter.
|
||||
*
|
||||
* @return An allocated mbuf chain on success;
|
||||
* NULL on failure.
|
||||
*/
|
||||
typedef struct os_mbuf *mem_frag_alloc_fn(uint16_t frag_size, void *arg);
|
||||
|
||||
struct os_mbuf *mem_split_frag(struct os_mbuf **om, uint16_t max_frag_sz,
|
||||
mem_frag_alloc_fn *alloc_cb, void *cb_arg);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,37 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
#ifndef _NIMBLE_PORT_H
|
||||
#define _NIMBLE_PORT_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
void nimble_port_init(void);
|
||||
|
||||
#if NIMBLE_CFG_CONTROLLER
|
||||
void nimble_port_ll_task_func(void *arg);
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _NIMBLE_PORT_H */
|
||||
@@ -0,0 +1,225 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
#ifndef H_ENDIAN_
|
||||
#define H_ENDIAN_
|
||||
|
||||
#include <inttypes.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Internal helpers */
|
||||
#ifndef os_bswap_64
|
||||
#define os_bswap_64(x) ((uint64_t) \
|
||||
((((x) & 0xff00000000000000ull) >> 56) | \
|
||||
(((x) & 0x00ff000000000000ull) >> 40) | \
|
||||
(((x) & 0x0000ff0000000000ull) >> 24) | \
|
||||
(((x) & 0x000000ff00000000ull) >> 8) | \
|
||||
(((x) & 0x00000000ff000000ull) << 8) | \
|
||||
(((x) & 0x0000000000ff0000ull) << 24) | \
|
||||
(((x) & 0x000000000000ff00ull) << 40) | \
|
||||
(((x) & 0x00000000000000ffull) << 56)))
|
||||
#endif
|
||||
|
||||
#ifndef os_bswap_32
|
||||
#define os_bswap_32(x) ((uint32_t) \
|
||||
((((x) & 0xff000000) >> 24) | \
|
||||
(((x) & 0x00ff0000) >> 8) | \
|
||||
(((x) & 0x0000ff00) << 8) | \
|
||||
(((x) & 0x000000ff) << 24)))
|
||||
#endif
|
||||
|
||||
#ifndef os_bswap_16
|
||||
#define os_bswap_16(x) ((uint16_t) \
|
||||
((((x) & 0xff00) >> 8) | \
|
||||
(((x) & 0x00ff) << 8)))
|
||||
#endif
|
||||
|
||||
#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
|
||||
|
||||
#ifndef ntohll
|
||||
#define ntohll(x) ((uint64_t)(x))
|
||||
#endif
|
||||
|
||||
#ifndef htonll
|
||||
#define htonll(x) ((uint64_t)(x))
|
||||
#endif
|
||||
|
||||
#ifndef ntohl
|
||||
#define ntohl(x) ((uint32_t)(x))
|
||||
#endif
|
||||
|
||||
#ifndef htonl
|
||||
#define htonl(x) ((uint32_t)(x))
|
||||
#endif
|
||||
|
||||
#ifndef ntohs
|
||||
#define ntohs(x) ((uint16_t)(x))
|
||||
#endif
|
||||
|
||||
#ifndef htons
|
||||
#define htons(x) ((uint16_t)(x))
|
||||
#endif
|
||||
|
||||
#ifndef htobe16
|
||||
#define htobe16(x) ((uint16_t)(x))
|
||||
#endif
|
||||
|
||||
#ifndef htole16
|
||||
#define htole16(x) os_bswap_16 (x)
|
||||
#endif
|
||||
|
||||
#ifndef be16toh
|
||||
#define be16toh(x) ((uint16_t)(x))
|
||||
#endif
|
||||
|
||||
#ifndef le16toh
|
||||
#define le16toh(x) os_bswap_16 (x)
|
||||
#endif
|
||||
|
||||
#ifndef htobe32
|
||||
#define htobe32(x) ((uint32_t)(x))
|
||||
#endif
|
||||
|
||||
#ifndef htole32
|
||||
#define htole32(x) os_bswap_32 (x)
|
||||
#endif
|
||||
|
||||
#ifndef be32toh
|
||||
#define be32toh(x) ((uint32_t)(x))
|
||||
#endif
|
||||
|
||||
#ifndef le32toh
|
||||
#define le32toh(x) os_bswap_32 (x)
|
||||
#endif
|
||||
|
||||
#ifndef htobe64
|
||||
#define htobe64(x) ((uint64_t)(x))
|
||||
#endif
|
||||
|
||||
#ifndef htole64
|
||||
#define htole64(x) os_bswap_64 (x)
|
||||
#endif
|
||||
|
||||
#ifndef be64toh
|
||||
#define be64toh(x) ((uint64_t)(x))
|
||||
#endif
|
||||
|
||||
#ifndef le64toh
|
||||
#define le64toh(x) os_bswap_64 (x)
|
||||
#endif
|
||||
|
||||
#else
|
||||
|
||||
#ifndef ntohll
|
||||
#define ntohll(x) os_bswap_64(x)
|
||||
#endif
|
||||
|
||||
#ifndef htonll
|
||||
#define htonll ntohll
|
||||
#endif
|
||||
|
||||
#ifndef ntohl
|
||||
#define ntohl(x) os_bswap_32(x)
|
||||
#endif
|
||||
|
||||
#ifndef htonl
|
||||
#define htonl ntohl
|
||||
#endif
|
||||
|
||||
#ifndef htons
|
||||
#define htons(x) os_bswap_16(x)
|
||||
#endif
|
||||
|
||||
#ifndef ntohs
|
||||
#define ntohs htons
|
||||
#endif
|
||||
|
||||
#ifndef htobe16
|
||||
#define htobe16(x) os_bswap_16(x)
|
||||
#endif
|
||||
|
||||
#ifndef htole16
|
||||
#define htole16(x) ((uint16_t)(x))
|
||||
#endif
|
||||
|
||||
#ifndef be16toh
|
||||
#define be16toh(x) os_bswap_16(x)
|
||||
#endif
|
||||
|
||||
#ifndef le16toh
|
||||
#define le16toh(x) ((uint16_t)(x))
|
||||
#endif
|
||||
|
||||
#ifndef htobe32
|
||||
#define htobe32(x) os_bswap_32(x)
|
||||
#endif
|
||||
|
||||
#ifndef htole32
|
||||
#define htole32(x) ((uint32_t)(x))
|
||||
#endif
|
||||
|
||||
#ifndef be32toh
|
||||
#define be32toh(x) os_bswap_32(x)
|
||||
#endif
|
||||
|
||||
#ifndef le32toh
|
||||
#define le32toh(x) ((uint32_t)(x))
|
||||
#endif
|
||||
|
||||
#ifndef htobe64
|
||||
#define htobe64(x) os_bswap64(x)
|
||||
#endif
|
||||
|
||||
#ifndef htole64
|
||||
#define htole64(x) ((uint64_t)(x))
|
||||
#endif
|
||||
|
||||
#ifndef be64toh
|
||||
#define be64toh(x) os_bswap64(x)
|
||||
#endif
|
||||
|
||||
#ifndef le64toh
|
||||
#define le64toh(x) ((uint64_t)(x))
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
void put_le16(void *buf, uint16_t x);
|
||||
void put_le32(void *buf, uint32_t x);
|
||||
void put_le64(void *buf, uint64_t x);
|
||||
uint16_t get_le16(const void *buf);
|
||||
uint32_t get_le32(const void *buf);
|
||||
uint64_t get_le64(const void *buf);
|
||||
void put_be16(void *buf, uint16_t x);
|
||||
void put_be32(void *buf, uint32_t x);
|
||||
void put_be64(void *buf, uint64_t x);
|
||||
uint16_t get_be16(const void *buf);
|
||||
uint32_t get_be32(const void *buf);
|
||||
uint64_t get_be64(const void *buf);
|
||||
void swap_in_place(void *buf, int len);
|
||||
void swap_buf(uint8_t *dst, const uint8_t *src, int len);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,60 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
#ifndef _OS_H
|
||||
#define _OS_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#ifndef min
|
||||
#define min(a, b) ((a)<(b)?(a):(b))
|
||||
#endif
|
||||
|
||||
#ifndef max
|
||||
#define max(a, b) ((a)>(b)?(a):(b))
|
||||
#endif
|
||||
|
||||
#include "syscfg/syscfg.h"
|
||||
#include "nimble/nimble_npl.h"
|
||||
|
||||
#define OS_ALIGN(__n, __a) ( \
|
||||
(((__n) & ((__a) - 1)) == 0) ? \
|
||||
(__n) : \
|
||||
((__n) + ((__a) - ((__n) & ((__a) - 1)))) \
|
||||
)
|
||||
#define OS_ALIGNMENT (BLE_NPL_OS_ALIGNMENT)
|
||||
|
||||
typedef uint32_t os_sr_t;
|
||||
#define OS_ENTER_CRITICAL(_sr) (_sr = ble_npl_hw_enter_critical())
|
||||
#define OS_EXIT_CRITICAL(_sr) (ble_npl_hw_exit_critical(_sr))
|
||||
|
||||
/* Mynewt components (not abstracted in NPL) */
|
||||
#include "os/endian.h"
|
||||
#include "os/queue.h"
|
||||
#include "os/os_error.h"
|
||||
#include "os/os_mbuf.h"
|
||||
#include "os/os_mempool.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _OS_H */
|
||||
@@ -0,0 +1,240 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @addtogroup OSKernel
|
||||
* @{
|
||||
* @defgroup OSCPUTime High Resolution Timers
|
||||
* @{
|
||||
*/
|
||||
|
||||
#ifndef H_OS_CPUTIME_
|
||||
#define H_OS_CPUTIME_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "syscfg/syscfg.h"
|
||||
#include "hal/hal_timer.h"
|
||||
#include "os/os.h"
|
||||
|
||||
/*
|
||||
* NOTE: these definitions allow one to override the cputime frequency used.
|
||||
* The reason these definitions exist is to make the code more
|
||||
* efficient/smaller when CPUTIME counts at 1 MHz.
|
||||
*
|
||||
* For those who want a different cputime frequency, you can set the config
|
||||
* definition for OS_CPUTIME_FREQ to the desired frequency in your project,
|
||||
* target or bsp.
|
||||
*/
|
||||
#if (MYNEWT_VAL(OS_CPUTIME_FREQ) == 1000000)
|
||||
|
||||
#define OS_CPUTIME_FREQ_1MHZ
|
||||
|
||||
#elif MYNEWT_VAL(OS_CPUTIME_FREQ) == 256 || \
|
||||
MYNEWT_VAL(OS_CPUTIME_FREQ) == 512 || \
|
||||
MYNEWT_VAL(OS_CPUTIME_FREQ) == 1024 || \
|
||||
MYNEWT_VAL(OS_CPUTIME_FREQ) == 2048 || \
|
||||
MYNEWT_VAL(OS_CPUTIME_FREQ) == 4096 || \
|
||||
MYNEWT_VAL(OS_CPUTIME_FREQ) == 8192 || \
|
||||
MYNEWT_VAL(OS_CPUTIME_FREQ) == 16384 || \
|
||||
MYNEWT_VAL(OS_CPUTIME_FREQ) == 32768 || \
|
||||
MYNEWT_VAL(OS_CPUTIME_FREQ) == 65536 || \
|
||||
MYNEWT_VAL(OS_CPUTIME_FREQ) == 131072 || \
|
||||
MYNEWT_VAL(OS_CPUTIME_FREQ) == 262144 || \
|
||||
MYNEWT_VAL(OS_CPUTIME_FREQ) == 524288
|
||||
|
||||
#define OS_CPUTIME_FREQ_PWR2
|
||||
|
||||
#elif MYNEWT_VAL(OS_CPUTIME_FREQ) > 1000000
|
||||
|
||||
#define OS_CPUTIME_FREQ_HIGH
|
||||
|
||||
#else
|
||||
|
||||
#error "Invalid OS_CPUTIME_FREQ value. Value must be one of a) a power of 2" \
|
||||
">= 256Hz, or b) any value >= 1MHz"
|
||||
|
||||
#endif
|
||||
|
||||
#if defined(OS_CPUTIME_FREQ_HIGH)
|
||||
/* CPUTIME data. */
|
||||
struct os_cputime_data
|
||||
{
|
||||
uint32_t ticks_per_usec; /* number of ticks per usec */
|
||||
};
|
||||
extern struct os_cputime_data g_os_cputime;
|
||||
#endif
|
||||
|
||||
/* Helpful macros to compare cputimes */
|
||||
/** evaluates to true if t1 is before t2 in time */
|
||||
#define CPUTIME_LT(__t1, __t2) ((int32_t) ((__t1) - (__t2)) < 0)
|
||||
/** evaluates to true if t1 is after t2 in time */
|
||||
#define CPUTIME_GT(__t1, __t2) ((int32_t) ((__t1) - (__t2)) > 0)
|
||||
/** evaluates to true if t1 is after t2 in time */
|
||||
#define CPUTIME_GEQ(__t1, __t2) ((int32_t) ((__t1) - (__t2)) >= 0)
|
||||
/** evaluates to true if t1 is on or after t2 in time */
|
||||
#define CPUTIME_LEQ(__t1, __t2) ((int32_t) ((__t1) - (__t2)) <= 0)
|
||||
|
||||
/**
|
||||
* Initialize the cputime module. This must be called after os_init is called
|
||||
* and before any other timer API are used. This should be called only once
|
||||
* and should be called before the hardware timer is used.
|
||||
*
|
||||
* @param clock_freq The desired cputime frequency, in hertz (Hz).
|
||||
*
|
||||
* @return int 0 on success; -1 on error.
|
||||
*/
|
||||
int os_cputime_init(uint32_t clock_freq);
|
||||
|
||||
/**
|
||||
* Returns the low 32 bits of cputime.
|
||||
*
|
||||
* @return uint32_t The lower 32 bits of cputime
|
||||
*/
|
||||
uint32_t os_cputime_get32(void);
|
||||
|
||||
#if !defined(OS_CPUTIME_FREQ_PWR2)
|
||||
/**
|
||||
* Converts the given number of nanoseconds into cputime ticks.
|
||||
* Not defined if OS_CPUTIME_FREQ_PWR2 is defined.
|
||||
*
|
||||
* @param usecs The number of nanoseconds to convert to ticks
|
||||
*
|
||||
* @return uint32_t The number of ticks corresponding to 'nsecs'
|
||||
*/
|
||||
uint32_t os_cputime_nsecs_to_ticks(uint32_t nsecs);
|
||||
|
||||
/**
|
||||
* Convert the given number of ticks into nanoseconds.
|
||||
* Not defined if OS_CPUTIME_FREQ_PWR2 is defined.
|
||||
*
|
||||
* @param ticks The number of ticks to convert to nanoseconds.
|
||||
*
|
||||
* @return uint32_t The number of nanoseconds corresponding to 'ticks'
|
||||
*/
|
||||
uint32_t os_cputime_ticks_to_nsecs(uint32_t ticks);
|
||||
|
||||
/**
|
||||
* Wait until 'nsecs' nanoseconds has elapsed. This is a blocking delay.
|
||||
* Not defined if OS_CPUTIME_FREQ_PWR2 is defined.
|
||||
*
|
||||
*
|
||||
* @param nsecs The number of nanoseconds to wait.
|
||||
*/
|
||||
void os_cputime_delay_nsecs(uint32_t nsecs);
|
||||
#endif
|
||||
|
||||
#if defined(OS_CPUTIME_FREQ_1MHZ)
|
||||
#define os_cputime_usecs_to_ticks(x) (x)
|
||||
#define os_cputime_ticks_to_usecs(x) (x)
|
||||
#else
|
||||
|
||||
/**
|
||||
* Converts the given number of microseconds into cputime ticks.
|
||||
*
|
||||
* @param usecs The number of microseconds to convert to ticks
|
||||
*
|
||||
* @return uint32_t The number of ticks corresponding to 'usecs'
|
||||
*/
|
||||
uint32_t os_cputime_usecs_to_ticks(uint32_t usecs);
|
||||
|
||||
/**
|
||||
* Convert the given number of ticks into microseconds.
|
||||
*
|
||||
* @param ticks The number of ticks to convert to microseconds.
|
||||
*
|
||||
* @return uint32_t The number of microseconds corresponding to 'ticks'
|
||||
*/
|
||||
uint32_t os_cputime_ticks_to_usecs(uint32_t ticks);
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Wait until the number of ticks has elapsed. This is a blocking delay.
|
||||
*
|
||||
* @param ticks The number of ticks to wait.
|
||||
*/
|
||||
void os_cputime_delay_ticks(uint32_t ticks);
|
||||
|
||||
/**
|
||||
* Wait until 'usecs' microseconds has elapsed. This is a blocking delay.
|
||||
*
|
||||
* @param usecs The number of usecs to wait.
|
||||
*/
|
||||
void os_cputime_delay_usecs(uint32_t usecs);
|
||||
|
||||
/**
|
||||
* Initialize a CPU timer, using the given HAL timer.
|
||||
*
|
||||
* @param timer The timer to initialize. Cannot be NULL.
|
||||
* @param fp The timer callback function. Cannot be NULL.
|
||||
* @param arg Pointer to data object to pass to timer.
|
||||
*/
|
||||
void os_cputime_timer_init(struct hal_timer *timer, hal_timer_cb fp,
|
||||
void *arg);
|
||||
|
||||
/**
|
||||
* Start a cputimer that will expire at 'cputime'. If cputime has already
|
||||
* passed, the timer callback will still be called (at interrupt context).
|
||||
*
|
||||
* NOTE: This must be called when the timer is stopped.
|
||||
*
|
||||
* @param timer Pointer to timer to start. Cannot be NULL.
|
||||
* @param cputime The cputime at which the timer should expire.
|
||||
*
|
||||
* @return int 0 on success; EINVAL if timer already started or timer struct
|
||||
* invalid
|
||||
*
|
||||
*/
|
||||
int os_cputime_timer_start(struct hal_timer *timer, uint32_t cputime);
|
||||
|
||||
/**
|
||||
* Sets a cpu timer that will expire 'usecs' microseconds from the current
|
||||
* cputime.
|
||||
*
|
||||
* NOTE: This must be called when the timer is stopped.
|
||||
*
|
||||
* @param timer Pointer to timer. Cannot be NULL.
|
||||
* @param usecs The number of usecs from now at which the timer will expire.
|
||||
*
|
||||
* @return int 0 on success; EINVAL if timer already started or timer struct
|
||||
* invalid
|
||||
*/
|
||||
int os_cputime_timer_relative(struct hal_timer *timer, uint32_t usecs);
|
||||
|
||||
/**
|
||||
* Stops a cputimer from running. The timer is removed from the timer queue
|
||||
* and interrupts are disabled if no timers are left on the queue. Can be
|
||||
* called even if timer is not running.
|
||||
*
|
||||
* @param timer Pointer to cputimer to stop. Cannot be NULL.
|
||||
*/
|
||||
void os_cputime_timer_stop(struct hal_timer *timer);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* H_OS_CPUTIME_ */
|
||||
|
||||
/**
|
||||
* @} OSCPUTime
|
||||
* @} OSKernel
|
||||
*/
|
||||
@@ -0,0 +1,43 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
#ifndef H_OS_ERROR_
|
||||
#define H_OS_ERROR_
|
||||
|
||||
#include "os/os.h"
|
||||
|
||||
enum os_error {
|
||||
OS_OK = 0,
|
||||
OS_ENOMEM = 1,
|
||||
OS_EINVAL = 2,
|
||||
OS_INVALID_PARM = 3,
|
||||
OS_MEM_NOT_ALIGNED = 4,
|
||||
OS_BAD_MUTEX = 5,
|
||||
OS_TIMEOUT = 6,
|
||||
OS_ERR_IN_ISR = 7, /* Function cannot be called from ISR */
|
||||
OS_ERR_PRIV = 8, /* Privileged access error */
|
||||
OS_NOT_STARTED = 9, /* OS must be started to call this function, but isn't */
|
||||
OS_ENOENT = 10, /* No such thing */
|
||||
OS_EBUSY = 11, /* Resource busy */
|
||||
OS_ERROR = 12, /* Generic Error */
|
||||
};
|
||||
|
||||
typedef enum os_error os_error_t;
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,627 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* @addtogroup OSKernel
|
||||
* @{
|
||||
* @defgroup OSMbuf Chained Memory Buffers
|
||||
* @{
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _OS_MBUF_H
|
||||
#define _OS_MBUF_H
|
||||
|
||||
#include "os/os.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/**
|
||||
* A mbuf pool from which to allocate mbufs. This contains a pointer to the os
|
||||
* mempool to allocate mbufs out of, the total number of elements in the pool,
|
||||
* and the amount of "user" data in a non-packet header mbuf. The total pool
|
||||
* size, in bytes, should be:
|
||||
* os_mbuf_count * (omp_databuf_len + sizeof(struct os_mbuf))
|
||||
*/
|
||||
struct os_mbuf_pool {
|
||||
/**
|
||||
* Total length of the databuf in each mbuf. This is the size of the
|
||||
* mempool block, minus the mbuf header
|
||||
*/
|
||||
uint16_t omp_databuf_len;
|
||||
/**
|
||||
* The memory pool which to allocate mbufs out of
|
||||
*/
|
||||
struct os_mempool *omp_pool;
|
||||
|
||||
STAILQ_ENTRY(os_mbuf_pool) omp_next;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* A packet header structure that preceeds the mbuf packet headers.
|
||||
*/
|
||||
struct os_mbuf_pkthdr {
|
||||
/**
|
||||
* Overall length of the packet.
|
||||
*/
|
||||
uint16_t omp_len;
|
||||
/**
|
||||
* Flags
|
||||
*/
|
||||
uint16_t omp_flags;
|
||||
|
||||
STAILQ_ENTRY(os_mbuf_pkthdr) omp_next;
|
||||
};
|
||||
|
||||
/**
|
||||
* Chained memory buffer.
|
||||
*/
|
||||
struct os_mbuf {
|
||||
/**
|
||||
* Current pointer to data in the structure
|
||||
*/
|
||||
uint8_t *om_data;
|
||||
/**
|
||||
* Flags associated with this buffer, see OS_MBUF_F_* defintions
|
||||
*/
|
||||
uint8_t om_flags;
|
||||
/**
|
||||
* Length of packet header
|
||||
*/
|
||||
uint8_t om_pkthdr_len;
|
||||
/**
|
||||
* Length of data in this buffer
|
||||
*/
|
||||
uint16_t om_len;
|
||||
|
||||
/**
|
||||
* The mbuf pool this mbuf was allocated out of
|
||||
*/
|
||||
struct os_mbuf_pool *om_omp;
|
||||
|
||||
SLIST_ENTRY(os_mbuf) om_next;
|
||||
|
||||
/**
|
||||
* Pointer to the beginning of the data, after this buffer
|
||||
*/
|
||||
uint8_t om_databuf[0];
|
||||
};
|
||||
|
||||
/**
|
||||
* Structure representing a queue of mbufs.
|
||||
*/
|
||||
struct os_mqueue {
|
||||
STAILQ_HEAD(, os_mbuf_pkthdr) mq_head;
|
||||
/** Event to post when new buffers are available on the queue. */
|
||||
struct ble_npl_event mq_ev;
|
||||
};
|
||||
|
||||
/*
|
||||
* Given a flag number, provide the mask for it
|
||||
*
|
||||
* @param __n The number of the flag in the mask
|
||||
*/
|
||||
#define OS_MBUF_F_MASK(__n) (1 << (__n))
|
||||
|
||||
/*
|
||||
* Checks whether a given mbuf is a packet header mbuf
|
||||
*
|
||||
* @param __om The mbuf to check
|
||||
*/
|
||||
#define OS_MBUF_IS_PKTHDR(__om) \
|
||||
((__om)->om_pkthdr_len >= sizeof (struct os_mbuf_pkthdr))
|
||||
|
||||
/** Get a packet header pointer given an mbuf pointer */
|
||||
#define OS_MBUF_PKTHDR(__om) ((struct os_mbuf_pkthdr *) \
|
||||
((uint8_t *)&(__om)->om_data + sizeof(struct os_mbuf)))
|
||||
|
||||
/** Given a mbuf packet header pointer, return a pointer to the mbuf */
|
||||
#define OS_MBUF_PKTHDR_TO_MBUF(__hdr) \
|
||||
(struct os_mbuf *)((uint8_t *)(__hdr) - sizeof(struct os_mbuf))
|
||||
|
||||
/**
|
||||
* Gets the length of an entire mbuf chain. The specified mbuf must have a
|
||||
* packet header.
|
||||
*/
|
||||
#define OS_MBUF_PKTLEN(__om) (OS_MBUF_PKTHDR(__om)->omp_len)
|
||||
|
||||
/**
|
||||
* Access the data of a mbuf, and cast it to type
|
||||
*
|
||||
* @param __om The mbuf to access, and cast
|
||||
* @param __type The type to cast it to
|
||||
*/
|
||||
#define OS_MBUF_DATA(__om, __type) \
|
||||
(__type) ((__om)->om_data)
|
||||
|
||||
/**
|
||||
* Access the "user header" in the head of an mbuf chain.
|
||||
*
|
||||
* @param om Pointer to the head of an mbuf chain.
|
||||
*/
|
||||
#define OS_MBUF_USRHDR(om) \
|
||||
(void *)((uint8_t *)om + sizeof (struct os_mbuf) + \
|
||||
sizeof (struct os_mbuf_pkthdr))
|
||||
|
||||
/**
|
||||
* Retrieves the length of the user header in an mbuf.
|
||||
*
|
||||
* @param om Pointer to the mbuf to query.
|
||||
*/
|
||||
#define OS_MBUF_USRHDR_LEN(om) \
|
||||
((om)->om_pkthdr_len - sizeof (struct os_mbuf_pkthdr))
|
||||
|
||||
|
||||
/** @cond INTERNAL_HIDDEN */
|
||||
|
||||
/*
|
||||
* Called by OS_MBUF_LEADINGSPACE() macro
|
||||
*/
|
||||
static inline uint16_t
|
||||
_os_mbuf_leadingspace(struct os_mbuf *om)
|
||||
{
|
||||
uint16_t startoff;
|
||||
uint16_t leadingspace;
|
||||
|
||||
startoff = 0;
|
||||
if (OS_MBUF_IS_PKTHDR(om)) {
|
||||
startoff = om->om_pkthdr_len;
|
||||
}
|
||||
|
||||
leadingspace = (uint16_t) (OS_MBUF_DATA(om, uint8_t *) -
|
||||
((uint8_t *) &om->om_databuf[0] + startoff));
|
||||
|
||||
return (leadingspace);
|
||||
}
|
||||
|
||||
/** @endcond */
|
||||
|
||||
/**
|
||||
* Returns the leading space (space at the beginning) of the mbuf.
|
||||
* Works on both packet header, and regular mbufs, as it accounts
|
||||
* for the additional space allocated to the packet header.
|
||||
*
|
||||
* @param __omp Is the mbuf pool (which contains packet header length.)
|
||||
* @param __om Is the mbuf in that pool to get the leadingspace for
|
||||
*
|
||||
* @return Amount of leading space available in the mbuf
|
||||
*/
|
||||
#define OS_MBUF_LEADINGSPACE(__om) _os_mbuf_leadingspace(__om)
|
||||
|
||||
|
||||
/** @cond INTERNAL_HIDDEN */
|
||||
|
||||
/* Called by OS_MBUF_TRAILINGSPACE() macro. */
|
||||
static inline uint16_t
|
||||
_os_mbuf_trailingspace(struct os_mbuf *om)
|
||||
{
|
||||
struct os_mbuf_pool *omp;
|
||||
|
||||
omp = om->om_omp;
|
||||
|
||||
return (&om->om_databuf[0] + omp->omp_databuf_len) -
|
||||
(om->om_data + om->om_len);
|
||||
}
|
||||
|
||||
/** @endcond */
|
||||
|
||||
/**
|
||||
* Returns the trailing space (space at the end) of the mbuf.
|
||||
* Works on both packet header and regular mbufs.
|
||||
*
|
||||
* @param __omp The mbuf pool for this mbuf
|
||||
* @param __om Is the mbuf in that pool to get trailing space for
|
||||
*
|
||||
* @return The amount of trailing space available in the mbuf
|
||||
*/
|
||||
#define OS_MBUF_TRAILINGSPACE(__om) _os_mbuf_trailingspace(__om)
|
||||
|
||||
|
||||
/**
|
||||
* Initializes an mqueue. An mqueue is a queue of mbufs that ties to a
|
||||
* particular task's event queue. Mqueues form a helper API around a common
|
||||
* paradigm: wait on an event queue until at least one packet is available,
|
||||
* then process a queue of packets.
|
||||
*
|
||||
* When mbufs are available on the queue, an event OS_EVENT_T_MQUEUE_DATA
|
||||
* will be posted to the task's mbuf queue.
|
||||
*
|
||||
* @param mq The mqueue to initialize
|
||||
* @param ev_cb The callback to associate with the mqeueue
|
||||
* event. Typically, this callback pulls each
|
||||
* packet off the mqueue and processes them.
|
||||
* @param arg The argument to associate with the mqueue event.
|
||||
*
|
||||
* @return 0 on success, non-zero on failure.
|
||||
*/
|
||||
int os_mqueue_init(struct os_mqueue *mq, ble_npl_event_fn *ev_cb, void *arg);
|
||||
|
||||
/**
|
||||
* Remove and return a single mbuf from the mbuf queue. Does not block.
|
||||
*
|
||||
* @param mq The mbuf queue to pull an element off of.
|
||||
*
|
||||
* @return The next mbuf in the queue, or NULL if queue has no mbufs.
|
||||
*/
|
||||
struct os_mbuf *os_mqueue_get(struct os_mqueue *);
|
||||
|
||||
/**
|
||||
* Adds a packet (i.e. packet header mbuf) to an mqueue. The event associated
|
||||
* with the mqueue gets posted to the specified eventq.
|
||||
*
|
||||
* @param mq The mbuf queue to append the mbuf to.
|
||||
* @param evq The event queue to post an event to.
|
||||
* @param m The mbuf to append to the mbuf queue.
|
||||
*
|
||||
* @return 0 on success, non-zero on failure.
|
||||
*/
|
||||
int os_mqueue_put(struct os_mqueue *, struct ble_npl_eventq *, struct os_mbuf *);
|
||||
|
||||
/**
|
||||
* MSYS is a system level mbuf registry. Allows the system to share
|
||||
* packet buffers amongst the various networking stacks that can be running
|
||||
* simultaeneously.
|
||||
*
|
||||
* Mbuf pools are created in the system initialization code, and then when
|
||||
* a mbuf is allocated out of msys, it will try and find the best fit based
|
||||
* upon estimated mbuf size.
|
||||
*
|
||||
* os_msys_register() registers a mbuf pool with MSYS, and allows MSYS to
|
||||
* allocate mbufs out of it.
|
||||
*
|
||||
* @param new_pool The pool to register with MSYS
|
||||
*
|
||||
* @return 0 on success, non-zero on failure
|
||||
*/
|
||||
int os_msys_register(struct os_mbuf_pool *);
|
||||
|
||||
/**
|
||||
* Allocate a mbuf from msys. Based upon the data size requested,
|
||||
* os_msys_get() will choose the mbuf pool that has the best fit.
|
||||
*
|
||||
* @param dsize The estimated size of the data being stored in the mbuf
|
||||
* @param leadingspace The amount of leadingspace to allocate in the mbuf
|
||||
*
|
||||
* @return A freshly allocated mbuf on success, NULL on failure.
|
||||
*/
|
||||
struct os_mbuf *os_msys_get(uint16_t dsize, uint16_t leadingspace);
|
||||
|
||||
/**
|
||||
* De-registers all mbuf pools from msys.
|
||||
*/
|
||||
void os_msys_reset(void);
|
||||
|
||||
/**
|
||||
* Allocate a packet header structure from the MSYS pool. See
|
||||
* os_msys_register() for a description of MSYS.
|
||||
*
|
||||
* @param dsize The estimated size of the data being stored in the mbuf
|
||||
* @param user_hdr_len The length to allocate for the packet header structure
|
||||
*
|
||||
* @return A freshly allocated mbuf on success, NULL on failure.
|
||||
*/
|
||||
struct os_mbuf *os_msys_get_pkthdr(uint16_t dsize, uint16_t user_hdr_len);
|
||||
|
||||
/**
|
||||
* Count the number of blocks in all the mbuf pools that are allocated.
|
||||
*
|
||||
* @return total number of blocks allocated in Msys
|
||||
*/
|
||||
int os_msys_count(void);
|
||||
|
||||
/**
|
||||
* Return the number of free blocks in Msys
|
||||
*
|
||||
* @return Number of free blocks available in Msys
|
||||
*/
|
||||
int os_msys_num_free(void);
|
||||
|
||||
/**
|
||||
* Initialize a pool of mbufs.
|
||||
*
|
||||
* @param omp The mbuf pool to initialize
|
||||
* @param mp The memory pool that will hold this mbuf pool
|
||||
* @param buf_len The length of the buffer itself.
|
||||
* @param nbufs The number of buffers in the pool
|
||||
*
|
||||
* @return 0 on success, error code on failure.
|
||||
*/
|
||||
int os_mbuf_pool_init(struct os_mbuf_pool *, struct os_mempool *mp,
|
||||
uint16_t, uint16_t);
|
||||
|
||||
/**
|
||||
* Get an mbuf from the mbuf pool. The mbuf is allocated, and initialized
|
||||
* prior to being returned.
|
||||
*
|
||||
* @param omp The mbuf pool to return the packet from
|
||||
* @param leadingspace The amount of leadingspace to put before the data
|
||||
* section by default.
|
||||
*
|
||||
* @return An initialized mbuf on success, and NULL on failure.
|
||||
*/
|
||||
struct os_mbuf *os_mbuf_get(struct os_mbuf_pool *omp, uint16_t);
|
||||
|
||||
/**
|
||||
* Allocate a new packet header mbuf out of the os_mbuf_pool.
|
||||
*
|
||||
* @param omp The mbuf pool to allocate out of
|
||||
* @param user_pkthdr_len The packet header length to reserve for the caller.
|
||||
*
|
||||
* @return A freshly allocated mbuf on success, NULL on failure.
|
||||
*/
|
||||
struct os_mbuf *os_mbuf_get_pkthdr(struct os_mbuf_pool *omp,
|
||||
uint8_t pkthdr_len);
|
||||
|
||||
/**
|
||||
* Duplicate a chain of mbufs. Return the start of the duplicated chain.
|
||||
*
|
||||
* @param omp The mbuf pool to duplicate out of
|
||||
* @param om The mbuf chain to duplicate
|
||||
*
|
||||
* @return A pointer to the new chain of mbufs
|
||||
*/
|
||||
struct os_mbuf *os_mbuf_dup(struct os_mbuf *m);
|
||||
|
||||
/**
|
||||
* Locates the specified absolute offset within an mbuf chain. The offset
|
||||
* can be one past than the total length of the chain, but no greater.
|
||||
*
|
||||
* @param om The start of the mbuf chain to seek within.
|
||||
* @param off The absolute address to find.
|
||||
* @param out_off On success, this points to the relative offset
|
||||
* within the returned mbuf.
|
||||
*
|
||||
* @return The mbuf containing the specified offset on
|
||||
* success.
|
||||
* NULL if the specified offset is out of bounds.
|
||||
*/
|
||||
struct os_mbuf *os_mbuf_off(const struct os_mbuf *om, int off,
|
||||
uint16_t *out_off);
|
||||
|
||||
|
||||
/*
|
||||
* Copy data from an mbuf chain starting "off" bytes from the beginning,
|
||||
* continuing for "len" bytes, into the indicated buffer.
|
||||
*
|
||||
* @param m The mbuf chain to copy from
|
||||
* @param off The offset into the mbuf chain to begin copying from
|
||||
* @param len The length of the data to copy
|
||||
* @param dst The destination buffer to copy into
|
||||
*
|
||||
* @return 0 on success;
|
||||
* -1 if the mbuf does not contain enough data.
|
||||
*/
|
||||
int os_mbuf_copydata(const struct os_mbuf *m, int off, int len, void *dst);
|
||||
|
||||
/**
|
||||
* Append data onto a mbuf
|
||||
*
|
||||
* @param om The mbuf to append the data onto
|
||||
* @param data The data to append onto the mbuf
|
||||
* @param len The length of the data to append
|
||||
*
|
||||
* @return 0 on success, and an error code on failure
|
||||
*/
|
||||
int os_mbuf_append(struct os_mbuf *m, const void *, uint16_t);
|
||||
|
||||
/**
|
||||
* Reads data from one mbuf and appends it to another. On error, the specified
|
||||
* data range may be partially appended. Neither mbuf is required to contain
|
||||
* an mbuf packet header.
|
||||
*
|
||||
* @param dst The mbuf to append to.
|
||||
* @param src The mbuf to copy data from.
|
||||
* @param src_off The absolute offset within the source mbuf
|
||||
* chain to read from.
|
||||
* @param len The number of bytes to append.
|
||||
*
|
||||
* @return 0 on success;
|
||||
* OS_EINVAL if the specified range extends beyond
|
||||
* the end of the source mbuf chain.
|
||||
*/
|
||||
int os_mbuf_appendfrom(struct os_mbuf *dst, const struct os_mbuf *src,
|
||||
uint16_t src_off, uint16_t len);
|
||||
|
||||
/**
|
||||
* Release a mbuf back to the pool
|
||||
*
|
||||
* @param omp The Mbuf pool to release back to
|
||||
* @param om The Mbuf to release back to the pool
|
||||
*
|
||||
* @return 0 on success, -1 on failure
|
||||
*/
|
||||
int os_mbuf_free(struct os_mbuf *mb);
|
||||
|
||||
/**
|
||||
* Free a chain of mbufs
|
||||
*
|
||||
* @param omp The mbuf pool to free the chain of mbufs into
|
||||
* @param om The starting mbuf of the chain to free back into the pool
|
||||
*
|
||||
* @return 0 on success, -1 on failure
|
||||
*/
|
||||
int os_mbuf_free_chain(struct os_mbuf *om);
|
||||
|
||||
/**
|
||||
* Adjust the length of a mbuf, trimming either from the head or the tail
|
||||
* of the mbuf.
|
||||
*
|
||||
* @param mp The mbuf chain to adjust
|
||||
* @param req_len The length to trim from the mbuf. If positive, trims
|
||||
* from the head of the mbuf, if negative, trims from the
|
||||
* tail of the mbuf.
|
||||
*/
|
||||
void os_mbuf_adj(struct os_mbuf *mp, int req_len);
|
||||
|
||||
|
||||
/**
|
||||
* Performs a memory compare of the specified region of an mbuf chain against a
|
||||
* flat buffer.
|
||||
*
|
||||
* @param om The start of the mbuf chain to compare.
|
||||
* @param off The offset within the mbuf chain to start the
|
||||
* comparison.
|
||||
* @param data The flat buffer to compare.
|
||||
* @param len The length of the flat buffer.
|
||||
*
|
||||
* @return 0 if both memory regions are identical;
|
||||
* A memcmp return code if there is a mismatch;
|
||||
* INT_MAX if the mbuf is too short.
|
||||
*/
|
||||
int os_mbuf_cmpf(const struct os_mbuf *om, int off, const void *data, int len);
|
||||
|
||||
/**
|
||||
* Compares the contents of two mbuf chains. The ranges of the two chains to
|
||||
* be compared are specified via the two offset parameters and the len
|
||||
* parameter. Neither mbuf chain is required to contain a packet header.
|
||||
*
|
||||
* @param om1 The first mbuf chain to compare.
|
||||
* @param offset1 The absolute offset within om1 at which to
|
||||
* start the comparison.
|
||||
* @param om2 The second mbuf chain to compare.
|
||||
* @param offset2 The absolute offset within om2 at which to
|
||||
* start the comparison.
|
||||
* @param len The number of bytes to compare.
|
||||
*
|
||||
* @return 0 if both mbuf segments are identical;
|
||||
* A memcmp() return code if the segment contents
|
||||
* differ;
|
||||
* INT_MAX if a specified range extends beyond the
|
||||
* end of its corresponding mbuf chain.
|
||||
*/
|
||||
int os_mbuf_cmpm(const struct os_mbuf *om1, uint16_t offset1,
|
||||
const struct os_mbuf *om2, uint16_t offset2,
|
||||
uint16_t len);
|
||||
|
||||
/**
|
||||
* Increases the length of an mbuf chain by adding data to the front. If there
|
||||
* is insufficient room in the leading mbuf, additional mbufs are allocated and
|
||||
* prepended as necessary. If this function fails to allocate an mbuf, the
|
||||
* entire chain is freed.
|
||||
*
|
||||
* The specified mbuf chain does not need to contain a packet header.
|
||||
*
|
||||
* @param omp The mbuf pool to allocate from.
|
||||
* @param om The head of the mbuf chain.
|
||||
* @param len The number of bytes to prepend.
|
||||
*
|
||||
* @return The new head of the chain on success;
|
||||
* NULL on failure.
|
||||
*/
|
||||
struct os_mbuf *os_mbuf_prepend(struct os_mbuf *om, int len);
|
||||
|
||||
/**
|
||||
* Prepends a chunk of empty data to the specified mbuf chain and ensures the
|
||||
* chunk is contiguous. If either operation fails, the specified mbuf chain is
|
||||
* freed and NULL is returned.
|
||||
*
|
||||
* @param om The mbuf chain to prepend to.
|
||||
* @param len The number of bytes to prepend and pullup.
|
||||
*
|
||||
* @return The modified mbuf on success;
|
||||
* NULL on failure (and the mbuf chain is freed).
|
||||
*/
|
||||
struct os_mbuf *os_mbuf_prepend_pullup(struct os_mbuf *om, uint16_t len);
|
||||
|
||||
/**
|
||||
* Copies the contents of a flat buffer into an mbuf chain, starting at the
|
||||
* specified destination offset. If the mbuf is too small for the source data,
|
||||
* it is extended as necessary. If the destination mbuf contains a packet
|
||||
* header, the header length is updated.
|
||||
*
|
||||
* @param omp The mbuf pool to allocate from.
|
||||
* @param om The mbuf chain to copy into.
|
||||
* @param off The offset within the chain to copy to.
|
||||
* @param src The source buffer to copy from.
|
||||
* @param len The number of bytes to copy.
|
||||
*
|
||||
* @return 0 on success; nonzero on failure.
|
||||
*/
|
||||
int os_mbuf_copyinto(struct os_mbuf *om, int off, const void *src, int len);
|
||||
|
||||
/**
|
||||
* Attaches a second mbuf chain onto the end of the first. If the first chain
|
||||
* contains a packet header, the header's length is updated. If the second
|
||||
* chain has a packet header, its header is cleared.
|
||||
*
|
||||
* @param first The mbuf chain being attached to.
|
||||
* @param second The mbuf chain that gets attached.
|
||||
*/
|
||||
void os_mbuf_concat(struct os_mbuf *first, struct os_mbuf *second);
|
||||
|
||||
|
||||
/**
|
||||
* Increases the length of an mbuf chain by the specified amount. If there is
|
||||
* not sufficient room in the last buffer, a new buffer is allocated and
|
||||
* appended to the chain. It is an error to request more data than can fit in
|
||||
* a single buffer.
|
||||
*
|
||||
* @param omp
|
||||
* @param om The head of the chain to extend.
|
||||
* @param len The number of bytes to extend by.
|
||||
*
|
||||
* @return A pointer to the new data on success;
|
||||
* NULL on failure.
|
||||
*/
|
||||
void *os_mbuf_extend(struct os_mbuf *om, uint16_t len);
|
||||
|
||||
/**
|
||||
* Rearrange a mbuf chain so that len bytes are contiguous,
|
||||
* and in the data area of an mbuf (so that OS_MBUF_DATA() will
|
||||
* work on a structure of size len.) Returns the resulting
|
||||
* mbuf chain on success, free's it and returns NULL on failure.
|
||||
*
|
||||
* If there is room, it will add up to "max_protohdr - len"
|
||||
* extra bytes to the contiguous region, in an attempt to avoid being
|
||||
* called next time.
|
||||
*
|
||||
* @param omp The mbuf pool to take the mbufs out of
|
||||
* @param om The mbuf chain to make contiguous
|
||||
* @param len The number of bytes in the chain to make contiguous
|
||||
*
|
||||
* @return The contiguous mbuf chain on success, NULL on failure.
|
||||
*/
|
||||
struct os_mbuf *os_mbuf_pullup(struct os_mbuf *om, uint16_t len);
|
||||
|
||||
|
||||
/**
|
||||
* Removes and frees empty mbufs from the front of a chain. If the chain
|
||||
* contains a packet header, it is preserved.
|
||||
*
|
||||
* @param om The mbuf chain to trim.
|
||||
*
|
||||
* @return The head of the trimmed mbuf chain.
|
||||
*/
|
||||
struct os_mbuf *os_mbuf_trim_front(struct os_mbuf *om);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _OS_MBUF_H */
|
||||
|
||||
|
||||
/**
|
||||
* @} OSMbuf
|
||||
* @} OSKernel
|
||||
*/
|
||||
@@ -0,0 +1,255 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @addtogroup OSKernel
|
||||
* @{
|
||||
* @defgroup OSMempool Memory Pools
|
||||
* @{
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _OS_MEMPOOL_H_
|
||||
#define _OS_MEMPOOL_H_
|
||||
|
||||
#include <stdbool.h>
|
||||
#include "os/os.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/**
|
||||
* A memory block structure. This simply contains a pointer to the free list
|
||||
* chain and is only used when the block is on the free list. When the block
|
||||
* has been removed from the free list the entire memory block is usable by the
|
||||
* caller.
|
||||
*/
|
||||
struct os_memblock {
|
||||
SLIST_ENTRY(os_memblock) mb_next;
|
||||
};
|
||||
|
||||
/* XXX: Change this structure so that we keep the first address in the pool? */
|
||||
/* XXX: add memory debug structure and associated code */
|
||||
/* XXX: Change how I coded the SLIST_HEAD here. It should be named:
|
||||
SLIST_HEAD(,os_memblock) mp_head; */
|
||||
|
||||
/**
|
||||
* Memory pool
|
||||
*/
|
||||
struct os_mempool {
|
||||
/** Size of the memory blocks, in bytes. */
|
||||
uint32_t mp_block_size;
|
||||
/** The number of memory blocks. */
|
||||
uint16_t mp_num_blocks;
|
||||
/** The number of free blocks left */
|
||||
uint16_t mp_num_free;
|
||||
/** The lowest number of free blocks seen */
|
||||
uint16_t mp_min_free;
|
||||
/** Bitmap of OS_MEMPOOL_F_[...] values. */
|
||||
uint8_t mp_flags;
|
||||
/** Address of memory buffer used by pool */
|
||||
uint32_t mp_membuf_addr;
|
||||
STAILQ_ENTRY(os_mempool) mp_list;
|
||||
SLIST_HEAD(,os_memblock);
|
||||
/** Name for memory block */
|
||||
char *name;
|
||||
};
|
||||
|
||||
/**
|
||||
* Indicates an extended mempool. Address can be safely cast to
|
||||
* (struct os_mempool_ext *).
|
||||
*/
|
||||
#define OS_MEMPOOL_F_EXT 0x01
|
||||
|
||||
struct os_mempool_ext;
|
||||
|
||||
/**
|
||||
* Block put callback function. If configured, this callback gets executed
|
||||
* whenever a block is freed to the corresponding extended mempool. Note: The
|
||||
* os_memblock_put() function calls this callback instead of freeing the block
|
||||
* itself. Therefore, it is the callback's responsibility to free the block
|
||||
* via a call to os_memblock_put_from_cb().
|
||||
*
|
||||
* @param ome The extended mempool that a block is being
|
||||
* freed back to.
|
||||
* @param data The block being freed.
|
||||
* @param arg Optional argument configured along with the
|
||||
* callback.
|
||||
*
|
||||
* @return Indicates whether the block was successfully
|
||||
* freed. A non-zero value should only be
|
||||
* returned if the block was not successfully
|
||||
* released back to its pool.
|
||||
*/
|
||||
typedef os_error_t os_mempool_put_fn(struct os_mempool_ext *ome, void *data,
|
||||
void *arg);
|
||||
|
||||
struct os_mempool_ext {
|
||||
struct os_mempool mpe_mp;
|
||||
|
||||
/* Callback that is executed immediately when a block is freed. */
|
||||
os_mempool_put_fn *mpe_put_cb;
|
||||
void *mpe_put_arg;
|
||||
};
|
||||
|
||||
#define OS_MEMPOOL_INFO_NAME_LEN (32)
|
||||
|
||||
/**
|
||||
* Information describing a memory pool, used to return OS information
|
||||
* to the management layer.
|
||||
*/
|
||||
struct os_mempool_info {
|
||||
/** Size of the memory blocks in the pool */
|
||||
int omi_block_size;
|
||||
/** Number of memory blocks in the pool */
|
||||
int omi_num_blocks;
|
||||
/** Number of free memory blocks */
|
||||
int omi_num_free;
|
||||
/** Minimum number of free memory blocks ever */
|
||||
int omi_min_free;
|
||||
/** Name of the memory pool */
|
||||
char omi_name[OS_MEMPOOL_INFO_NAME_LEN];
|
||||
};
|
||||
|
||||
/**
|
||||
* Get information about the next system memory pool.
|
||||
*
|
||||
* @param mempool The current memory pool, or NULL if starting iteration.
|
||||
* @param info A pointer to the structure to return memory pool information
|
||||
* into.
|
||||
*
|
||||
* @return The next memory pool in the list to get information about, or NULL
|
||||
* when at the last memory pool.
|
||||
*/
|
||||
struct os_mempool *os_mempool_info_get_next(struct os_mempool *,
|
||||
struct os_mempool_info *);
|
||||
|
||||
/*
|
||||
* To calculate size of the memory buffer needed for the pool. NOTE: This size
|
||||
* is NOT in bytes! The size is the number of os_membuf_t elements required for
|
||||
* the memory pool.
|
||||
*/
|
||||
#if (OS_CFG_ALIGNMENT == OS_CFG_ALIGN_4)
|
||||
#define OS_MEMPOOL_SIZE(n,blksize) ((((blksize) + 3) / 4) * (n))
|
||||
typedef uint32_t os_membuf_t;
|
||||
#else
|
||||
#define OS_MEMPOOL_SIZE(n,blksize) ((((blksize) + 7) / 8) * (n))
|
||||
typedef uint64_t os_membuf_t;
|
||||
#endif
|
||||
|
||||
/** Calculates the number of bytes required to initialize a memory pool. */
|
||||
#define OS_MEMPOOL_BYTES(n,blksize) \
|
||||
(sizeof (os_membuf_t) * OS_MEMPOOL_SIZE((n), (blksize)))
|
||||
|
||||
/**
|
||||
* Initialize a memory pool.
|
||||
*
|
||||
* @param mp Pointer to a pointer to a mempool
|
||||
* @param blocks The number of blocks in the pool
|
||||
* @param blocks_size The size of the block, in bytes.
|
||||
* @param membuf Pointer to memory to contain blocks.
|
||||
* @param name Name of the pool.
|
||||
*
|
||||
* @return os_error_t
|
||||
*/
|
||||
os_error_t os_mempool_init(struct os_mempool *mp, uint16_t blocks,
|
||||
uint32_t block_size, void *membuf, char *name);
|
||||
|
||||
/**
|
||||
* Initializes an extended memory pool. Extended attributes (e.g., callbacks)
|
||||
* are not specified when this function is called; they are assigned manually
|
||||
* after initialization.
|
||||
*
|
||||
* @param mpe The extended memory pool to initialize.
|
||||
* @param blocks The number of blocks in the pool.
|
||||
* @param block_size The size of each block, in bytes.
|
||||
* @param membuf Pointer to memory to contain blocks.
|
||||
* @param name Name of the pool.
|
||||
*
|
||||
* @return os_error_t
|
||||
*/
|
||||
os_error_t os_mempool_ext_init(struct os_mempool_ext *mpe, uint16_t blocks,
|
||||
uint32_t block_size, void *membuf, char *name);
|
||||
|
||||
/**
|
||||
* Performs an integrity check of the specified mempool. This function
|
||||
* attempts to detect memory corruption in the specified memory pool.
|
||||
*
|
||||
* @param mp The mempool to check.
|
||||
*
|
||||
* @return true if the memory pool passes the integrity
|
||||
* check;
|
||||
* false if the memory pool is corrupt.
|
||||
*/
|
||||
bool os_mempool_is_sane(const struct os_mempool *mp);
|
||||
|
||||
/**
|
||||
* Checks if a memory block was allocated from the specified mempool.
|
||||
*
|
||||
* @param mp The mempool to check as parent.
|
||||
* @param block_addr The memory block to check as child.
|
||||
*
|
||||
* @return 0 if the block does not belong to the mempool;
|
||||
* 1 if the block does belong to the mempool.
|
||||
*/
|
||||
int os_memblock_from(const struct os_mempool *mp, const void *block_addr);
|
||||
|
||||
/**
|
||||
* Get a memory block from a memory pool
|
||||
*
|
||||
* @param mp Pointer to the memory pool
|
||||
*
|
||||
* @return void* Pointer to block if available; NULL otherwise
|
||||
*/
|
||||
void *os_memblock_get(struct os_mempool *mp);
|
||||
|
||||
/**
|
||||
* Puts the memory block back into the pool, ignoring the put callback, if any.
|
||||
* This function should only be called from a put callback to free a block
|
||||
* without causing infinite recursion.
|
||||
*
|
||||
* @param mp Pointer to memory pool
|
||||
* @param block_addr Pointer to memory block
|
||||
*
|
||||
* @return os_error_t
|
||||
*/
|
||||
os_error_t os_memblock_put_from_cb(struct os_mempool *mp, void *block_addr);
|
||||
|
||||
/**
|
||||
* Puts the memory block back into the pool
|
||||
*
|
||||
* @param mp Pointer to memory pool
|
||||
* @param block_addr Pointer to memory block
|
||||
*
|
||||
* @return os_error_t
|
||||
*/
|
||||
os_error_t os_memblock_put(struct os_mempool *mp, void *block_addr);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _OS_MEMPOOL_H_ */
|
||||
|
||||
|
||||
/**
|
||||
* @} OSMempool
|
||||
* @} OSKernel
|
||||
*/
|
||||
@@ -0,0 +1,54 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
#ifndef OS_TRACE_API_H
|
||||
#define OS_TRACE_API_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#define OS_TRACE_ID_OFFSET (32u)
|
||||
|
||||
#define OS_TRACE_ID_EVQ_PUT (1u + OS_TRACE_ID_OFFSET)
|
||||
#define OS_TRACE_ID_EVQ_GET (2u + OS_TRACE_ID_OFFSET)
|
||||
#define OS_TRACE_ID_MUTEX_INIT (3u + OS_TRACE_ID_OFFSET)
|
||||
#define OS_TRACE_ID_MUTEX_RELEASE (4u + OS_TRACE_ID_OFFSET)
|
||||
#define OS_TRACE_ID_MUTEX_PEND (5u + OS_TRACE_ID_OFFSET)
|
||||
|
||||
static inline void os_trace_enter_isr(void){}
|
||||
static inline void os_trace_exit_isr(void){}
|
||||
static inline void os_trace_exit_isr_to_scheduler(void){}
|
||||
static inline void os_trace_task_info(const void *p_task){}
|
||||
static inline void os_trace_task_create(uint32_t task_id){}
|
||||
static inline void os_trace_task_start_exec(uint32_t task_id){}
|
||||
static inline void os_trace_task_stop_exec(void){}
|
||||
static inline void os_trace_task_start_ready(uint32_t task_id){}
|
||||
static inline void os_trace_task_stop_ready(uint32_t task_id, unsigned reason){}
|
||||
static inline void os_trace_idle(void){}
|
||||
static inline void os_trace_void(unsigned id){}
|
||||
static inline void os_trace_u32(unsigned id, uint32_t para0){}
|
||||
static inline void os_trace_u32x2(unsigned id, uint32_t para0, uint32_t para1){}
|
||||
static inline void os_trace_u32x3(unsigned id, uint32_t para0, uint32_t para1, uint32_t para2){}
|
||||
static inline void os_trace_u32x4(unsigned id, uint32_t para0, uint32_t para1, uint32_t para2, uint32_t para3){}
|
||||
static inline void os_trace_u32x5(unsigned id, uint32_t para0, uint32_t para1, uint32_t para2, uint32_t para3, uint32_t para4){}
|
||||
static inline void os_trace_enter_timer(uint32_t timer_id){}
|
||||
static inline void os_trace_exit_timer(void){}
|
||||
static inline void os_trace_end_call(unsigned id){}
|
||||
static inline void os_trace_end_call_return_value(unsigned id, uint32_t return_value){}
|
||||
|
||||
#endif
|
||||
Executable
+522
@@ -0,0 +1,522 @@
|
||||
/*
|
||||
* Copyright (c) 1991, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)queue.h 8.5 (Berkeley) 8/20/94
|
||||
* $FreeBSD: src/sys/sys/queue.h,v 1.32.2.7 2002/04/17 14:21:02 des Exp $
|
||||
*/
|
||||
|
||||
#ifndef _QUEUE_H_
|
||||
#define _QUEUE_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*
|
||||
* This file defines five types of data structures: singly-linked lists,
|
||||
* singly-linked tail queues, lists, tail queues, and circular queues.
|
||||
*
|
||||
* A singly-linked list is headed by a single forward pointer. The elements
|
||||
* are singly linked for minimum space and pointer manipulation overhead at
|
||||
* the expense of O(n) removal for arbitrary elements. New elements can be
|
||||
* added to the list after an existing element or at the head of the list.
|
||||
* Elements being removed from the head of the list should use the explicit
|
||||
* macro for this purpose for optimum efficiency. A singly-linked list may
|
||||
* only be traversed in the forward direction. Singly-linked lists are ideal
|
||||
* for applications with large datasets and few or no removals or for
|
||||
* implementing a LIFO queue.
|
||||
*
|
||||
* A singly-linked tail queue is headed by a pair of pointers, one to the
|
||||
* head of the list and the other to the tail of the list. The elements are
|
||||
* singly linked for minimum space and pointer manipulation overhead at the
|
||||
* expense of O(n) removal for arbitrary elements. New elements can be added
|
||||
* to the list after an existing element, at the head of the list, or at the
|
||||
* end of the list. Elements being removed from the head of the tail queue
|
||||
* should use the explicit macro for this purpose for optimum efficiency.
|
||||
* A singly-linked tail queue may only be traversed in the forward direction.
|
||||
* Singly-linked tail queues are ideal for applications with large datasets
|
||||
* and few or no removals or for implementing a FIFO queue.
|
||||
*
|
||||
* A list is headed by a single forward pointer (or an array of forward
|
||||
* pointers for a hash table header). The elements are doubly linked
|
||||
* so that an arbitrary element can be removed without a need to
|
||||
* traverse the list. New elements can be added to the list before
|
||||
* or after an existing element or at the head of the list. A list
|
||||
* may only be traversed in the forward direction.
|
||||
*
|
||||
* A tail queue is headed by a pair of pointers, one to the head of the
|
||||
* list and the other to the tail of the list. The elements are doubly
|
||||
* linked so that an arbitrary element can be removed without a need to
|
||||
* traverse the list. New elements can be added to the list before or
|
||||
* after an existing element, at the head of the list, or at the end of
|
||||
* the list. A tail queue may be traversed in either direction.
|
||||
*
|
||||
* A circle queue is headed by a pair of pointers, one to the head of the
|
||||
* list and the other to the tail of the list. The elements are doubly
|
||||
* linked so that an arbitrary element can be removed without a need to
|
||||
* traverse the list. New elements can be added to the list before or after
|
||||
* an existing element, at the head of the list, or at the end of the list.
|
||||
* A circle queue may be traversed in either direction, but has a more
|
||||
* complex end of list detection.
|
||||
*
|
||||
* For details on the use of these macros, see the queue(3) manual page.
|
||||
*
|
||||
*
|
||||
* SLIST LIST STAILQ TAILQ CIRCLEQ
|
||||
* _HEAD + + + + +
|
||||
* _HEAD_INITIALIZER + + + + +
|
||||
* _ENTRY + + + + +
|
||||
* _INIT + + + + +
|
||||
* _EMPTY + + + + +
|
||||
* _FIRST + + + + +
|
||||
* _NEXT + + + + +
|
||||
* _PREV - - - + +
|
||||
* _LAST - - + + +
|
||||
* _FOREACH + + + + +
|
||||
* _FOREACH_REVERSE - - - + +
|
||||
* _INSERT_HEAD + + + + +
|
||||
* _INSERT_BEFORE - + - + +
|
||||
* _INSERT_AFTER + + + + +
|
||||
* _INSERT_TAIL - - + + +
|
||||
* _REMOVE_HEAD + - + - -
|
||||
* _REMOVE + + + + +
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* Singly-linked List declarations.
|
||||
*/
|
||||
#define SLIST_HEAD(name, type) \
|
||||
struct name { \
|
||||
struct type *slh_first; /* first element */ \
|
||||
}
|
||||
|
||||
#define SLIST_HEAD_INITIALIZER(head) \
|
||||
{ NULL }
|
||||
|
||||
#define SLIST_ENTRY(type) \
|
||||
struct { \
|
||||
struct type *sle_next; /* next element */ \
|
||||
}
|
||||
|
||||
/*
|
||||
* Singly-linked List functions.
|
||||
*/
|
||||
#define SLIST_EMPTY(head) ((head)->slh_first == NULL)
|
||||
|
||||
#define SLIST_FIRST(head) ((head)->slh_first)
|
||||
|
||||
#define SLIST_FOREACH(var, head, field) \
|
||||
for ((var) = SLIST_FIRST((head)); \
|
||||
(var); \
|
||||
(var) = SLIST_NEXT((var), field))
|
||||
|
||||
#define SLIST_INIT(head) do { \
|
||||
SLIST_FIRST((head)) = NULL; \
|
||||
} while (0)
|
||||
|
||||
#define SLIST_INSERT_AFTER(slistelm, elm, field) do { \
|
||||
SLIST_NEXT((elm), field) = SLIST_NEXT((slistelm), field); \
|
||||
SLIST_NEXT((slistelm), field) = (elm); \
|
||||
} while (0)
|
||||
|
||||
#define SLIST_INSERT_HEAD(head, elm, field) do { \
|
||||
SLIST_NEXT((elm), field) = SLIST_FIRST((head)); \
|
||||
SLIST_FIRST((head)) = (elm); \
|
||||
} while (0)
|
||||
|
||||
#define SLIST_NEXT(elm, field) ((elm)->field.sle_next)
|
||||
|
||||
#define SLIST_REMOVE(head, elm, type, field) do { \
|
||||
if (SLIST_FIRST((head)) == (elm)) { \
|
||||
SLIST_REMOVE_HEAD((head), field); \
|
||||
} \
|
||||
else { \
|
||||
struct type *curelm = SLIST_FIRST((head)); \
|
||||
while (SLIST_NEXT(curelm, field) != (elm)) \
|
||||
curelm = SLIST_NEXT(curelm, field); \
|
||||
SLIST_NEXT(curelm, field) = \
|
||||
SLIST_NEXT(SLIST_NEXT(curelm, field), field); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define SLIST_REMOVE_HEAD(head, field) do { \
|
||||
SLIST_FIRST((head)) = SLIST_NEXT(SLIST_FIRST((head)), field); \
|
||||
} while (0)
|
||||
|
||||
/*
|
||||
* Singly-linked Tail queue declarations.
|
||||
*/
|
||||
#define STAILQ_HEAD(name, type) \
|
||||
struct name { \
|
||||
struct type *stqh_first;/* first element */ \
|
||||
struct type **stqh_last;/* addr of last next element */ \
|
||||
}
|
||||
|
||||
#define STAILQ_HEAD_INITIALIZER(head) \
|
||||
{ NULL, &(head).stqh_first }
|
||||
|
||||
#define STAILQ_ENTRY(type) \
|
||||
struct { \
|
||||
struct type *stqe_next; /* next element */ \
|
||||
}
|
||||
|
||||
/*
|
||||
* Singly-linked Tail queue functions.
|
||||
*/
|
||||
#define STAILQ_EMPTY(head) ((head)->stqh_first == NULL)
|
||||
|
||||
#define STAILQ_FIRST(head) ((head)->stqh_first)
|
||||
|
||||
#define STAILQ_FOREACH(var, head, field) \
|
||||
for((var) = STAILQ_FIRST((head)); \
|
||||
(var); \
|
||||
(var) = STAILQ_NEXT((var), field))
|
||||
|
||||
#define STAILQ_INIT(head) do { \
|
||||
STAILQ_FIRST((head)) = NULL; \
|
||||
(head)->stqh_last = &STAILQ_FIRST((head)); \
|
||||
} while (0)
|
||||
|
||||
#define STAILQ_INSERT_AFTER(head, tqelm, elm, field) do { \
|
||||
if ((STAILQ_NEXT((elm), field) = STAILQ_NEXT((tqelm), field)) == NULL)\
|
||||
(head)->stqh_last = &STAILQ_NEXT((elm), field); \
|
||||
STAILQ_NEXT((tqelm), field) = (elm); \
|
||||
} while (0)
|
||||
|
||||
#define STAILQ_INSERT_HEAD(head, elm, field) do { \
|
||||
if ((STAILQ_NEXT((elm), field) = STAILQ_FIRST((head))) == NULL) \
|
||||
(head)->stqh_last = &STAILQ_NEXT((elm), field); \
|
||||
STAILQ_FIRST((head)) = (elm); \
|
||||
} while (0)
|
||||
|
||||
#define STAILQ_INSERT_TAIL(head, elm, field) do { \
|
||||
STAILQ_NEXT((elm), field) = NULL; \
|
||||
*(head)->stqh_last = (elm); \
|
||||
(head)->stqh_last = &STAILQ_NEXT((elm), field); \
|
||||
} while (0)
|
||||
|
||||
#define STAILQ_LAST(head, type, field) \
|
||||
(STAILQ_EMPTY(head) ? \
|
||||
NULL : \
|
||||
((struct type *) \
|
||||
((char *)((head)->stqh_last) - offsetof(struct type, field))))
|
||||
|
||||
#define STAILQ_NEXT(elm, field) ((elm)->field.stqe_next)
|
||||
|
||||
#define STAILQ_REMOVE(head, elm, type, field) do { \
|
||||
if (STAILQ_FIRST((head)) == (elm)) { \
|
||||
STAILQ_REMOVE_HEAD(head, field); \
|
||||
} \
|
||||
else { \
|
||||
struct type *curelm = STAILQ_FIRST((head)); \
|
||||
while (STAILQ_NEXT(curelm, field) != (elm)) \
|
||||
curelm = STAILQ_NEXT(curelm, field); \
|
||||
if ((STAILQ_NEXT(curelm, field) = \
|
||||
STAILQ_NEXT(STAILQ_NEXT(curelm, field), field)) == NULL)\
|
||||
(head)->stqh_last = &STAILQ_NEXT((curelm), field);\
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define STAILQ_REMOVE_HEAD(head, field) do { \
|
||||
if ((STAILQ_FIRST((head)) = \
|
||||
STAILQ_NEXT(STAILQ_FIRST((head)), field)) == NULL) \
|
||||
(head)->stqh_last = &STAILQ_FIRST((head)); \
|
||||
} while (0)
|
||||
|
||||
#define STAILQ_REMOVE_HEAD_UNTIL(head, elm, field) do { \
|
||||
if ((STAILQ_FIRST((head)) = STAILQ_NEXT((elm), field)) == NULL) \
|
||||
(head)->stqh_last = &STAILQ_FIRST((head)); \
|
||||
} while (0)
|
||||
|
||||
#define STAILQ_REMOVE_AFTER(head, elm, field) do { \
|
||||
if ((STAILQ_NEXT(elm, field) = \
|
||||
STAILQ_NEXT(STAILQ_NEXT(elm, field), field)) == NULL) \
|
||||
(head)->stqh_last = &STAILQ_NEXT((elm), field); \
|
||||
} while (0)
|
||||
|
||||
/*
|
||||
* List declarations.
|
||||
*/
|
||||
#define LIST_HEAD(name, type) \
|
||||
struct name { \
|
||||
struct type *lh_first; /* first element */ \
|
||||
}
|
||||
|
||||
#define LIST_HEAD_INITIALIZER(head) \
|
||||
{ NULL }
|
||||
|
||||
#define LIST_ENTRY(type) \
|
||||
struct { \
|
||||
struct type *le_next; /* next element */ \
|
||||
struct type **le_prev; /* address of previous next element */ \
|
||||
}
|
||||
|
||||
/*
|
||||
* List functions.
|
||||
*/
|
||||
|
||||
#define LIST_EMPTY(head) ((head)->lh_first == NULL)
|
||||
|
||||
#define LIST_FIRST(head) ((head)->lh_first)
|
||||
|
||||
#define LIST_FOREACH(var, head, field) \
|
||||
for ((var) = LIST_FIRST((head)); \
|
||||
(var); \
|
||||
(var) = LIST_NEXT((var), field))
|
||||
|
||||
#define LIST_INIT(head) do { \
|
||||
LIST_FIRST((head)) = NULL; \
|
||||
} while (0)
|
||||
|
||||
#define LIST_INSERT_AFTER(listelm, elm, field) do { \
|
||||
if ((LIST_NEXT((elm), field) = LIST_NEXT((listelm), field)) != NULL)\
|
||||
LIST_NEXT((listelm), field)->field.le_prev = \
|
||||
&LIST_NEXT((elm), field); \
|
||||
LIST_NEXT((listelm), field) = (elm); \
|
||||
(elm)->field.le_prev = &LIST_NEXT((listelm), field); \
|
||||
} while (0)
|
||||
|
||||
#define LIST_INSERT_BEFORE(listelm, elm, field) do { \
|
||||
(elm)->field.le_prev = (listelm)->field.le_prev; \
|
||||
LIST_NEXT((elm), field) = (listelm); \
|
||||
*(listelm)->field.le_prev = (elm); \
|
||||
(listelm)->field.le_prev = &LIST_NEXT((elm), field); \
|
||||
} while (0)
|
||||
|
||||
#define LIST_INSERT_HEAD(head, elm, field) do { \
|
||||
if ((LIST_NEXT((elm), field) = LIST_FIRST((head))) != NULL) \
|
||||
LIST_FIRST((head))->field.le_prev = &LIST_NEXT((elm), field);\
|
||||
LIST_FIRST((head)) = (elm); \
|
||||
(elm)->field.le_prev = &LIST_FIRST((head)); \
|
||||
} while (0)
|
||||
|
||||
#define LIST_NEXT(elm, field) ((elm)->field.le_next)
|
||||
|
||||
#define LIST_REMOVE(elm, field) do { \
|
||||
if (LIST_NEXT((elm), field) != NULL) \
|
||||
LIST_NEXT((elm), field)->field.le_prev = \
|
||||
(elm)->field.le_prev; \
|
||||
*(elm)->field.le_prev = LIST_NEXT((elm), field); \
|
||||
} while (0)
|
||||
|
||||
/*
|
||||
* Tail queue declarations.
|
||||
*/
|
||||
#define TAILQ_HEAD(name, type) \
|
||||
struct name { \
|
||||
struct type *tqh_first; /* first element */ \
|
||||
struct type **tqh_last; /* addr of last next element */ \
|
||||
}
|
||||
|
||||
#define TAILQ_HEAD_INITIALIZER(head) \
|
||||
{ NULL, &(head).tqh_first }
|
||||
|
||||
#define TAILQ_ENTRY(type) \
|
||||
struct { \
|
||||
struct type *tqe_next; /* next element */ \
|
||||
struct type **tqe_prev; /* address of previous next element */ \
|
||||
}
|
||||
|
||||
/*
|
||||
* Tail queue functions.
|
||||
*/
|
||||
#define TAILQ_EMPTY(head) ((head)->tqh_first == NULL)
|
||||
|
||||
#define TAILQ_FIRST(head) ((head)->tqh_first)
|
||||
|
||||
#define TAILQ_FOREACH(var, head, field) \
|
||||
for ((var) = TAILQ_FIRST((head)); \
|
||||
(var); \
|
||||
(var) = TAILQ_NEXT((var), field))
|
||||
|
||||
#define TAILQ_FOREACH_REVERSE(var, head, headname, field) \
|
||||
for ((var) = TAILQ_LAST((head), headname); \
|
||||
(var); \
|
||||
(var) = TAILQ_PREV((var), headname, field))
|
||||
|
||||
#define TAILQ_INIT(head) do { \
|
||||
TAILQ_FIRST((head)) = NULL; \
|
||||
(head)->tqh_last = &TAILQ_FIRST((head)); \
|
||||
} while (0)
|
||||
|
||||
#define TAILQ_INSERT_AFTER(head, listelm, elm, field) do { \
|
||||
if ((TAILQ_NEXT((elm), field) = TAILQ_NEXT((listelm), field)) != NULL)\
|
||||
TAILQ_NEXT((elm), field)->field.tqe_prev = \
|
||||
&TAILQ_NEXT((elm), field); \
|
||||
else \
|
||||
(head)->tqh_last = &TAILQ_NEXT((elm), field); \
|
||||
TAILQ_NEXT((listelm), field) = (elm); \
|
||||
(elm)->field.tqe_prev = &TAILQ_NEXT((listelm), field); \
|
||||
} while (0)
|
||||
|
||||
#define TAILQ_INSERT_BEFORE(listelm, elm, field) do { \
|
||||
(elm)->field.tqe_prev = (listelm)->field.tqe_prev; \
|
||||
TAILQ_NEXT((elm), field) = (listelm); \
|
||||
*(listelm)->field.tqe_prev = (elm); \
|
||||
(listelm)->field.tqe_prev = &TAILQ_NEXT((elm), field); \
|
||||
} while (0)
|
||||
|
||||
#define TAILQ_INSERT_HEAD(head, elm, field) do { \
|
||||
if ((TAILQ_NEXT((elm), field) = TAILQ_FIRST((head))) != NULL) \
|
||||
TAILQ_FIRST((head))->field.tqe_prev = \
|
||||
&TAILQ_NEXT((elm), field); \
|
||||
else \
|
||||
(head)->tqh_last = &TAILQ_NEXT((elm), field); \
|
||||
TAILQ_FIRST((head)) = (elm); \
|
||||
(elm)->field.tqe_prev = &TAILQ_FIRST((head)); \
|
||||
} while (0)
|
||||
|
||||
#define TAILQ_INSERT_TAIL(head, elm, field) do { \
|
||||
TAILQ_NEXT((elm), field) = NULL; \
|
||||
(elm)->field.tqe_prev = (head)->tqh_last; \
|
||||
*(head)->tqh_last = (elm); \
|
||||
(head)->tqh_last = &TAILQ_NEXT((elm), field); \
|
||||
} while (0)
|
||||
|
||||
#define TAILQ_LAST(head, headname) \
|
||||
(*(((struct headname *)((head)->tqh_last))->tqh_last))
|
||||
|
||||
#define TAILQ_NEXT(elm, field) ((elm)->field.tqe_next)
|
||||
|
||||
#define TAILQ_PREV(elm, headname, field) \
|
||||
(*(((struct headname *)((elm)->field.tqe_prev))->tqh_last))
|
||||
|
||||
#define TAILQ_REMOVE(head, elm, field) do { \
|
||||
if ((TAILQ_NEXT((elm), field)) != NULL) \
|
||||
TAILQ_NEXT((elm), field)->field.tqe_prev = \
|
||||
(elm)->field.tqe_prev; \
|
||||
else \
|
||||
(head)->tqh_last = (elm)->field.tqe_prev; \
|
||||
*(elm)->field.tqe_prev = TAILQ_NEXT((elm), field); \
|
||||
} while (0)
|
||||
|
||||
/*
|
||||
* Circular queue declarations.
|
||||
*/
|
||||
#define CIRCLEQ_HEAD(name, type) \
|
||||
struct name { \
|
||||
struct type *cqh_first; /* first element */ \
|
||||
struct type *cqh_last; /* last element */ \
|
||||
}
|
||||
|
||||
#define CIRCLEQ_HEAD_INITIALIZER(head) \
|
||||
{ (void *)&(head), (void *)&(head) }
|
||||
|
||||
#define CIRCLEQ_ENTRY(type) \
|
||||
struct { \
|
||||
struct type *cqe_next; /* next element */ \
|
||||
struct type *cqe_prev; /* previous element */ \
|
||||
}
|
||||
|
||||
/*
|
||||
* Circular queue functions.
|
||||
*/
|
||||
#define CIRCLEQ_EMPTY(head) ((head)->cqh_first == (void *)(head))
|
||||
|
||||
#define CIRCLEQ_FIRST(head) ((head)->cqh_first)
|
||||
|
||||
#define CIRCLEQ_FOREACH(var, head, field) \
|
||||
for ((var) = CIRCLEQ_FIRST((head)); \
|
||||
(var) != (void *)(head) || ((var) = NULL); \
|
||||
(var) = CIRCLEQ_NEXT((var), field))
|
||||
|
||||
#define CIRCLEQ_FOREACH_REVERSE(var, head, field) \
|
||||
for ((var) = CIRCLEQ_LAST((head)); \
|
||||
(var) != (void *)(head) || ((var) = NULL); \
|
||||
(var) = CIRCLEQ_PREV((var), field))
|
||||
|
||||
#define CIRCLEQ_INIT(head) do { \
|
||||
CIRCLEQ_FIRST((head)) = (void *)(head); \
|
||||
CIRCLEQ_LAST((head)) = (void *)(head); \
|
||||
} while (0)
|
||||
|
||||
#define CIRCLEQ_INSERT_AFTER(head, listelm, elm, field) do { \
|
||||
CIRCLEQ_NEXT((elm), field) = CIRCLEQ_NEXT((listelm), field); \
|
||||
CIRCLEQ_PREV((elm), field) = (listelm); \
|
||||
if (CIRCLEQ_NEXT((listelm), field) == (void *)(head)) \
|
||||
CIRCLEQ_LAST((head)) = (elm); \
|
||||
else \
|
||||
CIRCLEQ_PREV(CIRCLEQ_NEXT((listelm), field), field) = (elm);\
|
||||
CIRCLEQ_NEXT((listelm), field) = (elm); \
|
||||
} while (0)
|
||||
|
||||
#define CIRCLEQ_INSERT_BEFORE(head, listelm, elm, field) do { \
|
||||
CIRCLEQ_NEXT((elm), field) = (listelm); \
|
||||
CIRCLEQ_PREV((elm), field) = CIRCLEQ_PREV((listelm), field); \
|
||||
if (CIRCLEQ_PREV((listelm), field) == (void *)(head)) \
|
||||
CIRCLEQ_FIRST((head)) = (elm); \
|
||||
else \
|
||||
CIRCLEQ_NEXT(CIRCLEQ_PREV((listelm), field), field) = (elm);\
|
||||
CIRCLEQ_PREV((listelm), field) = (elm); \
|
||||
} while (0)
|
||||
|
||||
#define CIRCLEQ_INSERT_HEAD(head, elm, field) do { \
|
||||
CIRCLEQ_NEXT((elm), field) = CIRCLEQ_FIRST((head)); \
|
||||
CIRCLEQ_PREV((elm), field) = (void *)(head); \
|
||||
if (CIRCLEQ_LAST((head)) == (void *)(head)) \
|
||||
CIRCLEQ_LAST((head)) = (elm); \
|
||||
else \
|
||||
CIRCLEQ_PREV(CIRCLEQ_FIRST((head)), field) = (elm); \
|
||||
CIRCLEQ_FIRST((head)) = (elm); \
|
||||
} while (0)
|
||||
|
||||
#define CIRCLEQ_INSERT_TAIL(head, elm, field) do { \
|
||||
CIRCLEQ_NEXT((elm), field) = (void *)(head); \
|
||||
CIRCLEQ_PREV((elm), field) = CIRCLEQ_LAST((head)); \
|
||||
if (CIRCLEQ_FIRST((head)) == (void *)(head)) \
|
||||
CIRCLEQ_FIRST((head)) = (elm); \
|
||||
else \
|
||||
CIRCLEQ_NEXT(CIRCLEQ_LAST((head)), field) = (elm); \
|
||||
CIRCLEQ_LAST((head)) = (elm); \
|
||||
} while (0)
|
||||
|
||||
#define CIRCLEQ_LAST(head) ((head)->cqh_last)
|
||||
|
||||
#define CIRCLEQ_NEXT(elm,field) ((elm)->field.cqe_next)
|
||||
|
||||
#define CIRCLEQ_PREV(elm,field) ((elm)->field.cqe_prev)
|
||||
|
||||
#define CIRCLEQ_REMOVE(head, elm, field) do { \
|
||||
if (CIRCLEQ_NEXT((elm), field) == (void *)(head)) \
|
||||
CIRCLEQ_LAST((head)) = CIRCLEQ_PREV((elm), field); \
|
||||
else \
|
||||
CIRCLEQ_PREV(CIRCLEQ_NEXT((elm), field), field) = \
|
||||
CIRCLEQ_PREV((elm), field); \
|
||||
if (CIRCLEQ_PREV((elm), field) == (void *)(head)) \
|
||||
CIRCLEQ_FIRST((head)) = CIRCLEQ_NEXT((elm), field); \
|
||||
else \
|
||||
CIRCLEQ_NEXT(CIRCLEQ_PREV((elm), field), field) = \
|
||||
CIRCLEQ_NEXT((elm), field); \
|
||||
} while (0)
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* !_QUEUE_H_ */
|
||||
@@ -0,0 +1,80 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
#ifndef __STATS_H__
|
||||
#define __STATS_H__
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define STATS_SECT_DECL(__name) struct stats_ ## __name
|
||||
#define STATS_SECT_END };
|
||||
|
||||
#define STATS_SECT_START(__name) STATS_SECT_DECL(__name) {
|
||||
#define STATS_SECT_VAR(__var)
|
||||
|
||||
#define STATS_HDR(__sectname) NULL
|
||||
|
||||
#define STATS_SECT_ENTRY(__var)
|
||||
#define STATS_SECT_ENTRY16(__var)
|
||||
#define STATS_SECT_ENTRY32(__var)
|
||||
#define STATS_SECT_ENTRY64(__var)
|
||||
#define STATS_RESET(__var)
|
||||
|
||||
#define STATS_SIZE_INIT_PARMS(__sectvarname, __size) \
|
||||
0, 0
|
||||
|
||||
#define STATS_INC(__sectvarname, __var)
|
||||
#define STATS_INCN(__sectvarname, __var, __n)
|
||||
#define STATS_CLEAR(__sectvarname, __var)
|
||||
|
||||
#define STATS_NAME_START(__name)
|
||||
#define STATS_NAME(__name, __entry)
|
||||
#define STATS_NAME_END(__name)
|
||||
#define STATS_NAME_INIT_PARMS(__name) NULL, 0
|
||||
|
||||
static inline int
|
||||
stats_init(void *a, uint8_t b, uint8_t c, void *d, uint8_t e)
|
||||
{
|
||||
/* dummy */
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int
|
||||
stats_register(void *a, void *b)
|
||||
{
|
||||
/* dummy */
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int
|
||||
stats_init_and_reg(void *a, uint8_t b, uint8_t c, void *d, uint8_t e, void *f)
|
||||
{
|
||||
/* dummy */
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __STATS_H__ */
|
||||
@@ -0,0 +1,886 @@
|
||||
/**
|
||||
* This file was generated by Apache Newt version: 1.4.0-dev
|
||||
*/
|
||||
|
||||
#ifndef H_MYNEWT_SYSCFG_
|
||||
#define H_MYNEWT_SYSCFG_
|
||||
|
||||
/**
|
||||
* This macro exists to ensure code includes this header when needed. If code
|
||||
* checks the existence of a setting directly via ifdef without including this
|
||||
* header, the setting macro will silently evaluate to 0. In contrast, an
|
||||
* attempt to use these macros without including this header will result in a
|
||||
* compiler error.
|
||||
*/
|
||||
#define MYNEWT_VAL(x) MYNEWT_VAL_ ## x
|
||||
|
||||
|
||||
|
||||
/*** compiler/arm-none-eabi-m4 */
|
||||
#ifndef MYNEWT_VAL_HARDFLOAT
|
||||
#define MYNEWT_VAL_HARDFLOAT (0)
|
||||
#endif
|
||||
|
||||
/*** hw/bsp/nrf52840pdk */
|
||||
#ifndef MYNEWT_VAL_BSP_NRF52840
|
||||
#define MYNEWT_VAL_BSP_NRF52840 (1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_I2C_0_FREQ_KHZ
|
||||
#define MYNEWT_VAL_I2C_0_FREQ_KHZ (100)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_I2C_0_PIN_SCL
|
||||
#define MYNEWT_VAL_I2C_0_PIN_SCL (27)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_I2C_0_PIN_SDA
|
||||
#define MYNEWT_VAL_I2C_0_PIN_SDA (26)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_PWM_3
|
||||
#define MYNEWT_VAL_PWM_3 (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_SPI_0_MASTER_PIN_MISO
|
||||
#define MYNEWT_VAL_SPI_0_MASTER_PIN_MISO (47)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_SPI_0_MASTER_PIN_MOSI
|
||||
#define MYNEWT_VAL_SPI_0_MASTER_PIN_MOSI (46)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_SPI_0_MASTER_PIN_SCK
|
||||
#define MYNEWT_VAL_SPI_0_MASTER_PIN_SCK (45)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_SPI_0_SLAVE_PIN_MISO
|
||||
#define MYNEWT_VAL_SPI_0_SLAVE_PIN_MISO (47)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_SPI_0_SLAVE_PIN_MOSI
|
||||
#define MYNEWT_VAL_SPI_0_SLAVE_PIN_MOSI (46)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_SPI_0_SLAVE_PIN_SCK
|
||||
#define MYNEWT_VAL_SPI_0_SLAVE_PIN_SCK (45)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_SPI_0_SLAVE_PIN_SS
|
||||
#define MYNEWT_VAL_SPI_0_SLAVE_PIN_SS (44)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_TIMER_0
|
||||
#define MYNEWT_VAL_TIMER_0 (1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_TIMER_1
|
||||
#define MYNEWT_VAL_TIMER_1 (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_TIMER_2
|
||||
#define MYNEWT_VAL_TIMER_2 (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_TIMER_3
|
||||
#define MYNEWT_VAL_TIMER_3 (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_TIMER_4
|
||||
#define MYNEWT_VAL_TIMER_4 (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_TIMER_5
|
||||
#define MYNEWT_VAL_TIMER_5 (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_UART_0
|
||||
#define MYNEWT_VAL_UART_0 (1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_UART_0_PIN_CTS
|
||||
#define MYNEWT_VAL_UART_0_PIN_CTS (7)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_UART_0_PIN_RTS
|
||||
#define MYNEWT_VAL_UART_0_PIN_RTS (5)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_UART_0_PIN_RX
|
||||
#define MYNEWT_VAL_UART_0_PIN_RX (8)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_UART_0_PIN_TX
|
||||
#define MYNEWT_VAL_UART_0_PIN_TX (6)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_UART_1
|
||||
#define MYNEWT_VAL_UART_1 (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_UART_1_PIN_CTS
|
||||
#define MYNEWT_VAL_UART_1_PIN_CTS (-1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_UART_1_PIN_RTS
|
||||
#define MYNEWT_VAL_UART_1_PIN_RTS (-1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_UART_1_PIN_RX
|
||||
#define MYNEWT_VAL_UART_1_PIN_RX (-1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_UART_1_PIN_TX
|
||||
#define MYNEWT_VAL_UART_1_PIN_TX (-1)
|
||||
#endif
|
||||
|
||||
/*** hw/mcu/nordic/nrf52xxx */
|
||||
#ifndef MYNEWT_VAL_ADC_0
|
||||
#define MYNEWT_VAL_ADC_0 (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_ADC_0_REFMV_0
|
||||
#define MYNEWT_VAL_ADC_0_REFMV_0 (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_I2C_0
|
||||
#define MYNEWT_VAL_I2C_0 (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_I2C_1
|
||||
#define MYNEWT_VAL_I2C_1 (0)
|
||||
#endif
|
||||
|
||||
/* Overridden by hw/bsp/nrf52840pdk (defined by hw/mcu/nordic/nrf52xxx) */
|
||||
#ifndef MYNEWT_VAL_MCU_DCDC_ENABLED
|
||||
#define MYNEWT_VAL_MCU_DCDC_ENABLED (1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_MCU_FLASH_MIN_WRITE_SIZE
|
||||
#define MYNEWT_VAL_MCU_FLASH_MIN_WRITE_SIZE (1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_PWM_0
|
||||
#define MYNEWT_VAL_PWM_0 (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_PWM_1
|
||||
#define MYNEWT_VAL_PWM_1 (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_PWM_2
|
||||
#define MYNEWT_VAL_PWM_2 (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_QSPI_ADDRMODE
|
||||
#define MYNEWT_VAL_QSPI_ADDRMODE (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_QSPI_DPMCONFIG
|
||||
#define MYNEWT_VAL_QSPI_DPMCONFIG (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_QSPI_ENABLE
|
||||
#define MYNEWT_VAL_QSPI_ENABLE (0)
|
||||
#endif
|
||||
|
||||
/* Overridden by hw/bsp/nrf52840pdk (defined by hw/mcu/nordic/nrf52xxx) */
|
||||
#ifndef MYNEWT_VAL_QSPI_FLASH_PAGE_SIZE
|
||||
#define MYNEWT_VAL_QSPI_FLASH_PAGE_SIZE (256)
|
||||
#endif
|
||||
|
||||
/* Overridden by hw/bsp/nrf52840pdk (defined by hw/mcu/nordic/nrf52xxx) */
|
||||
#ifndef MYNEWT_VAL_QSPI_FLASH_SECTOR_COUNT
|
||||
#define MYNEWT_VAL_QSPI_FLASH_SECTOR_COUNT (4096)
|
||||
#endif
|
||||
|
||||
/* Overridden by hw/bsp/nrf52840pdk (defined by hw/mcu/nordic/nrf52xxx) */
|
||||
#ifndef MYNEWT_VAL_QSPI_FLASH_SECTOR_SIZE
|
||||
#define MYNEWT_VAL_QSPI_FLASH_SECTOR_SIZE (4096)
|
||||
#endif
|
||||
|
||||
/* Overridden by hw/bsp/nrf52840pdk (defined by hw/mcu/nordic/nrf52xxx) */
|
||||
#ifndef MYNEWT_VAL_QSPI_PIN_CS
|
||||
#define MYNEWT_VAL_QSPI_PIN_CS (17)
|
||||
#endif
|
||||
|
||||
/* Overridden by hw/bsp/nrf52840pdk (defined by hw/mcu/nordic/nrf52xxx) */
|
||||
#ifndef MYNEWT_VAL_QSPI_PIN_DIO0
|
||||
#define MYNEWT_VAL_QSPI_PIN_DIO0 (20)
|
||||
#endif
|
||||
|
||||
/* Overridden by hw/bsp/nrf52840pdk (defined by hw/mcu/nordic/nrf52xxx) */
|
||||
#ifndef MYNEWT_VAL_QSPI_PIN_DIO1
|
||||
#define MYNEWT_VAL_QSPI_PIN_DIO1 (21)
|
||||
#endif
|
||||
|
||||
/* Overridden by hw/bsp/nrf52840pdk (defined by hw/mcu/nordic/nrf52xxx) */
|
||||
#ifndef MYNEWT_VAL_QSPI_PIN_DIO2
|
||||
#define MYNEWT_VAL_QSPI_PIN_DIO2 (22)
|
||||
#endif
|
||||
|
||||
/* Overridden by hw/bsp/nrf52840pdk (defined by hw/mcu/nordic/nrf52xxx) */
|
||||
#ifndef MYNEWT_VAL_QSPI_PIN_DIO3
|
||||
#define MYNEWT_VAL_QSPI_PIN_DIO3 (23)
|
||||
#endif
|
||||
|
||||
/* Overridden by hw/bsp/nrf52840pdk (defined by hw/mcu/nordic/nrf52xxx) */
|
||||
#ifndef MYNEWT_VAL_QSPI_PIN_SCK
|
||||
#define MYNEWT_VAL_QSPI_PIN_SCK (19)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_QSPI_READOC
|
||||
#define MYNEWT_VAL_QSPI_READOC (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_QSPI_SCK_DELAY
|
||||
#define MYNEWT_VAL_QSPI_SCK_DELAY (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_QSPI_SCK_FREQ
|
||||
#define MYNEWT_VAL_QSPI_SCK_FREQ (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_QSPI_SPI_MODE
|
||||
#define MYNEWT_VAL_QSPI_SPI_MODE (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_QSPI_WRITEOC
|
||||
#define MYNEWT_VAL_QSPI_WRITEOC (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_SOFT_PWM
|
||||
#define MYNEWT_VAL_SOFT_PWM (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_SPI_0_MASTER
|
||||
#define MYNEWT_VAL_SPI_0_MASTER (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_SPI_0_SLAVE
|
||||
#define MYNEWT_VAL_SPI_0_SLAVE (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_SPI_1_MASTER
|
||||
#define MYNEWT_VAL_SPI_1_MASTER (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_SPI_1_SLAVE
|
||||
#define MYNEWT_VAL_SPI_1_SLAVE (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_SPI_2_MASTER
|
||||
#define MYNEWT_VAL_SPI_2_MASTER (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_SPI_2_SLAVE
|
||||
#define MYNEWT_VAL_SPI_2_SLAVE (0)
|
||||
#endif
|
||||
|
||||
/* Overridden by hw/bsp/nrf52840pdk (defined by hw/mcu/nordic/nrf52xxx) */
|
||||
#ifndef MYNEWT_VAL_XTAL_32768
|
||||
#define MYNEWT_VAL_XTAL_32768 (1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_XTAL_32768_SYNTH
|
||||
#define MYNEWT_VAL_XTAL_32768_SYNTH (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_XTAL_RC
|
||||
#define MYNEWT_VAL_XTAL_RC (0)
|
||||
#endif
|
||||
|
||||
/*** kernel/os */
|
||||
#ifndef MYNEWT_VAL_FLOAT_USER
|
||||
#define MYNEWT_VAL_FLOAT_USER (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_MSYS_1_BLOCK_COUNT
|
||||
#define MYNEWT_VAL_MSYS_1_BLOCK_COUNT (12)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_MSYS_1_BLOCK_SIZE
|
||||
#define MYNEWT_VAL_MSYS_1_BLOCK_SIZE (292)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_MSYS_2_BLOCK_COUNT
|
||||
#define MYNEWT_VAL_MSYS_2_BLOCK_COUNT (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_MSYS_2_BLOCK_SIZE
|
||||
#define MYNEWT_VAL_MSYS_2_BLOCK_SIZE (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_OS_CLI
|
||||
#define MYNEWT_VAL_OS_CLI (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_OS_COREDUMP
|
||||
#define MYNEWT_VAL_OS_COREDUMP (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_OS_CPUTIME_FREQ
|
||||
#define MYNEWT_VAL_OS_CPUTIME_FREQ (1000000)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_OS_CPUTIME_TIMER_NUM
|
||||
#define MYNEWT_VAL_OS_CPUTIME_TIMER_NUM (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_OS_CTX_SW_STACK_CHECK
|
||||
#define MYNEWT_VAL_OS_CTX_SW_STACK_CHECK (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_OS_CTX_SW_STACK_GUARD
|
||||
#define MYNEWT_VAL_OS_CTX_SW_STACK_GUARD (4)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_OS_MAIN_STACK_SIZE
|
||||
#define MYNEWT_VAL_OS_MAIN_STACK_SIZE (1024)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_OS_MAIN_TASK_PRIO
|
||||
#define MYNEWT_VAL_OS_MAIN_TASK_PRIO (127)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_OS_MEMPOOL_CHECK
|
||||
#define MYNEWT_VAL_OS_MEMPOOL_CHECK (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_OS_MEMPOOL_POISON
|
||||
#define MYNEWT_VAL_OS_MEMPOOL_POISON (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_OS_SCHEDULING
|
||||
#define MYNEWT_VAL_OS_SCHEDULING (1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_OS_SYSVIEW
|
||||
#define MYNEWT_VAL_OS_SYSVIEW (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_SANITY_INTERVAL
|
||||
#define MYNEWT_VAL_SANITY_INTERVAL (15000)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_WATCHDOG_INTERVAL
|
||||
#define MYNEWT_VAL_WATCHDOG_INTERVAL (30000)
|
||||
#endif
|
||||
|
||||
/*** libc/baselibc */
|
||||
#ifndef MYNEWT_VAL_BASELIBC_ASSERT_FILE_LINE
|
||||
#define MYNEWT_VAL_BASELIBC_ASSERT_FILE_LINE (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BASELIBC_PRESENT
|
||||
#define MYNEWT_VAL_BASELIBC_PRESENT (1)
|
||||
#endif
|
||||
|
||||
/*** nimble */
|
||||
#ifndef MYNEWT_VAL_BLE_EXT_ADV
|
||||
#define MYNEWT_VAL_BLE_EXT_ADV (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_EXT_ADV_MAX_SIZE
|
||||
#define MYNEWT_VAL_BLE_EXT_ADV_MAX_SIZE (31)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MAX_CONNECTIONS
|
||||
#define MYNEWT_VAL_BLE_MAX_CONNECTIONS (1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MULTI_ADV_INSTANCES
|
||||
#define MYNEWT_VAL_BLE_MULTI_ADV_INSTANCES (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_ROLE_BROADCASTER
|
||||
#define MYNEWT_VAL_BLE_ROLE_BROADCASTER (1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_ROLE_CENTRAL
|
||||
#define MYNEWT_VAL_BLE_ROLE_CENTRAL (1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_ROLE_OBSERVER
|
||||
#define MYNEWT_VAL_BLE_ROLE_OBSERVER (1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_ROLE_PERIPHERAL
|
||||
#define MYNEWT_VAL_BLE_ROLE_PERIPHERAL (1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_WHITELIST
|
||||
#define MYNEWT_VAL_BLE_WHITELIST (1)
|
||||
#endif
|
||||
|
||||
/*** nimble/host */
|
||||
#ifndef MYNEWT_VAL_BLE_ATT_PREFERRED_MTU
|
||||
#define MYNEWT_VAL_BLE_ATT_PREFERRED_MTU (256)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_ATT_SVR_FIND_INFO
|
||||
#define MYNEWT_VAL_BLE_ATT_SVR_FIND_INFO (1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_ATT_SVR_FIND_TYPE
|
||||
#define MYNEWT_VAL_BLE_ATT_SVR_FIND_TYPE (1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_ATT_SVR_INDICATE
|
||||
#define MYNEWT_VAL_BLE_ATT_SVR_INDICATE (1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_ATT_SVR_MAX_PREP_ENTRIES
|
||||
#define MYNEWT_VAL_BLE_ATT_SVR_MAX_PREP_ENTRIES (64)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_ATT_SVR_NOTIFY
|
||||
#define MYNEWT_VAL_BLE_ATT_SVR_NOTIFY (1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_ATT_SVR_QUEUED_WRITE
|
||||
#define MYNEWT_VAL_BLE_ATT_SVR_QUEUED_WRITE (1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_ATT_SVR_QUEUED_WRITE_TMO
|
||||
#define MYNEWT_VAL_BLE_ATT_SVR_QUEUED_WRITE_TMO (30000)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_ATT_SVR_READ
|
||||
#define MYNEWT_VAL_BLE_ATT_SVR_READ (1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_ATT_SVR_READ_BLOB
|
||||
#define MYNEWT_VAL_BLE_ATT_SVR_READ_BLOB (1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_ATT_SVR_READ_GROUP_TYPE
|
||||
#define MYNEWT_VAL_BLE_ATT_SVR_READ_GROUP_TYPE (1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_ATT_SVR_READ_MULT
|
||||
#define MYNEWT_VAL_BLE_ATT_SVR_READ_MULT (1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_ATT_SVR_READ_TYPE
|
||||
#define MYNEWT_VAL_BLE_ATT_SVR_READ_TYPE (1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_ATT_SVR_SIGNED_WRITE
|
||||
#define MYNEWT_VAL_BLE_ATT_SVR_SIGNED_WRITE (1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_ATT_SVR_WRITE
|
||||
#define MYNEWT_VAL_BLE_ATT_SVR_WRITE (1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_ATT_SVR_WRITE_NO_RSP
|
||||
#define MYNEWT_VAL_BLE_ATT_SVR_WRITE_NO_RSP (1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_GATT_DISC_ALL_CHRS
|
||||
#define MYNEWT_VAL_BLE_GATT_DISC_ALL_CHRS (MYNEWT_VAL_BLE_ROLE_CENTRAL)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_GATT_DISC_ALL_DSCS
|
||||
#define MYNEWT_VAL_BLE_GATT_DISC_ALL_DSCS (MYNEWT_VAL_BLE_ROLE_CENTRAL)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_GATT_DISC_ALL_SVCS
|
||||
#define MYNEWT_VAL_BLE_GATT_DISC_ALL_SVCS (MYNEWT_VAL_BLE_ROLE_CENTRAL)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_GATT_DISC_CHR_UUID
|
||||
#define MYNEWT_VAL_BLE_GATT_DISC_CHR_UUID (MYNEWT_VAL_BLE_ROLE_CENTRAL)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_GATT_DISC_SVC_UUID
|
||||
#define MYNEWT_VAL_BLE_GATT_DISC_SVC_UUID (MYNEWT_VAL_BLE_ROLE_CENTRAL)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_GATT_FIND_INC_SVCS
|
||||
#define MYNEWT_VAL_BLE_GATT_FIND_INC_SVCS (MYNEWT_VAL_BLE_ROLE_CENTRAL)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_GATT_INDICATE
|
||||
#define MYNEWT_VAL_BLE_GATT_INDICATE (1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_GATT_MAX_PROCS
|
||||
#define MYNEWT_VAL_BLE_GATT_MAX_PROCS (4)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_GATT_NOTIFY
|
||||
#define MYNEWT_VAL_BLE_GATT_NOTIFY (1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_GATT_READ
|
||||
#define MYNEWT_VAL_BLE_GATT_READ (MYNEWT_VAL_BLE_ROLE_CENTRAL)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_GATT_READ_LONG
|
||||
#define MYNEWT_VAL_BLE_GATT_READ_LONG (MYNEWT_VAL_BLE_ROLE_CENTRAL)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_GATT_READ_MAX_ATTRS
|
||||
#define MYNEWT_VAL_BLE_GATT_READ_MAX_ATTRS (8)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_GATT_READ_MULT
|
||||
#define MYNEWT_VAL_BLE_GATT_READ_MULT (MYNEWT_VAL_BLE_ROLE_CENTRAL)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_GATT_READ_UUID
|
||||
#define MYNEWT_VAL_BLE_GATT_READ_UUID (MYNEWT_VAL_BLE_ROLE_CENTRAL)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_GATT_RESUME_RATE
|
||||
#define MYNEWT_VAL_BLE_GATT_RESUME_RATE (1000)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_GATT_SIGNED_WRITE
|
||||
#define MYNEWT_VAL_BLE_GATT_SIGNED_WRITE (MYNEWT_VAL_BLE_ROLE_CENTRAL)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_GATT_WRITE
|
||||
#define MYNEWT_VAL_BLE_GATT_WRITE (MYNEWT_VAL_BLE_ROLE_CENTRAL)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_GATT_WRITE_LONG
|
||||
#define MYNEWT_VAL_BLE_GATT_WRITE_LONG (MYNEWT_VAL_BLE_ROLE_CENTRAL)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_GATT_WRITE_MAX_ATTRS
|
||||
#define MYNEWT_VAL_BLE_GATT_WRITE_MAX_ATTRS (4)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_GATT_WRITE_NO_RSP
|
||||
#define MYNEWT_VAL_BLE_GATT_WRITE_NO_RSP (MYNEWT_VAL_BLE_ROLE_CENTRAL)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_GATT_WRITE_RELIABLE
|
||||
#define MYNEWT_VAL_BLE_GATT_WRITE_RELIABLE (MYNEWT_VAL_BLE_ROLE_CENTRAL)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_HOST
|
||||
#define MYNEWT_VAL_BLE_HOST (1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_HS_DEBUG
|
||||
#define MYNEWT_VAL_BLE_HS_DEBUG (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_HS_FLOW_CTRL
|
||||
#define MYNEWT_VAL_BLE_HS_FLOW_CTRL (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_HS_FLOW_CTRL_ITVL
|
||||
#define MYNEWT_VAL_BLE_HS_FLOW_CTRL_ITVL (1000)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_HS_FLOW_CTRL_THRESH
|
||||
#define MYNEWT_VAL_BLE_HS_FLOW_CTRL_THRESH (2)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_HS_FLOW_CTRL_TX_ON_DISCONNECT
|
||||
#define MYNEWT_VAL_BLE_HS_FLOW_CTRL_TX_ON_DISCONNECT (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_HS_PHONY_HCI_ACKS
|
||||
#define MYNEWT_VAL_BLE_HS_PHONY_HCI_ACKS (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_HS_REQUIRE_OS
|
||||
#define MYNEWT_VAL_BLE_HS_REQUIRE_OS (1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_L2CAP_COC_MAX_NUM
|
||||
#define MYNEWT_VAL_BLE_L2CAP_COC_MAX_NUM (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_L2CAP_JOIN_RX_FRAGS
|
||||
#define MYNEWT_VAL_BLE_L2CAP_JOIN_RX_FRAGS (1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_L2CAP_MAX_CHANS
|
||||
#define MYNEWT_VAL_BLE_L2CAP_MAX_CHANS (3*MYNEWT_VAL_BLE_MAX_CONNECTIONS)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_L2CAP_RX_FRAG_TIMEOUT
|
||||
#define MYNEWT_VAL_BLE_L2CAP_RX_FRAG_TIMEOUT (30000)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_L2CAP_SIG_MAX_PROCS
|
||||
#define MYNEWT_VAL_BLE_L2CAP_SIG_MAX_PROCS (1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MESH
|
||||
#define MYNEWT_VAL_BLE_MESH (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MONITOR_CONSOLE_BUFFER_SIZE
|
||||
#define MYNEWT_VAL_BLE_MONITOR_CONSOLE_BUFFER_SIZE (128)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MONITOR_RTT
|
||||
#define MYNEWT_VAL_BLE_MONITOR_RTT (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MONITOR_RTT_BUFFERED
|
||||
#define MYNEWT_VAL_BLE_MONITOR_RTT_BUFFERED (1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MONITOR_RTT_BUFFER_NAME
|
||||
#define MYNEWT_VAL_BLE_MONITOR_RTT_BUFFER_NAME ("monitor")
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MONITOR_RTT_BUFFER_SIZE
|
||||
#define MYNEWT_VAL_BLE_MONITOR_RTT_BUFFER_SIZE (256)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MONITOR_UART
|
||||
#define MYNEWT_VAL_BLE_MONITOR_UART (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MONITOR_UART_BAUDRATE
|
||||
#define MYNEWT_VAL_BLE_MONITOR_UART_BAUDRATE (1000000)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MONITOR_UART_BUFFER_SIZE
|
||||
#define MYNEWT_VAL_BLE_MONITOR_UART_BUFFER_SIZE (64)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MONITOR_UART_DEV
|
||||
#define MYNEWT_VAL_BLE_MONITOR_UART_DEV ("uart0")
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_RPA_TIMEOUT
|
||||
#define MYNEWT_VAL_BLE_RPA_TIMEOUT (300)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_SM_BONDING
|
||||
#define MYNEWT_VAL_BLE_SM_BONDING (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_SM_IO_CAP
|
||||
#define MYNEWT_VAL_BLE_SM_IO_CAP (BLE_HS_IO_NO_INPUT_OUTPUT)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_SM_KEYPRESS
|
||||
#define MYNEWT_VAL_BLE_SM_KEYPRESS (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_SM_LEGACY
|
||||
#define MYNEWT_VAL_BLE_SM_LEGACY (1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_SM_MAX_PROCS
|
||||
#define MYNEWT_VAL_BLE_SM_MAX_PROCS (1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_SM_MITM
|
||||
#define MYNEWT_VAL_BLE_SM_MITM (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_SM_OOB_DATA_FLAG
|
||||
#define MYNEWT_VAL_BLE_SM_OOB_DATA_FLAG (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_SM_OUR_KEY_DIST
|
||||
#define MYNEWT_VAL_BLE_SM_OUR_KEY_DIST (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_SM_SC
|
||||
#define MYNEWT_VAL_BLE_SM_SC (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_SM_THEIR_KEY_DIST
|
||||
#define MYNEWT_VAL_BLE_SM_THEIR_KEY_DIST (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_STORE_MAX_BONDS
|
||||
#define MYNEWT_VAL_BLE_STORE_MAX_BONDS (3)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_STORE_MAX_CCCDS
|
||||
#define MYNEWT_VAL_BLE_STORE_MAX_CCCDS (8)
|
||||
#endif
|
||||
|
||||
/*** nimble/host/services/ans */
|
||||
#ifndef MYNEWT_VAL_BLE_SVC_ANS_NEW_ALERT_CAT
|
||||
#define MYNEWT_VAL_BLE_SVC_ANS_NEW_ALERT_CAT (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_SVC_ANS_UNR_ALERT_CAT
|
||||
#define MYNEWT_VAL_BLE_SVC_ANS_UNR_ALERT_CAT (0)
|
||||
#endif
|
||||
|
||||
/*** nimble/host/services/bas */
|
||||
#ifndef MYNEWT_VAL_BLE_SVC_BAS_BATTERY_LEVEL_NOTIFY_ENABLE
|
||||
#define MYNEWT_VAL_BLE_SVC_BAS_BATTERY_LEVEL_NOTIFY_ENABLE (1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_SVC_BAS_BATTERY_LEVEL_READ_PERM
|
||||
#define MYNEWT_VAL_BLE_SVC_BAS_BATTERY_LEVEL_READ_PERM (0)
|
||||
#endif
|
||||
|
||||
/*** nimble/host/services/gap */
|
||||
#ifndef MYNEWT_VAL_BLE_SVC_GAP_APPEARANCE
|
||||
#define MYNEWT_VAL_BLE_SVC_GAP_APPEARANCE (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_SVC_GAP_APPEARANCE_WRITE_PERM
|
||||
#define MYNEWT_VAL_BLE_SVC_GAP_APPEARANCE_WRITE_PERM (-1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_SVC_GAP_CENTRAL_ADDRESS_RESOLUTION
|
||||
#define MYNEWT_VAL_BLE_SVC_GAP_CENTRAL_ADDRESS_RESOLUTION (-1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_SVC_GAP_DEVICE_NAME
|
||||
#define MYNEWT_VAL_BLE_SVC_GAP_DEVICE_NAME ("nimble")
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_SVC_GAP_DEVICE_NAME_MAX_LENGTH
|
||||
#define MYNEWT_VAL_BLE_SVC_GAP_DEVICE_NAME_MAX_LENGTH (31)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_SVC_GAP_DEVICE_NAME_WRITE_PERM
|
||||
#define MYNEWT_VAL_BLE_SVC_GAP_DEVICE_NAME_WRITE_PERM (-1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_SVC_GAP_PPCP_MAX_CONN_INTERVAL
|
||||
#define MYNEWT_VAL_BLE_SVC_GAP_PPCP_MAX_CONN_INTERVAL (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_SVC_GAP_PPCP_MIN_CONN_INTERVAL
|
||||
#define MYNEWT_VAL_BLE_SVC_GAP_PPCP_MIN_CONN_INTERVAL (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_SVC_GAP_PPCP_SLAVE_LATENCY
|
||||
#define MYNEWT_VAL_BLE_SVC_GAP_PPCP_SLAVE_LATENCY (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_SVC_GAP_PPCP_SUPERVISION_TMO
|
||||
#define MYNEWT_VAL_BLE_SVC_GAP_PPCP_SUPERVISION_TMO (0)
|
||||
#endif
|
||||
|
||||
/*** nimble/transport */
|
||||
#ifndef MYNEWT_VAL_BLE_HCI_TRANSPORT_EMSPI
|
||||
#define MYNEWT_VAL_BLE_HCI_TRANSPORT_EMSPI (0)
|
||||
#endif
|
||||
|
||||
/* Overridden by targets/porting-nimble (defined by nimble/transport) */
|
||||
#ifndef MYNEWT_VAL_BLE_HCI_TRANSPORT_NIMBLE_BUILTIN
|
||||
#define MYNEWT_VAL_BLE_HCI_TRANSPORT_NIMBLE_BUILTIN (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_HCI_TRANSPORT_RAM
|
||||
#define MYNEWT_VAL_BLE_HCI_TRANSPORT_RAM (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_HCI_TRANSPORT_SOCKET
|
||||
#define MYNEWT_VAL_BLE_HCI_TRANSPORT_SOCKET (0)
|
||||
#endif
|
||||
|
||||
/* Overridden by targets/porting-nimble (defined by nimble/transport) */
|
||||
#ifndef MYNEWT_VAL_BLE_HCI_TRANSPORT_UART
|
||||
#define MYNEWT_VAL_BLE_HCI_TRANSPORT_UART (1)
|
||||
#endif
|
||||
|
||||
/*** nimble/transport/uart */
|
||||
#ifndef MYNEWT_VAL_BLE_ACL_BUF_COUNT
|
||||
#define MYNEWT_VAL_BLE_ACL_BUF_COUNT (12)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_ACL_BUF_SIZE
|
||||
#define MYNEWT_VAL_BLE_ACL_BUF_SIZE (255)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_HCI_ACL_OUT_COUNT
|
||||
#define MYNEWT_VAL_BLE_HCI_ACL_OUT_COUNT (12)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_HCI_EVT_BUF_SIZE
|
||||
#define MYNEWT_VAL_BLE_HCI_EVT_BUF_SIZE (70)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_HCI_EVT_HI_BUF_COUNT
|
||||
#define MYNEWT_VAL_BLE_HCI_EVT_HI_BUF_COUNT (8)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_HCI_EVT_LO_BUF_COUNT
|
||||
#define MYNEWT_VAL_BLE_HCI_EVT_LO_BUF_COUNT (8)
|
||||
#endif
|
||||
|
||||
/* Overridden by targets/porting-nimble (defined by nimble/transport/uart) */
|
||||
#ifndef MYNEWT_VAL_BLE_HCI_UART_BAUD
|
||||
#define MYNEWT_VAL_BLE_HCI_UART_BAUD (115200)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_HCI_UART_DATA_BITS
|
||||
#define MYNEWT_VAL_BLE_HCI_UART_DATA_BITS (8)
|
||||
#endif
|
||||
|
||||
/* Overridden by targets/porting-nimble (defined by nimble/transport/uart) */
|
||||
#ifndef MYNEWT_VAL_BLE_HCI_UART_FLOW_CTRL
|
||||
#define MYNEWT_VAL_BLE_HCI_UART_FLOW_CTRL (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_HCI_UART_PARITY
|
||||
#define MYNEWT_VAL_BLE_HCI_UART_PARITY (HAL_UART_PARITY_NONE)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_HCI_UART_PORT
|
||||
#define MYNEWT_VAL_BLE_HCI_UART_PORT (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_HCI_UART_STOP_BITS
|
||||
#define MYNEWT_VAL_BLE_HCI_UART_STOP_BITS (1)
|
||||
#endif
|
||||
|
||||
/*** sys/console/stub */
|
||||
#ifndef MYNEWT_VAL_CONSOLE_UART_BAUD
|
||||
#define MYNEWT_VAL_CONSOLE_UART_BAUD (115200)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_CONSOLE_UART_DEV
|
||||
#define MYNEWT_VAL_CONSOLE_UART_DEV ("uart0")
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_CONSOLE_UART_FLOW_CONTROL
|
||||
#define MYNEWT_VAL_CONSOLE_UART_FLOW_CONTROL (UART_FLOW_CTL_NONE)
|
||||
#endif
|
||||
|
||||
/*** sys/flash_map */
|
||||
#ifndef MYNEWT_VAL_FLASH_MAP_MAX_AREAS
|
||||
#define MYNEWT_VAL_FLASH_MAP_MAX_AREAS (10)
|
||||
#endif
|
||||
|
||||
/*** sys/log/stub */
|
||||
#ifndef MYNEWT_VAL_LOG_CONSOLE
|
||||
#define MYNEWT_VAL_LOG_CONSOLE (1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_LOG_FCB
|
||||
#define MYNEWT_VAL_LOG_FCB (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_LOG_LEVEL
|
||||
#define MYNEWT_VAL_LOG_LEVEL (255)
|
||||
#endif
|
||||
|
||||
/*** sys/sysinit */
|
||||
#ifndef MYNEWT_VAL_SYSINIT_CONSTRAIN_INIT
|
||||
#define MYNEWT_VAL_SYSINIT_CONSTRAIN_INIT (1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_SYSINIT_PANIC_FILE_LINE
|
||||
#define MYNEWT_VAL_SYSINIT_PANIC_FILE_LINE (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_SYSINIT_PANIC_MESSAGE
|
||||
#define MYNEWT_VAL_SYSINIT_PANIC_MESSAGE (0)
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,37 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
#ifndef __SYSINIT_H__
|
||||
#define __SYSINIT_H__
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define SYSINIT_ASSERT_ACTIVE()
|
||||
|
||||
#define SYSINIT_PANIC_ASSERT(rc) assert(rc);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __SYSINIT_H__ */
|
||||
@@ -0,0 +1,43 @@
|
||||
#
|
||||
# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# or more contributor license agreements. See the NOTICE file
|
||||
# distributed with this work for additional information
|
||||
# regarding copyright ownership. The ASF licenses this file
|
||||
# to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing,
|
||||
# software distributed under the License is distributed on an
|
||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
|
||||
pkg.name: porting/nimble
|
||||
pkg.type: app
|
||||
pkg.description: Stub for NimBLE porting
|
||||
pkg.author: "Apache Mynewt <[email protected]>"
|
||||
pkg.homepage: "http://mynewt.apache.org/"
|
||||
pkg.keywords:
|
||||
|
||||
pkg.deps:
|
||||
- nimble/host
|
||||
- nimble/host/services/ans
|
||||
- nimble/host/services/bas
|
||||
- nimble/host/services/gap
|
||||
- nimble/host/services/gatt
|
||||
- nimble/host/services/ias
|
||||
- nimble/host/services/lls
|
||||
- nimble/host/services/tps
|
||||
- nimble/transport
|
||||
- "@apache-mynewt-core/sys/console/stub"
|
||||
- "@apache-mynewt-core/sys/log/stub"
|
||||
- "@apache-mynewt-core/sys/stats/stub"
|
||||
|
||||
# No need to build files from this package
|
||||
pkg.ign_files:
|
||||
- ".*\\.c"
|
||||
@@ -0,0 +1,218 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
#include "os/endian.h"
|
||||
|
||||
void
|
||||
put_le16(void *buf, uint16_t x)
|
||||
{
|
||||
uint8_t *u8ptr;
|
||||
|
||||
u8ptr = buf;
|
||||
u8ptr[0] = (uint8_t)x;
|
||||
u8ptr[1] = (uint8_t)(x >> 8);
|
||||
}
|
||||
|
||||
void
|
||||
put_le32(void *buf, uint32_t x)
|
||||
{
|
||||
uint8_t *u8ptr;
|
||||
|
||||
u8ptr = buf;
|
||||
u8ptr[0] = (uint8_t)x;
|
||||
u8ptr[1] = (uint8_t)(x >> 8);
|
||||
u8ptr[2] = (uint8_t)(x >> 16);
|
||||
u8ptr[3] = (uint8_t)(x >> 24);
|
||||
}
|
||||
|
||||
void
|
||||
put_le64(void *buf, uint64_t x)
|
||||
{
|
||||
uint8_t *u8ptr;
|
||||
|
||||
u8ptr = buf;
|
||||
u8ptr[0] = (uint8_t)x;
|
||||
u8ptr[1] = (uint8_t)(x >> 8);
|
||||
u8ptr[2] = (uint8_t)(x >> 16);
|
||||
u8ptr[3] = (uint8_t)(x >> 24);
|
||||
u8ptr[4] = (uint8_t)(x >> 32);
|
||||
u8ptr[5] = (uint8_t)(x >> 40);
|
||||
u8ptr[6] = (uint8_t)(x >> 48);
|
||||
u8ptr[7] = (uint8_t)(x >> 56);
|
||||
}
|
||||
|
||||
uint16_t
|
||||
get_le16(const void *buf)
|
||||
{
|
||||
const uint8_t *u8ptr;
|
||||
uint16_t x;
|
||||
|
||||
u8ptr = buf;
|
||||
x = u8ptr[0];
|
||||
x |= (uint16_t)u8ptr[1] << 8;
|
||||
|
||||
return x;
|
||||
}
|
||||
|
||||
uint32_t
|
||||
get_le32(const void *buf)
|
||||
{
|
||||
const uint8_t *u8ptr;
|
||||
uint32_t x;
|
||||
|
||||
u8ptr = buf;
|
||||
x = u8ptr[0];
|
||||
x |= (uint32_t)u8ptr[1] << 8;
|
||||
x |= (uint32_t)u8ptr[2] << 16;
|
||||
x |= (uint32_t)u8ptr[3] << 24;
|
||||
|
||||
return x;
|
||||
}
|
||||
|
||||
uint64_t
|
||||
get_le64(const void *buf)
|
||||
{
|
||||
const uint8_t *u8ptr;
|
||||
uint64_t x;
|
||||
|
||||
u8ptr = buf;
|
||||
x = u8ptr[0];
|
||||
x |= (uint64_t)u8ptr[1] << 8;
|
||||
x |= (uint64_t)u8ptr[2] << 16;
|
||||
x |= (uint64_t)u8ptr[3] << 24;
|
||||
x |= (uint64_t)u8ptr[4] << 32;
|
||||
x |= (uint64_t)u8ptr[5] << 40;
|
||||
x |= (uint64_t)u8ptr[6] << 48;
|
||||
x |= (uint64_t)u8ptr[7] << 56;
|
||||
|
||||
return x;
|
||||
}
|
||||
|
||||
void
|
||||
put_be16(void *buf, uint16_t x)
|
||||
{
|
||||
uint8_t *u8ptr;
|
||||
|
||||
u8ptr = buf;
|
||||
u8ptr[0] = (uint8_t)(x >> 8);
|
||||
u8ptr[1] = (uint8_t)x;
|
||||
}
|
||||
|
||||
void
|
||||
put_be32(void *buf, uint32_t x)
|
||||
{
|
||||
uint8_t *u8ptr;
|
||||
|
||||
u8ptr = buf;
|
||||
u8ptr[0] = (uint8_t)(x >> 24);
|
||||
u8ptr[1] = (uint8_t)(x >> 16);
|
||||
u8ptr[2] = (uint8_t)(x >> 8);
|
||||
u8ptr[3] = (uint8_t)x;
|
||||
}
|
||||
|
||||
void
|
||||
put_be64(void *buf, uint64_t x)
|
||||
{
|
||||
uint8_t *u8ptr;
|
||||
|
||||
u8ptr = buf;
|
||||
u8ptr[0] = (uint8_t)(x >> 56);
|
||||
u8ptr[1] = (uint8_t)(x >> 48);
|
||||
u8ptr[2] = (uint8_t)(x >> 40);
|
||||
u8ptr[3] = (uint8_t)(x >> 32);
|
||||
u8ptr[4] = (uint8_t)(x >> 24);
|
||||
u8ptr[5] = (uint8_t)(x >> 16);
|
||||
u8ptr[6] = (uint8_t)(x >> 8);
|
||||
u8ptr[7] = (uint8_t)x;
|
||||
}
|
||||
|
||||
uint16_t
|
||||
get_be16(const void *buf)
|
||||
{
|
||||
const uint8_t *u8ptr;
|
||||
uint16_t x;
|
||||
|
||||
u8ptr = buf;
|
||||
x = (uint16_t)u8ptr[0] << 8;
|
||||
x |= u8ptr[1];
|
||||
|
||||
return x;
|
||||
}
|
||||
|
||||
uint32_t
|
||||
get_be32(const void *buf)
|
||||
{
|
||||
const uint8_t *u8ptr;
|
||||
uint32_t x;
|
||||
|
||||
u8ptr = buf;
|
||||
x = (uint32_t)u8ptr[0] << 24;
|
||||
x |= (uint32_t)u8ptr[1] << 16;
|
||||
x |= (uint32_t)u8ptr[2] << 8;
|
||||
x |= u8ptr[3];
|
||||
|
||||
return x;
|
||||
}
|
||||
|
||||
uint64_t
|
||||
get_be64(const void *buf)
|
||||
{
|
||||
const uint8_t *u8ptr;
|
||||
uint64_t x;
|
||||
|
||||
u8ptr = buf;
|
||||
x = (uint64_t)u8ptr[0] << 56;
|
||||
x |= (uint64_t)u8ptr[1] << 48;
|
||||
x |= (uint64_t)u8ptr[2] << 40;
|
||||
x |= (uint64_t)u8ptr[3] << 32;
|
||||
x |= (uint64_t)u8ptr[4] << 24;
|
||||
x |= (uint64_t)u8ptr[5] << 16;
|
||||
x |= (uint64_t)u8ptr[6] << 8;
|
||||
x |= u8ptr[7];
|
||||
|
||||
return x;
|
||||
}
|
||||
void
|
||||
swap_in_place(void *buf, int len)
|
||||
{
|
||||
uint8_t *u8ptr;
|
||||
uint8_t tmp;
|
||||
int i;
|
||||
int j;
|
||||
|
||||
u8ptr = buf;
|
||||
|
||||
for (i = 0, j = len - 1; i < j; i++, j--) {
|
||||
tmp = u8ptr[i];
|
||||
|
||||
u8ptr[i] = u8ptr[j];
|
||||
u8ptr[j] = tmp;
|
||||
}
|
||||
}
|
||||
|
||||
/* swap octets */
|
||||
void
|
||||
swap_buf(uint8_t *dst, const uint8_t *src, int len)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < len; i++) {
|
||||
dst[len - 1 - i] = src[i];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,840 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
#include <stdint.h>
|
||||
#include <assert.h>
|
||||
#include <errno.h>
|
||||
#include "os/os.h"
|
||||
#include "nrfx.h"
|
||||
#include "hal/hal_timer.h"
|
||||
|
||||
#define __HAL_DISABLE_INTERRUPTS(x) \
|
||||
do { \
|
||||
x = __get_PRIMASK(); \
|
||||
__disable_irq(); \
|
||||
} while(0);
|
||||
|
||||
#define __HAL_ENABLE_INTERRUPTS(x) \
|
||||
do { \
|
||||
if (!x) { \
|
||||
__enable_irq(); \
|
||||
} \
|
||||
} while(0);
|
||||
|
||||
/* IRQ prototype */
|
||||
typedef void (*hal_timer_irq_handler_t)(void);
|
||||
|
||||
/* User CC 2 for reading counter, CC 3 for timer isr */
|
||||
#define NRF_TIMER_CC_READ (2)
|
||||
#define NRF_TIMER_CC_INT (3)
|
||||
|
||||
/* Output compare 2 used for RTC timers */
|
||||
#define NRF_RTC_TIMER_CC_INT (2)
|
||||
|
||||
/* Maximum number of hal timers used */
|
||||
#define NRF52_HAL_TIMER_MAX (6)
|
||||
|
||||
/* Maximum timer frequency */
|
||||
#define NRF52_MAX_TIMER_FREQ (16000000)
|
||||
|
||||
struct nrf52_hal_timer {
|
||||
uint8_t tmr_enabled;
|
||||
uint8_t tmr_irq_num;
|
||||
uint8_t tmr_rtc;
|
||||
uint8_t tmr_pad;
|
||||
uint32_t tmr_cntr;
|
||||
uint32_t timer_isrs;
|
||||
uint32_t tmr_freq;
|
||||
void *tmr_reg;
|
||||
TAILQ_HEAD(hal_timer_qhead, hal_timer) hal_timer_q;
|
||||
};
|
||||
|
||||
#if MYNEWT_VAL(TIMER_0)
|
||||
struct nrf52_hal_timer nrf52_hal_timer0;
|
||||
#endif
|
||||
#if MYNEWT_VAL(TIMER_1)
|
||||
struct nrf52_hal_timer nrf52_hal_timer1;
|
||||
#endif
|
||||
#if MYNEWT_VAL(TIMER_2)
|
||||
struct nrf52_hal_timer nrf52_hal_timer2;
|
||||
#endif
|
||||
#if MYNEWT_VAL(TIMER_3)
|
||||
struct nrf52_hal_timer nrf52_hal_timer3;
|
||||
#endif
|
||||
#if MYNEWT_VAL(TIMER_4)
|
||||
struct nrf52_hal_timer nrf52_hal_timer4;
|
||||
#endif
|
||||
#if MYNEWT_VAL(TIMER_5)
|
||||
struct nrf52_hal_timer nrf52_hal_timer5;
|
||||
#endif
|
||||
|
||||
static const struct nrf52_hal_timer *nrf52_hal_timers[NRF52_HAL_TIMER_MAX] = {
|
||||
#if MYNEWT_VAL(TIMER_0)
|
||||
&nrf52_hal_timer0,
|
||||
#else
|
||||
NULL,
|
||||
#endif
|
||||
#if MYNEWT_VAL(TIMER_1)
|
||||
&nrf52_hal_timer1,
|
||||
#else
|
||||
NULL,
|
||||
#endif
|
||||
#if MYNEWT_VAL(TIMER_2)
|
||||
&nrf52_hal_timer2,
|
||||
#else
|
||||
NULL,
|
||||
#endif
|
||||
#if MYNEWT_VAL(TIMER_3)
|
||||
&nrf52_hal_timer3,
|
||||
#else
|
||||
NULL,
|
||||
#endif
|
||||
#if MYNEWT_VAL(TIMER_4)
|
||||
&nrf52_hal_timer4,
|
||||
#else
|
||||
NULL,
|
||||
#endif
|
||||
#if MYNEWT_VAL(TIMER_5)
|
||||
&nrf52_hal_timer5
|
||||
#else
|
||||
NULL
|
||||
#endif
|
||||
};
|
||||
|
||||
/* Resolve timer number into timer structure */
|
||||
#define NRF52_HAL_TIMER_RESOLVE(__n, __v) \
|
||||
if ((__n) >= NRF52_HAL_TIMER_MAX) { \
|
||||
rc = EINVAL; \
|
||||
goto err; \
|
||||
} \
|
||||
(__v) = (struct nrf52_hal_timer *) nrf52_hal_timers[(__n)]; \
|
||||
if ((__v) == NULL) { \
|
||||
rc = EINVAL; \
|
||||
goto err; \
|
||||
}
|
||||
|
||||
/* Interrupt mask for interrupt enable/clear */
|
||||
#define NRF_TIMER_INT_MASK(x) ((1 << (uint32_t)(x)) << 16)
|
||||
|
||||
static uint32_t
|
||||
nrf_read_timer_cntr(NRF_TIMER_Type *hwtimer)
|
||||
{
|
||||
uint32_t tcntr;
|
||||
|
||||
/* Force a capture of the timer into 'cntr' capture channel; read it */
|
||||
hwtimer->TASKS_CAPTURE[NRF_TIMER_CC_READ] = 1;
|
||||
tcntr = hwtimer->CC[NRF_TIMER_CC_READ];
|
||||
|
||||
return tcntr;
|
||||
}
|
||||
|
||||
/**
|
||||
* nrf timer set ocmp
|
||||
*
|
||||
* Set the OCMP used by the timer to the desired expiration tick
|
||||
*
|
||||
* NOTE: Must be called with interrupts disabled.
|
||||
*
|
||||
* @param timer Pointer to timer.
|
||||
*/
|
||||
static void
|
||||
nrf_timer_set_ocmp(struct nrf52_hal_timer *bsptimer, uint32_t expiry)
|
||||
{
|
||||
int32_t delta_t;
|
||||
uint32_t temp;
|
||||
uint32_t cntr;
|
||||
NRF_TIMER_Type *hwtimer;
|
||||
NRF_RTC_Type *rtctimer;
|
||||
|
||||
if (bsptimer->tmr_rtc) {
|
||||
rtctimer = (NRF_RTC_Type *)bsptimer->tmr_reg;
|
||||
rtctimer->INTENCLR = NRF_TIMER_INT_MASK(NRF_RTC_TIMER_CC_INT);
|
||||
temp = bsptimer->tmr_cntr;
|
||||
cntr = rtctimer->COUNTER;
|
||||
if (rtctimer->EVENTS_OVRFLW) {
|
||||
temp += (1UL << 24);
|
||||
cntr = rtctimer->COUNTER;
|
||||
}
|
||||
temp |= cntr;
|
||||
delta_t = (int32_t)(expiry - temp);
|
||||
|
||||
/*
|
||||
* The nrf documentation states that you must set the output
|
||||
* compare to 2 greater than the counter to guarantee an interrupt.
|
||||
* Since the counter can tick once while we check, we make sure
|
||||
* it is greater than 2.
|
||||
*/
|
||||
if (delta_t < 3) {
|
||||
NVIC_SetPendingIRQ(bsptimer->tmr_irq_num);
|
||||
} else {
|
||||
if (delta_t < (1UL << 24)) {
|
||||
rtctimer->CC[NRF_RTC_TIMER_CC_INT] = expiry & 0x00ffffff;
|
||||
} else {
|
||||
/* CC too far ahead. Just make sure we set compare far ahead */
|
||||
rtctimer->CC[NRF_RTC_TIMER_CC_INT] = cntr + (1UL << 23);
|
||||
}
|
||||
rtctimer->INTENSET = NRF_TIMER_INT_MASK(NRF_RTC_TIMER_CC_INT);
|
||||
}
|
||||
} else {
|
||||
hwtimer = bsptimer->tmr_reg;
|
||||
|
||||
/* Disable ocmp interrupt and set new value */
|
||||
hwtimer->INTENCLR = NRF_TIMER_INT_MASK(NRF_TIMER_CC_INT);
|
||||
|
||||
/* Set output compare register to timer expiration */
|
||||
hwtimer->CC[NRF_TIMER_CC_INT] = expiry;
|
||||
|
||||
/* Clear interrupt flag */
|
||||
hwtimer->EVENTS_COMPARE[NRF_TIMER_CC_INT] = 0;
|
||||
|
||||
/* Enable the output compare interrupt */
|
||||
hwtimer->INTENSET = NRF_TIMER_INT_MASK(NRF_TIMER_CC_INT);
|
||||
|
||||
/* Force interrupt to occur as we may have missed it */
|
||||
if ((int32_t)(nrf_read_timer_cntr(hwtimer) - expiry) >= 0) {
|
||||
NVIC_SetPendingIRQ(bsptimer->tmr_irq_num);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Disable output compare used for timer */
|
||||
static void
|
||||
nrf_timer_disable_ocmp(NRF_TIMER_Type *hwtimer)
|
||||
{
|
||||
hwtimer->INTENCLR = NRF_TIMER_INT_MASK(NRF_TIMER_CC_INT);
|
||||
}
|
||||
|
||||
static void
|
||||
nrf_rtc_disable_ocmp(NRF_RTC_Type *rtctimer)
|
||||
{
|
||||
rtctimer->INTENCLR = NRF_TIMER_INT_MASK(NRF_RTC_TIMER_CC_INT);
|
||||
}
|
||||
|
||||
static uint32_t
|
||||
hal_timer_read_bsptimer(struct nrf52_hal_timer *bsptimer)
|
||||
{
|
||||
uint32_t low32;
|
||||
uint32_t ctx;
|
||||
uint32_t tcntr;
|
||||
NRF_RTC_Type *rtctimer;
|
||||
|
||||
rtctimer = (NRF_RTC_Type *)bsptimer->tmr_reg;
|
||||
__HAL_DISABLE_INTERRUPTS(ctx);
|
||||
tcntr = bsptimer->tmr_cntr;
|
||||
low32 = rtctimer->COUNTER;
|
||||
if (rtctimer->EVENTS_OVRFLW) {
|
||||
tcntr += (1UL << 24);
|
||||
bsptimer->tmr_cntr = tcntr;
|
||||
low32 = rtctimer->COUNTER;
|
||||
rtctimer->EVENTS_OVRFLW = 0;
|
||||
NVIC_SetPendingIRQ(bsptimer->tmr_irq_num);
|
||||
}
|
||||
tcntr |= low32;
|
||||
__HAL_ENABLE_INTERRUPTS(ctx);
|
||||
|
||||
return tcntr;
|
||||
}
|
||||
|
||||
#if (MYNEWT_VAL(TIMER_0) || MYNEWT_VAL(TIMER_1) || MYNEWT_VAL(TIMER_2) || \
|
||||
MYNEWT_VAL(TIMER_3) || MYNEWT_VAL(TIMER_4) || MYNEWT_VAL(TIMER_5))
|
||||
/**
|
||||
* hal timer chk queue
|
||||
*
|
||||
*
|
||||
* @param bsptimer
|
||||
*/
|
||||
static void
|
||||
hal_timer_chk_queue(struct nrf52_hal_timer *bsptimer)
|
||||
{
|
||||
int32_t delta;
|
||||
uint32_t tcntr;
|
||||
uint32_t ctx;
|
||||
struct hal_timer *timer;
|
||||
|
||||
/* disable interrupts */
|
||||
__HAL_DISABLE_INTERRUPTS(ctx);
|
||||
while ((timer = TAILQ_FIRST(&bsptimer->hal_timer_q)) != NULL) {
|
||||
if (bsptimer->tmr_rtc) {
|
||||
tcntr = hal_timer_read_bsptimer(bsptimer);
|
||||
/*
|
||||
* If we are within 3 ticks of RTC, we wont be able to set compare.
|
||||
* Thus, we have to service this timer early.
|
||||
*/
|
||||
delta = -3;
|
||||
} else {
|
||||
tcntr = nrf_read_timer_cntr(bsptimer->tmr_reg);
|
||||
delta = 0;
|
||||
}
|
||||
if ((int32_t)(tcntr - timer->expiry) >= delta) {
|
||||
TAILQ_REMOVE(&bsptimer->hal_timer_q, timer, link);
|
||||
timer->link.tqe_prev = NULL;
|
||||
timer->cb_func(timer->cb_arg);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Any timers left on queue? If so, we need to set OCMP */
|
||||
timer = TAILQ_FIRST(&bsptimer->hal_timer_q);
|
||||
if (timer) {
|
||||
nrf_timer_set_ocmp(bsptimer, timer->expiry);
|
||||
} else {
|
||||
if (bsptimer->tmr_rtc) {
|
||||
nrf_rtc_disable_ocmp((NRF_RTC_Type *)bsptimer->tmr_reg);
|
||||
} else {
|
||||
nrf_timer_disable_ocmp(bsptimer->tmr_reg);
|
||||
}
|
||||
}
|
||||
__HAL_ENABLE_INTERRUPTS(ctx);
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* hal timer irq handler
|
||||
*
|
||||
* Generic HAL timer irq handler.
|
||||
*
|
||||
* @param tmr
|
||||
*/
|
||||
/**
|
||||
* hal timer irq handler
|
||||
*
|
||||
* This is the global timer interrupt routine.
|
||||
*
|
||||
*/
|
||||
#if (MYNEWT_VAL(TIMER_0) || MYNEWT_VAL(TIMER_1) || MYNEWT_VAL(TIMER_2) || \
|
||||
MYNEWT_VAL(TIMER_3) || MYNEWT_VAL(TIMER_4))
|
||||
|
||||
static void
|
||||
hal_timer_irq_handler(struct nrf52_hal_timer *bsptimer)
|
||||
{
|
||||
uint32_t compare;
|
||||
NRF_TIMER_Type *hwtimer;
|
||||
|
||||
os_trace_enter_isr();
|
||||
|
||||
/* Check interrupt source. If set, clear them */
|
||||
hwtimer = bsptimer->tmr_reg;
|
||||
compare = hwtimer->EVENTS_COMPARE[NRF_TIMER_CC_INT];
|
||||
if (compare) {
|
||||
hwtimer->EVENTS_COMPARE[NRF_TIMER_CC_INT] = 0;
|
||||
}
|
||||
|
||||
/* XXX: make these stats? */
|
||||
/* Count # of timer isrs */
|
||||
++bsptimer->timer_isrs;
|
||||
|
||||
/*
|
||||
* NOTE: we dont check the 'compare' variable here due to how the timer
|
||||
* is implemented on this chip. There is no way to force an output
|
||||
* compare, so if we are late setting the output compare (i.e. the timer
|
||||
* counter is already passed the output compare value), we use the NVIC
|
||||
* to set a pending interrupt. This means that there will be no compare
|
||||
* flag set, so all we do is check to see if the compare interrupt is
|
||||
* enabled.
|
||||
*/
|
||||
if (hwtimer->INTENCLR & NRF_TIMER_INT_MASK(NRF_TIMER_CC_INT)) {
|
||||
hal_timer_chk_queue(bsptimer);
|
||||
/* XXX: Recommended by nordic to make sure interrupts are cleared */
|
||||
compare = hwtimer->EVENTS_COMPARE[NRF_TIMER_CC_INT];
|
||||
}
|
||||
|
||||
os_trace_exit_isr();
|
||||
}
|
||||
#endif
|
||||
|
||||
#if MYNEWT_VAL(TIMER_5)
|
||||
static void
|
||||
hal_rtc_timer_irq_handler(struct nrf52_hal_timer *bsptimer)
|
||||
{
|
||||
uint32_t overflow;
|
||||
uint32_t compare;
|
||||
NRF_RTC_Type *rtctimer;
|
||||
|
||||
/* Check interrupt source. If set, clear them */
|
||||
rtctimer = (NRF_RTC_Type *)bsptimer->tmr_reg;
|
||||
compare = rtctimer->EVENTS_COMPARE[NRF_RTC_TIMER_CC_INT];
|
||||
if (compare) {
|
||||
rtctimer->EVENTS_COMPARE[NRF_RTC_TIMER_CC_INT] = 0;
|
||||
}
|
||||
|
||||
overflow = rtctimer->EVENTS_OVRFLW;
|
||||
if (overflow) {
|
||||
rtctimer->EVENTS_OVRFLW = 0;
|
||||
bsptimer->tmr_cntr += (1UL << 24);
|
||||
}
|
||||
|
||||
/* Count # of timer isrs */
|
||||
++bsptimer->timer_isrs;
|
||||
|
||||
/*
|
||||
* NOTE: we dont check the 'compare' variable here due to how the timer
|
||||
* is implemented on this chip. There is no way to force an output
|
||||
* compare, so if we are late setting the output compare (i.e. the timer
|
||||
* counter is already passed the output compare value), we use the NVIC
|
||||
* to set a pending interrupt. This means that there will be no compare
|
||||
* flag set, so all we do is check to see if the compare interrupt is
|
||||
* enabled.
|
||||
*/
|
||||
hal_timer_chk_queue(bsptimer);
|
||||
|
||||
/* Recommended by nordic to make sure interrupts are cleared */
|
||||
compare = rtctimer->EVENTS_COMPARE[NRF_RTC_TIMER_CC_INT];
|
||||
}
|
||||
#endif
|
||||
|
||||
#if MYNEWT_VAL(TIMER_0)
|
||||
void
|
||||
nrf52_timer0_irq_handler(void)
|
||||
{
|
||||
hal_timer_irq_handler(&nrf52_hal_timer0);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if MYNEWT_VAL(TIMER_1)
|
||||
void
|
||||
nrf52_timer1_irq_handler(void)
|
||||
{
|
||||
hal_timer_irq_handler(&nrf52_hal_timer1);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if MYNEWT_VAL(TIMER_2)
|
||||
void
|
||||
nrf52_timer2_irq_handler(void)
|
||||
{
|
||||
hal_timer_irq_handler(&nrf52_hal_timer2);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if MYNEWT_VAL(TIMER_3)
|
||||
void
|
||||
nrf52_timer3_irq_handler(void)
|
||||
{
|
||||
hal_timer_irq_handler(&nrf52_hal_timer3);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if MYNEWT_VAL(TIMER_4)
|
||||
void
|
||||
nrf52_timer4_irq_handler(void)
|
||||
{
|
||||
hal_timer_irq_handler(&nrf52_hal_timer4);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if MYNEWT_VAL(TIMER_5)
|
||||
void
|
||||
nrf52_timer5_irq_handler(void)
|
||||
{
|
||||
hal_rtc_timer_irq_handler(&nrf52_hal_timer5);
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* hal timer init
|
||||
*
|
||||
* Initialize platform specific timer items
|
||||
*
|
||||
* @param timer_num Timer number to initialize
|
||||
* @param cfg Pointer to platform specific configuration
|
||||
*
|
||||
* @return int 0: success; error code otherwise
|
||||
*/
|
||||
int
|
||||
hal_timer_init(int timer_num, void *cfg)
|
||||
{
|
||||
int rc;
|
||||
uint8_t irq_num;
|
||||
struct nrf52_hal_timer *bsptimer;
|
||||
void *hwtimer;
|
||||
hal_timer_irq_handler_t irq_isr;
|
||||
|
||||
NRF52_HAL_TIMER_RESOLVE(timer_num, bsptimer);
|
||||
|
||||
/* If timer is enabled do not allow init */
|
||||
if (bsptimer->tmr_enabled) {
|
||||
rc = EINVAL;
|
||||
goto err;
|
||||
}
|
||||
|
||||
switch (timer_num) {
|
||||
#if MYNEWT_VAL(TIMER_5)
|
||||
case 5:
|
||||
irq_num = RTC0_IRQn;
|
||||
hwtimer = NRF_RTC0;
|
||||
irq_isr = nrf52_timer5_irq_handler;
|
||||
bsptimer->tmr_rtc = 1;
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
hwtimer = NULL;
|
||||
break;
|
||||
}
|
||||
|
||||
if (hwtimer == NULL) {
|
||||
rc = EINVAL;
|
||||
goto err;
|
||||
}
|
||||
|
||||
bsptimer->tmr_reg = hwtimer;
|
||||
bsptimer->tmr_irq_num = irq_num;
|
||||
|
||||
/* Disable IRQ, set priority and set vector in table */
|
||||
NVIC_DisableIRQ(irq_num);
|
||||
NVIC_SetPriority(irq_num, (1 << __NVIC_PRIO_BITS) - 1);
|
||||
#if MYNEWT
|
||||
NVIC_SetVector(irq_num, (uint32_t)irq_isr);
|
||||
#else
|
||||
ble_npl_hw_set_isr(irq_num, (uint32_t)irq_isr);
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
|
||||
err:
|
||||
return rc;
|
||||
}
|
||||
|
||||
/**
|
||||
* hal timer config
|
||||
*
|
||||
* Configure a timer to run at the desired frequency. This starts the timer.
|
||||
*
|
||||
* @param timer_num
|
||||
* @param freq_hz
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
int
|
||||
hal_timer_config(int timer_num, uint32_t freq_hz)
|
||||
{
|
||||
int rc;
|
||||
uint32_t ctx;
|
||||
struct nrf52_hal_timer *bsptimer;
|
||||
#if MYNEWT_VAL(TIMER_5)
|
||||
NRF_RTC_Type *rtctimer;
|
||||
#endif
|
||||
|
||||
NRF52_HAL_TIMER_RESOLVE(timer_num, bsptimer);
|
||||
|
||||
#if MYNEWT_VAL(TIMER_5)
|
||||
if (timer_num == 5) {
|
||||
/* NOTE: we only allow the RTC frequency to be set at 32768 */
|
||||
if (bsptimer->tmr_enabled || (freq_hz != 32768) ||
|
||||
(bsptimer->tmr_reg == NULL)) {
|
||||
rc = EINVAL;
|
||||
goto err;
|
||||
}
|
||||
|
||||
bsptimer->tmr_freq = freq_hz;
|
||||
bsptimer->tmr_enabled = 1;
|
||||
|
||||
__HAL_DISABLE_INTERRUPTS(ctx);
|
||||
|
||||
rtctimer = (NRF_RTC_Type *)bsptimer->tmr_reg;
|
||||
|
||||
/* Stop the timer first */
|
||||
rtctimer->TASKS_STOP = 1;
|
||||
|
||||
/* Always no prescaler */
|
||||
rtctimer->PRESCALER = 0;
|
||||
|
||||
/* Clear overflow events and set overflow interrupt */
|
||||
rtctimer->EVENTS_OVRFLW = 0;
|
||||
rtctimer->INTENSET = RTC_INTENSET_OVRFLW_Msk;
|
||||
|
||||
/* Start the timer */
|
||||
rtctimer->TASKS_START = 1;
|
||||
|
||||
/* Set isr in vector table and enable interrupt */
|
||||
NVIC_EnableIRQ(bsptimer->tmr_irq_num);
|
||||
|
||||
__HAL_ENABLE_INTERRUPTS(ctx);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
assert(0);
|
||||
|
||||
return 0;
|
||||
|
||||
err:
|
||||
return rc;
|
||||
}
|
||||
|
||||
/**
|
||||
* hal timer deinit
|
||||
*
|
||||
* De-initialize a HW timer.
|
||||
*
|
||||
* @param timer_num
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
int
|
||||
hal_timer_deinit(int timer_num)
|
||||
{
|
||||
int rc;
|
||||
uint32_t ctx;
|
||||
struct nrf52_hal_timer *bsptimer;
|
||||
NRF_TIMER_Type *hwtimer;
|
||||
NRF_RTC_Type *rtctimer;
|
||||
|
||||
rc = 0;
|
||||
NRF52_HAL_TIMER_RESOLVE(timer_num, bsptimer);
|
||||
|
||||
__HAL_DISABLE_INTERRUPTS(ctx);
|
||||
if (bsptimer->tmr_rtc) {
|
||||
rtctimer = (NRF_RTC_Type *)bsptimer->tmr_reg;
|
||||
rtctimer->INTENCLR = NRF_TIMER_INT_MASK(NRF_RTC_TIMER_CC_INT);
|
||||
rtctimer->TASKS_STOP = 1;
|
||||
} else {
|
||||
hwtimer = (NRF_TIMER_Type *)bsptimer->tmr_reg;
|
||||
hwtimer->INTENCLR = NRF_TIMER_INT_MASK(NRF_TIMER_CC_INT);
|
||||
hwtimer->TASKS_STOP = 1;
|
||||
}
|
||||
bsptimer->tmr_enabled = 0;
|
||||
bsptimer->tmr_reg = NULL;
|
||||
__HAL_ENABLE_INTERRUPTS(ctx);
|
||||
|
||||
err:
|
||||
return rc;
|
||||
}
|
||||
|
||||
/**
|
||||
* hal timer get resolution
|
||||
*
|
||||
* Get the resolution of the timer. This is the timer period, in nanoseconds
|
||||
*
|
||||
* @param timer_num
|
||||
*
|
||||
* @return uint32_t The
|
||||
*/
|
||||
uint32_t
|
||||
hal_timer_get_resolution(int timer_num)
|
||||
{
|
||||
int rc;
|
||||
uint32_t resolution;
|
||||
struct nrf52_hal_timer *bsptimer;
|
||||
|
||||
NRF52_HAL_TIMER_RESOLVE(timer_num, bsptimer);
|
||||
|
||||
resolution = 1000000000 / bsptimer->tmr_freq;
|
||||
return resolution;
|
||||
|
||||
err:
|
||||
rc = 0;
|
||||
return rc;
|
||||
}
|
||||
|
||||
/**
|
||||
* hal timer read
|
||||
*
|
||||
* Returns the timer counter. NOTE: if the timer is a 16-bit timer, only
|
||||
* the lower 16 bits are valid. If the timer is a 64-bit timer, only the
|
||||
* low 32-bits are returned.
|
||||
*
|
||||
* @return uint32_t The timer counter register.
|
||||
*/
|
||||
uint32_t
|
||||
hal_timer_read(int timer_num)
|
||||
{
|
||||
int rc;
|
||||
uint32_t tcntr;
|
||||
struct nrf52_hal_timer *bsptimer;
|
||||
|
||||
NRF52_HAL_TIMER_RESOLVE(timer_num, bsptimer);
|
||||
if (bsptimer->tmr_rtc) {
|
||||
tcntr = hal_timer_read_bsptimer(bsptimer);
|
||||
} else {
|
||||
tcntr = nrf_read_timer_cntr(bsptimer->tmr_reg);
|
||||
}
|
||||
|
||||
return tcntr;
|
||||
|
||||
/* Assert here since there is no invalid return code */
|
||||
err:
|
||||
assert(0);
|
||||
rc = 0;
|
||||
return rc;
|
||||
}
|
||||
|
||||
/**
|
||||
* hal timer delay
|
||||
*
|
||||
* Blocking delay for n ticks
|
||||
*
|
||||
* @param timer_num
|
||||
* @param ticks
|
||||
*
|
||||
* @return int 0 on success; error code otherwise.
|
||||
*/
|
||||
int
|
||||
hal_timer_delay(int timer_num, uint32_t ticks)
|
||||
{
|
||||
uint32_t until;
|
||||
|
||||
until = hal_timer_read(timer_num) + ticks;
|
||||
while ((int32_t)(hal_timer_read(timer_num) - until) <= 0) {
|
||||
/* Loop here till finished */
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* Initialize the HAL timer structure with the callback and the callback
|
||||
* argument. Also initializes the HW specific timer pointer.
|
||||
*
|
||||
* @param cb_func
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
int
|
||||
hal_timer_set_cb(int timer_num, struct hal_timer *timer, hal_timer_cb cb_func,
|
||||
void *arg)
|
||||
{
|
||||
int rc;
|
||||
struct nrf52_hal_timer *bsptimer;
|
||||
|
||||
NRF52_HAL_TIMER_RESOLVE(timer_num, bsptimer);
|
||||
|
||||
timer->cb_func = cb_func;
|
||||
timer->cb_arg = arg;
|
||||
timer->link.tqe_prev = NULL;
|
||||
timer->bsp_timer = bsptimer;
|
||||
|
||||
rc = 0;
|
||||
|
||||
err:
|
||||
return rc;
|
||||
}
|
||||
|
||||
int
|
||||
hal_timer_start(struct hal_timer *timer, uint32_t ticks)
|
||||
{
|
||||
int rc;
|
||||
uint32_t tick;
|
||||
struct nrf52_hal_timer *bsptimer;
|
||||
|
||||
/* Set the tick value at which the timer should expire */
|
||||
bsptimer = (struct nrf52_hal_timer *)timer->bsp_timer;
|
||||
if (bsptimer->tmr_rtc) {
|
||||
tick = hal_timer_read_bsptimer(bsptimer) + ticks;
|
||||
} else {
|
||||
tick = nrf_read_timer_cntr(bsptimer->tmr_reg) + ticks;
|
||||
}
|
||||
rc = hal_timer_start_at(timer, tick);
|
||||
return rc;
|
||||
}
|
||||
|
||||
int
|
||||
hal_timer_start_at(struct hal_timer *timer, uint32_t tick)
|
||||
{
|
||||
uint32_t ctx;
|
||||
struct hal_timer *entry;
|
||||
struct nrf52_hal_timer *bsptimer;
|
||||
|
||||
if ((timer == NULL) || (timer->link.tqe_prev != NULL) ||
|
||||
(timer->cb_func == NULL)) {
|
||||
return EINVAL;
|
||||
}
|
||||
bsptimer = (struct nrf52_hal_timer *)timer->bsp_timer;
|
||||
timer->expiry = tick;
|
||||
|
||||
__HAL_DISABLE_INTERRUPTS(ctx);
|
||||
|
||||
if (TAILQ_EMPTY(&bsptimer->hal_timer_q)) {
|
||||
TAILQ_INSERT_HEAD(&bsptimer->hal_timer_q, timer, link);
|
||||
} else {
|
||||
TAILQ_FOREACH(entry, &bsptimer->hal_timer_q, link) {
|
||||
if ((int32_t)(timer->expiry - entry->expiry) < 0) {
|
||||
TAILQ_INSERT_BEFORE(entry, timer, link);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!entry) {
|
||||
TAILQ_INSERT_TAIL(&bsptimer->hal_timer_q, timer, link);
|
||||
}
|
||||
}
|
||||
|
||||
/* If this is the head, we need to set new OCMP */
|
||||
if (timer == TAILQ_FIRST(&bsptimer->hal_timer_q)) {
|
||||
nrf_timer_set_ocmp(bsptimer, timer->expiry);
|
||||
}
|
||||
|
||||
__HAL_ENABLE_INTERRUPTS(ctx);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* hal timer stop
|
||||
*
|
||||
* Stop a timer.
|
||||
*
|
||||
* @param timer
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
int
|
||||
hal_timer_stop(struct hal_timer *timer)
|
||||
{
|
||||
uint32_t ctx;
|
||||
int reset_ocmp;
|
||||
struct hal_timer *entry;
|
||||
struct nrf52_hal_timer *bsptimer;
|
||||
|
||||
if (timer == NULL) {
|
||||
return EINVAL;
|
||||
}
|
||||
|
||||
bsptimer = (struct nrf52_hal_timer *)timer->bsp_timer;
|
||||
|
||||
__HAL_DISABLE_INTERRUPTS(ctx);
|
||||
|
||||
if (timer->link.tqe_prev != NULL) {
|
||||
reset_ocmp = 0;
|
||||
if (timer == TAILQ_FIRST(&bsptimer->hal_timer_q)) {
|
||||
/* If first on queue, we will need to reset OCMP */
|
||||
entry = TAILQ_NEXT(timer, link);
|
||||
reset_ocmp = 1;
|
||||
}
|
||||
TAILQ_REMOVE(&bsptimer->hal_timer_q, timer, link);
|
||||
timer->link.tqe_prev = NULL;
|
||||
if (reset_ocmp) {
|
||||
if (entry) {
|
||||
nrf_timer_set_ocmp((struct nrf52_hal_timer *)entry->bsp_timer,
|
||||
entry->expiry);
|
||||
} else {
|
||||
if (bsptimer->tmr_rtc) {
|
||||
nrf_rtc_disable_ocmp((NRF_RTC_Type *)bsptimer->tmr_reg);
|
||||
} else {
|
||||
nrf_timer_disable_ocmp(bsptimer->tmr_reg);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
__HAL_ENABLE_INTERRUPTS(ctx);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,302 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include "os/os.h"
|
||||
#include "mem/mem.h"
|
||||
|
||||
/**
|
||||
* Generic mempool allocation function. Used with basic and extended mempools.
|
||||
*/
|
||||
static int
|
||||
mem_malloc_mempool_gen(uint16_t num_blocks, uint32_t block_size,
|
||||
void **out_buf)
|
||||
{
|
||||
block_size = OS_ALIGN(block_size, OS_ALIGNMENT);
|
||||
|
||||
if (num_blocks > 0) {
|
||||
*out_buf = malloc(OS_MEMPOOL_BYTES(num_blocks, block_size));
|
||||
if (*out_buf == NULL) {
|
||||
return OS_ENOMEM;
|
||||
}
|
||||
} else {
|
||||
*out_buf = NULL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Mallocs a block of memory and initializes a mempool to use it.
|
||||
*
|
||||
* @param mempool The mempool to initialize.
|
||||
* @param num_blocks The total number of memory blocks in the
|
||||
* mempool.
|
||||
* @param block_size The size of each mempool entry.
|
||||
* @param name The name to give the mempool.
|
||||
* @param out_buf On success, this points to the malloced memory.
|
||||
* Pass NULL if you don't need this
|
||||
* information.
|
||||
*
|
||||
* @return 0 on success;
|
||||
* OS_ENOMEM on malloc failure;
|
||||
* Other OS code on unexpected error.
|
||||
*/
|
||||
int
|
||||
mem_malloc_mempool(struct os_mempool *mempool, uint16_t num_blocks,
|
||||
uint32_t block_size, char *name, void **out_buf)
|
||||
{
|
||||
void *buf;
|
||||
int rc;
|
||||
|
||||
rc = mem_malloc_mempool_gen(num_blocks, block_size, &buf);
|
||||
if (rc != 0) {
|
||||
return rc;
|
||||
}
|
||||
|
||||
rc = os_mempool_init(mempool, num_blocks, block_size, buf, name);
|
||||
if (rc != 0) {
|
||||
free(buf);
|
||||
return rc;
|
||||
}
|
||||
|
||||
if (out_buf != NULL) {
|
||||
*out_buf = buf;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Mallocs a block of memory and initializes an extended mempool to use it.
|
||||
*
|
||||
* @param mpe The extended mempool to initialize.
|
||||
* @param num_blocks The total number of memory blocks in the
|
||||
* mempool.
|
||||
* @param block_size The size of each mempool entry.
|
||||
* @param name The name to give the mempool.
|
||||
* @param out_buf On success, this points to the malloced memory.
|
||||
* Pass NULL if you don't need this
|
||||
* information.
|
||||
*
|
||||
* @return 0 on success;
|
||||
* OS_ENOMEM on malloc failure;
|
||||
* Other OS code on unexpected error.
|
||||
*/
|
||||
int
|
||||
mem_malloc_mempool_ext(struct os_mempool_ext *mpe, uint16_t num_blocks,
|
||||
uint32_t block_size, char *name, void **out_buf)
|
||||
{
|
||||
void *buf;
|
||||
int rc;
|
||||
|
||||
rc = mem_malloc_mempool_gen(num_blocks, block_size, &buf);
|
||||
if (rc != 0) {
|
||||
return rc;
|
||||
}
|
||||
|
||||
rc = os_mempool_ext_init(mpe, num_blocks, block_size, buf, name);
|
||||
if (rc != 0) {
|
||||
free(buf);
|
||||
return rc;
|
||||
}
|
||||
|
||||
if (out_buf != NULL) {
|
||||
*out_buf = buf;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Mallocs a block of memory and initializes an mbuf pool to use it. The
|
||||
* specified block_size indicates the size of an mbuf acquired from the pool if
|
||||
* it does not contain a pkthdr.
|
||||
*
|
||||
* @param mempool The mempool to initialize.
|
||||
* @param mbuf_pool The mbuf pool to initialize.
|
||||
* @param num_blocks The total number of mbufs in the pool.
|
||||
* @param block_size The size of each mbuf.
|
||||
* @param name The name to give the mempool.
|
||||
* @param out_buf On success, this points to the malloced memory.
|
||||
* Pass NULL if you don't need this
|
||||
* information.
|
||||
*
|
||||
* @return 0 on success;
|
||||
* OS_ENOMEM on malloc failure;
|
||||
* Other OS code on unexpected error.
|
||||
*/
|
||||
int
|
||||
mem_malloc_mbuf_pool(struct os_mempool *mempool,
|
||||
struct os_mbuf_pool *mbuf_pool, uint16_t num_blocks,
|
||||
uint32_t block_size, char *name,
|
||||
void **out_buf)
|
||||
{
|
||||
void *buf;
|
||||
int rc;
|
||||
|
||||
block_size = OS_ALIGN(block_size + sizeof (struct os_mbuf), OS_ALIGNMENT);
|
||||
|
||||
rc = mem_malloc_mempool(mempool, num_blocks, block_size, name, &buf);
|
||||
if (rc != 0) {
|
||||
return rc;
|
||||
}
|
||||
|
||||
rc = os_mbuf_pool_init(mbuf_pool, mempool, block_size, num_blocks);
|
||||
if (rc != 0) {
|
||||
free(buf);
|
||||
return rc;
|
||||
}
|
||||
|
||||
if (out_buf != NULL) {
|
||||
*out_buf = buf;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Mallocs a block of memory and initializes an mbuf pool to use it. The
|
||||
* specified block_size indicates the size of an mbuf acquired from the pool if
|
||||
* it contains a pkthdr.
|
||||
*
|
||||
* @param mempool The mempool to initialize.
|
||||
* @param mbuf_pool The mbuf pool to initialize.
|
||||
* @param num_blocks The total number of mbufs in the pool.
|
||||
* @param block_size The size of each mbuf.
|
||||
* @param name The name to give the mempool.
|
||||
* @param out_buf On success, this points to the malloced memory.
|
||||
* Pass NULL if you don't need this
|
||||
* information.
|
||||
*
|
||||
* @return 0 on success;
|
||||
* OS_ENOMEM on malloc failure;
|
||||
* Other OS code on unexpected error.
|
||||
*/
|
||||
int
|
||||
mem_malloc_mbufpkt_pool(struct os_mempool *mempool,
|
||||
struct os_mbuf_pool *mbuf_pool, int num_blocks,
|
||||
int block_size, char *name,
|
||||
void **out_buf)
|
||||
{
|
||||
int rc;
|
||||
|
||||
rc = mem_malloc_mbuf_pool(mempool, mbuf_pool, num_blocks,
|
||||
block_size + sizeof (struct os_mbuf_pkthdr),
|
||||
name, out_buf);
|
||||
return rc;
|
||||
}
|
||||
|
||||
int
|
||||
mem_init_mbuf_pool(void *mem, struct os_mempool *mempool,
|
||||
struct os_mbuf_pool *mbuf_pool, int num_blocks,
|
||||
int block_size, char *name)
|
||||
{
|
||||
int rc;
|
||||
|
||||
rc = os_mempool_init(mempool, num_blocks, block_size, mem, name);
|
||||
if (rc != 0) {
|
||||
return rc;
|
||||
}
|
||||
|
||||
rc = os_mbuf_pool_init(mbuf_pool, mempool, block_size, num_blocks);
|
||||
if (rc != 0) {
|
||||
return rc;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Splits an appropriately-sized fragment from the front of an mbuf chain, as
|
||||
* neeeded. If the length of the mbuf chain greater than specified maximum
|
||||
* fragment size, a new mbuf is allocated, and data is moved from the source
|
||||
* mbuf to the new mbuf. If the mbuf chain is small enough to fit in a single
|
||||
* fragment, the source mbuf itself is returned unmodified, and the suplied
|
||||
* pointer is set to NULL.
|
||||
*
|
||||
* This function is expected to be called in a loop until the entire mbuf chain
|
||||
* has been consumed. For example:
|
||||
*
|
||||
* struct os_mbuf *frag;
|
||||
* struct os_mbuf *rsp;
|
||||
* // [...]
|
||||
* while (rsp != NULL) {
|
||||
* frag = mem_split_frag(&rsp, get_mtu(), frag_alloc, NULL);
|
||||
* if (frag == NULL) {
|
||||
* os_mbuf_free_chain(rsp);
|
||||
* return SYS_ENOMEM;
|
||||
* }
|
||||
* send_packet(frag)
|
||||
* }
|
||||
*
|
||||
* @param om The packet to fragment. Upon fragmentation,
|
||||
* this mbuf is adjusted such that the
|
||||
* fragment data is removed. If the packet
|
||||
* constitutes a single fragment, this gets
|
||||
* set to NULL on success.
|
||||
* @param max_frag_sz The maximum payload size of a fragment.
|
||||
* Typically this is the MTU of the
|
||||
* connection.
|
||||
* @param alloc_cb Points to a function that allocates an mbuf to
|
||||
* hold a fragment. This function gets called
|
||||
* before the source mbuf chain is modified,
|
||||
* so it can safely inspect it.
|
||||
* @param cb_arg Generic parameter that gets passed to the
|
||||
* callback function.
|
||||
*
|
||||
* @return The next fragment to send on success;
|
||||
* NULL on failure.
|
||||
*/
|
||||
struct os_mbuf *
|
||||
mem_split_frag(struct os_mbuf **om, uint16_t max_frag_sz,
|
||||
mem_frag_alloc_fn *alloc_cb, void *cb_arg)
|
||||
{
|
||||
struct os_mbuf *frag;
|
||||
int rc;
|
||||
|
||||
if (OS_MBUF_PKTLEN(*om) <= max_frag_sz) {
|
||||
/* Final fragment. */
|
||||
frag = *om;
|
||||
*om = NULL;
|
||||
return frag;
|
||||
}
|
||||
|
||||
/* Packet needs to be split. Allocate a new buffer for the fragment. */
|
||||
frag = alloc_cb(max_frag_sz, cb_arg);
|
||||
if (frag == NULL) {
|
||||
goto err;
|
||||
}
|
||||
|
||||
/* Move data from the front of the packet into the fragment mbuf. */
|
||||
rc = os_mbuf_appendfrom(frag, *om, 0, max_frag_sz);
|
||||
if (rc != 0) {
|
||||
goto err;
|
||||
}
|
||||
os_mbuf_adj(*om, max_frag_sz);
|
||||
|
||||
/* Free unused portion of of source mbuf chain, if possible. */
|
||||
*om = os_mbuf_trim_front(*om);
|
||||
|
||||
return frag;
|
||||
|
||||
err:
|
||||
os_mbuf_free_chain(frag);
|
||||
return NULL;
|
||||
}
|
||||
@@ -0,0 +1,74 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
#include <stddef.h>
|
||||
#include "os/os.h"
|
||||
#include "sysinit/sysinit.h"
|
||||
#include "host/ble_hs.h"
|
||||
#if NIMBLE_CFG_CONTROLLER
|
||||
#include "controller/ble_ll.h"
|
||||
#endif
|
||||
#include "services/gap/ble_svc_gap.h"
|
||||
#include "services/gatt/ble_svc_gatt.h"
|
||||
#include "services/ans/ble_svc_ans.h"
|
||||
#include "services/ias/ble_svc_ias.h"
|
||||
#include "services/lls/ble_svc_lls.h"
|
||||
#include "services/tps/ble_svc_tps.h"
|
||||
|
||||
void
|
||||
nimble_port_init(void)
|
||||
{
|
||||
void os_msys_init(void);
|
||||
void ble_store_ram_init(void);
|
||||
#if NIMBLE_CFG_CONTROLLER
|
||||
void ble_hci_ram_init(void);
|
||||
#endif
|
||||
|
||||
os_msys_init();
|
||||
|
||||
ble_hs_init();
|
||||
|
||||
/* XXX These should be configurable somehow */
|
||||
ble_svc_gap_init();
|
||||
ble_svc_gatt_init();
|
||||
ble_svc_ans_init();
|
||||
ble_svc_ias_init();
|
||||
ble_svc_lls_init();
|
||||
ble_svc_tps_init();
|
||||
|
||||
/* XXX Need to have template for store */
|
||||
ble_store_ram_init();
|
||||
|
||||
#if NIMBLE_CFG_CONTROLLER
|
||||
hal_timer_init(5, NULL);
|
||||
os_cputime_init(32768);
|
||||
ble_ll_init();
|
||||
ble_hci_ram_init();
|
||||
#endif
|
||||
}
|
||||
|
||||
#if NIMBLE_CFG_CONTROLLER
|
||||
void
|
||||
nimble_port_ll_task_func(void *arg)
|
||||
{
|
||||
extern void ble_ll_task(void *);
|
||||
|
||||
ble_ll_task(arg);
|
||||
}
|
||||
#endif
|
||||
@@ -0,0 +1,126 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
#include <stdint.h>
|
||||
#include <assert.h>
|
||||
#include "syscfg/syscfg.h"
|
||||
#include "os/os_cputime.h"
|
||||
#include "hal/hal_timer.h"
|
||||
|
||||
#if defined(OS_CPUTIME_FREQ_HIGH)
|
||||
struct os_cputime_data g_os_cputime;
|
||||
#endif
|
||||
|
||||
int
|
||||
os_cputime_init(uint32_t clock_freq)
|
||||
{
|
||||
int rc;
|
||||
|
||||
/* Set the ticks per microsecond. */
|
||||
#if defined(OS_CPUTIME_FREQ_HIGH)
|
||||
g_os_cputime.ticks_per_usec = clock_freq / 1000000U;
|
||||
#endif
|
||||
rc = hal_timer_config(MYNEWT_VAL(OS_CPUTIME_TIMER_NUM), clock_freq);
|
||||
return rc;
|
||||
}
|
||||
|
||||
/**
|
||||
* Wait until the number of ticks has elapsed. This is a blocking delay.
|
||||
*
|
||||
* @param ticks The number of ticks to wait.
|
||||
*/
|
||||
void
|
||||
os_cputime_delay_ticks(uint32_t ticks)
|
||||
{
|
||||
uint32_t until;
|
||||
|
||||
until = os_cputime_get32() + ticks;
|
||||
while ((int32_t)(os_cputime_get32() - until) < 0) {
|
||||
/* Loop here till finished */
|
||||
}
|
||||
}
|
||||
|
||||
#if !defined(OS_CPUTIME_FREQ_PWR2)
|
||||
void
|
||||
os_cputime_delay_nsecs(uint32_t nsecs)
|
||||
{
|
||||
uint32_t ticks;
|
||||
|
||||
ticks = os_cputime_nsecs_to_ticks(nsecs);
|
||||
os_cputime_delay_ticks(ticks);
|
||||
}
|
||||
#endif
|
||||
|
||||
void
|
||||
os_cputime_delay_usecs(uint32_t usecs)
|
||||
{
|
||||
uint32_t ticks;
|
||||
|
||||
ticks = os_cputime_usecs_to_ticks(usecs);
|
||||
os_cputime_delay_ticks(ticks);
|
||||
}
|
||||
|
||||
void
|
||||
os_cputime_timer_init(struct hal_timer *timer, hal_timer_cb fp, void *arg)
|
||||
{
|
||||
assert(timer != NULL);
|
||||
assert(fp != NULL);
|
||||
|
||||
hal_timer_set_cb(MYNEWT_VAL(OS_CPUTIME_TIMER_NUM), timer, fp, arg);
|
||||
}
|
||||
|
||||
int
|
||||
os_cputime_timer_start(struct hal_timer *timer, uint32_t cputime)
|
||||
{
|
||||
int rc;
|
||||
|
||||
rc = hal_timer_start_at(timer, cputime);
|
||||
return rc;
|
||||
}
|
||||
|
||||
int
|
||||
os_cputime_timer_relative(struct hal_timer *timer, uint32_t usecs)
|
||||
{
|
||||
int rc;
|
||||
uint32_t cputime;
|
||||
|
||||
assert(timer != NULL);
|
||||
|
||||
cputime = os_cputime_get32() + os_cputime_usecs_to_ticks(usecs);
|
||||
rc = hal_timer_start_at(timer, cputime);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
void
|
||||
os_cputime_timer_stop(struct hal_timer *timer)
|
||||
{
|
||||
hal_timer_stop(timer);
|
||||
}
|
||||
|
||||
uint32_t
|
||||
os_cputime_get32(void)
|
||||
{
|
||||
uint32_t cpu_time;
|
||||
|
||||
cpu_time = hal_timer_read(MYNEWT_VAL(OS_CPUTIME_TIMER_NUM));
|
||||
return cpu_time;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,109 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
#include "os/os_cputime.h"
|
||||
|
||||
/**
|
||||
* This module implements cputime functionality for timers for which:
|
||||
* a. freq is a power of 2 Hz, and
|
||||
* b. 256 Hz <= freq < 1 MHz
|
||||
*/
|
||||
|
||||
#if defined(OS_CPUTIME_FREQ_PWR2)
|
||||
|
||||
/**
|
||||
* @addtogroup OSKernel Operating System Kernel
|
||||
* @{
|
||||
* @defgroup OSCPUTime High Resolution Timers
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* os cputime usecs to ticks
|
||||
*
|
||||
* Converts the given number of microseconds into cputime ticks.
|
||||
*
|
||||
* @param usecs The number of microseconds to convert to ticks
|
||||
*
|
||||
* @return uint32_t The number of ticks corresponding to 'usecs'
|
||||
*/
|
||||
uint32_t
|
||||
os_cputime_usecs_to_ticks(uint32_t usecs)
|
||||
{
|
||||
uint64_t ticks;
|
||||
|
||||
/*
|
||||
* Faster calculation but could be off 1 full tick since we do not
|
||||
* add residual back. Adding back the residual is commented out below, but
|
||||
* shown.
|
||||
*/
|
||||
ticks = (1ULL << 32) * MYNEWT_VAL(OS_CPUTIME_FREQ) / 1000000 * usecs;
|
||||
|
||||
/* Residual for 32768 Hz. */
|
||||
//ticks += ((uint64_t)usecs * (1526122139+1)) >> 32;
|
||||
|
||||
return ticks >> 32;
|
||||
}
|
||||
|
||||
/**
|
||||
* cputime ticks to usecs
|
||||
*
|
||||
* Convert the given number of ticks into microseconds.
|
||||
*
|
||||
* @param ticks The number of ticks to convert to microseconds.
|
||||
*
|
||||
* @return uint32_t The number of microseconds corresponding to 'ticks'
|
||||
*
|
||||
* NOTE: This calculation will overflow if the value for ticks is greater
|
||||
* than 140737488. I am not going to check that here because that many ticks
|
||||
* is about 4222 seconds, way more than what this routine should be used for.
|
||||
*/
|
||||
uint32_t
|
||||
os_cputime_ticks_to_usecs(uint32_t ticks)
|
||||
{
|
||||
uint32_t usecs;
|
||||
uint32_t shift;
|
||||
uint32_t freq;
|
||||
|
||||
/* Given: `freq = 2^n`, calculate `n`. */
|
||||
/* Note: this looks like a lot of work, but gcc can optimize it away since
|
||||
* `freq` is known at compile time.
|
||||
*/
|
||||
freq = MYNEWT_VAL(OS_CPUTIME_FREQ);
|
||||
shift = 0;
|
||||
while (freq != 0) {
|
||||
freq >>= 1;
|
||||
shift++;
|
||||
}
|
||||
|
||||
if (shift <= 7) {
|
||||
return 0;
|
||||
}
|
||||
shift -= 7;
|
||||
|
||||
usecs = ((ticks >> shift) * 15625) + (((ticks & 0x1ff) * 15625) >> shift);
|
||||
return usecs;
|
||||
}
|
||||
|
||||
/**
|
||||
* @} OSCPUTime
|
||||
* @} OSKernel
|
||||
*/
|
||||
|
||||
#endif
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,303 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
#include "os/os.h"
|
||||
|
||||
#include <string.h>
|
||||
#include <assert.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#define OS_MEM_TRUE_BLOCK_SIZE(bsize) OS_ALIGN(bsize, OS_ALIGNMENT)
|
||||
#define OS_MEMPOOL_TRUE_BLOCK_SIZE(mp) OS_MEM_TRUE_BLOCK_SIZE(mp->mp_block_size)
|
||||
|
||||
STAILQ_HEAD(, os_mempool) g_os_mempool_list =
|
||||
STAILQ_HEAD_INITIALIZER(g_os_mempool_list);
|
||||
|
||||
#if MYNEWT_VAL(OS_MEMPOOL_POISON)
|
||||
static uint32_t os_mem_poison = 0xde7ec7ed;
|
||||
|
||||
static void
|
||||
os_mempool_poison(void *start, int sz)
|
||||
{
|
||||
int i;
|
||||
char *p = start;
|
||||
|
||||
for (i = sizeof(struct os_memblock); i < sz;
|
||||
i = i + sizeof(os_mem_poison)) {
|
||||
memcpy(p + i, &os_mem_poison, min(sizeof(os_mem_poison), sz - i));
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
os_mempool_poison_check(void *start, int sz)
|
||||
{
|
||||
int i;
|
||||
char *p = start;
|
||||
|
||||
for (i = sizeof(struct os_memblock); i < sz;
|
||||
i = i + sizeof(os_mem_poison)) {
|
||||
assert(!memcmp(p + i, &os_mem_poison,
|
||||
min(sizeof(os_mem_poison), sz - i)));
|
||||
}
|
||||
}
|
||||
#else
|
||||
#define os_mempool_poison(start, sz)
|
||||
#define os_mempool_poison_check(start, sz)
|
||||
#endif
|
||||
|
||||
os_error_t
|
||||
os_mempool_init(struct os_mempool *mp, uint16_t blocks, uint32_t block_size,
|
||||
void *membuf, char *name)
|
||||
{
|
||||
int true_block_size;
|
||||
uint8_t *block_addr;
|
||||
struct os_memblock *block_ptr;
|
||||
|
||||
/* Check for valid parameters */
|
||||
if (!mp || (blocks < 0) || (block_size <= 0)) {
|
||||
return OS_INVALID_PARM;
|
||||
}
|
||||
|
||||
if ((!membuf) && (blocks != 0)) {
|
||||
return OS_INVALID_PARM;
|
||||
}
|
||||
|
||||
if (membuf != NULL) {
|
||||
/* Blocks need to be sized properly and memory buffer should be
|
||||
* aligned
|
||||
*/
|
||||
if (((uint32_t)membuf & (OS_ALIGNMENT - 1)) != 0) {
|
||||
return OS_MEM_NOT_ALIGNED;
|
||||
}
|
||||
}
|
||||
true_block_size = OS_MEM_TRUE_BLOCK_SIZE(block_size);
|
||||
|
||||
/* Initialize the memory pool structure */
|
||||
mp->mp_block_size = block_size;
|
||||
mp->mp_num_free = blocks;
|
||||
mp->mp_min_free = blocks;
|
||||
mp->mp_flags = 0;
|
||||
mp->mp_num_blocks = blocks;
|
||||
mp->mp_membuf_addr = (uint32_t)membuf;
|
||||
mp->name = name;
|
||||
os_mempool_poison(membuf, true_block_size);
|
||||
SLIST_FIRST(mp) = membuf;
|
||||
|
||||
/* Chain the memory blocks to the free list */
|
||||
block_addr = (uint8_t *)membuf;
|
||||
block_ptr = (struct os_memblock *)block_addr;
|
||||
while (blocks > 1) {
|
||||
block_addr += true_block_size;
|
||||
os_mempool_poison(block_addr, true_block_size);
|
||||
SLIST_NEXT(block_ptr, mb_next) = (struct os_memblock *)block_addr;
|
||||
block_ptr = (struct os_memblock *)block_addr;
|
||||
--blocks;
|
||||
}
|
||||
|
||||
/* Last one in the list should be NULL */
|
||||
SLIST_NEXT(block_ptr, mb_next) = NULL;
|
||||
|
||||
STAILQ_INSERT_TAIL(&g_os_mempool_list, mp, mp_list);
|
||||
|
||||
return OS_OK;
|
||||
}
|
||||
|
||||
os_error_t
|
||||
os_mempool_ext_init(struct os_mempool_ext *mpe, uint16_t blocks,
|
||||
uint32_t block_size, void *membuf, char *name)
|
||||
{
|
||||
int rc;
|
||||
|
||||
rc = os_mempool_init(&mpe->mpe_mp, blocks, block_size, membuf, name);
|
||||
if (rc != 0) {
|
||||
return rc;
|
||||
}
|
||||
|
||||
mpe->mpe_mp.mp_flags = OS_MEMPOOL_F_EXT;
|
||||
mpe->mpe_put_cb = NULL;
|
||||
mpe->mpe_put_arg = NULL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool
|
||||
os_mempool_is_sane(const struct os_mempool *mp)
|
||||
{
|
||||
struct os_memblock *block;
|
||||
|
||||
/* Verify that each block in the free list belongs to the mempool. */
|
||||
SLIST_FOREACH(block, mp, mb_next) {
|
||||
if (!os_memblock_from(mp, block)) {
|
||||
return false;
|
||||
}
|
||||
os_mempool_poison_check(block, OS_MEMPOOL_TRUE_BLOCK_SIZE(mp));
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
int
|
||||
os_memblock_from(const struct os_mempool *mp, const void *block_addr)
|
||||
{
|
||||
uint32_t true_block_size;
|
||||
uint32_t baddr32;
|
||||
uint32_t end;
|
||||
|
||||
_Static_assert(sizeof block_addr == sizeof baddr32,
|
||||
"Pointer to void must be 32-bits.");
|
||||
|
||||
baddr32 = (uint32_t)block_addr;
|
||||
true_block_size = OS_MEMPOOL_TRUE_BLOCK_SIZE(mp);
|
||||
end = mp->mp_membuf_addr + (mp->mp_num_blocks * true_block_size);
|
||||
|
||||
/* Check that the block is in the memory buffer range. */
|
||||
if ((baddr32 < mp->mp_membuf_addr) || (baddr32 >= end)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* All freed blocks should be on true block size boundaries! */
|
||||
if (((baddr32 - mp->mp_membuf_addr) % true_block_size) != 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
void *
|
||||
os_memblock_get(struct os_mempool *mp)
|
||||
{
|
||||
os_sr_t sr;
|
||||
struct os_memblock *block;
|
||||
|
||||
/* Check to make sure they passed in a memory pool (or something) */
|
||||
block = NULL;
|
||||
if (mp) {
|
||||
OS_ENTER_CRITICAL(sr);
|
||||
/* Check for any free */
|
||||
if (mp->mp_num_free) {
|
||||
/* Get a free block */
|
||||
block = SLIST_FIRST(mp);
|
||||
|
||||
os_mempool_poison_check(block, OS_MEMPOOL_TRUE_BLOCK_SIZE(mp));
|
||||
|
||||
/* Set new free list head */
|
||||
SLIST_FIRST(mp) = SLIST_NEXT(block, mb_next);
|
||||
|
||||
/* Decrement number free by 1 */
|
||||
mp->mp_num_free--;
|
||||
if (mp->mp_min_free > mp->mp_num_free) {
|
||||
mp->mp_min_free = mp->mp_num_free;
|
||||
}
|
||||
}
|
||||
OS_EXIT_CRITICAL(sr);
|
||||
}
|
||||
|
||||
return (void *)block;
|
||||
}
|
||||
|
||||
os_error_t
|
||||
os_memblock_put_from_cb(struct os_mempool *mp, void *block_addr)
|
||||
{
|
||||
os_sr_t sr;
|
||||
struct os_memblock *block;
|
||||
|
||||
os_mempool_poison(block_addr, OS_MEMPOOL_TRUE_BLOCK_SIZE(mp));
|
||||
|
||||
block = (struct os_memblock *)block_addr;
|
||||
OS_ENTER_CRITICAL(sr);
|
||||
|
||||
/* Chain current free list pointer to this block; make this block head */
|
||||
SLIST_NEXT(block, mb_next) = SLIST_FIRST(mp);
|
||||
SLIST_FIRST(mp) = block;
|
||||
|
||||
/* XXX: Should we check that the number free <= number blocks? */
|
||||
/* Increment number free */
|
||||
mp->mp_num_free++;
|
||||
|
||||
OS_EXIT_CRITICAL(sr);
|
||||
|
||||
return OS_OK;
|
||||
}
|
||||
|
||||
os_error_t
|
||||
os_memblock_put(struct os_mempool *mp, void *block_addr)
|
||||
{
|
||||
struct os_mempool_ext *mpe;
|
||||
int rc;
|
||||
#if MYNEWT_VAL(OS_MEMPOOL_CHECK)
|
||||
struct os_memblock *block;
|
||||
#endif
|
||||
|
||||
/* Make sure parameters are valid */
|
||||
if ((mp == NULL) || (block_addr == NULL)) {
|
||||
return OS_INVALID_PARM;
|
||||
}
|
||||
|
||||
#if MYNEWT_VAL(OS_MEMPOOL_CHECK)
|
||||
/* Check that the block we are freeing is a valid block! */
|
||||
assert(os_memblock_from(mp, block_addr));
|
||||
|
||||
/*
|
||||
* Check for duplicate free.
|
||||
*/
|
||||
SLIST_FOREACH(block, mp, mb_next) {
|
||||
assert(block != (struct os_memblock *)block_addr);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* If this is an extended mempool with a put callback, call the callback
|
||||
* instead of freeing the block directly.
|
||||
*/
|
||||
if (mp->mp_flags & OS_MEMPOOL_F_EXT) {
|
||||
mpe = (struct os_mempool_ext *)mp;
|
||||
if (mpe->mpe_put_cb != NULL) {
|
||||
rc = mpe->mpe_put_cb(mpe, block_addr, mpe->mpe_put_arg);
|
||||
return rc;
|
||||
}
|
||||
}
|
||||
|
||||
/* No callback; free the block. */
|
||||
return os_memblock_put_from_cb(mp, block_addr);
|
||||
}
|
||||
|
||||
struct os_mempool *
|
||||
os_mempool_info_get_next(struct os_mempool *mp, struct os_mempool_info *omi)
|
||||
{
|
||||
struct os_mempool *cur;
|
||||
|
||||
if (mp == NULL) {
|
||||
cur = STAILQ_FIRST(&g_os_mempool_list);
|
||||
} else {
|
||||
cur = STAILQ_NEXT(mp, mp_list);
|
||||
}
|
||||
|
||||
if (cur == NULL) {
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
omi->omi_block_size = cur->mp_block_size;
|
||||
omi->omi_num_blocks = cur->mp_num_blocks;
|
||||
omi->omi_num_free = cur->mp_num_free;
|
||||
omi->omi_min_free = cur->mp_min_free;
|
||||
strncpy(omi->omi_name, cur->name, sizeof(omi->omi_name));
|
||||
|
||||
return (cur);
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,84 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
#include <assert.h>
|
||||
#include "os/os.h"
|
||||
#include "mem/mem.h"
|
||||
|
||||
#if MYNEWT_VAL(MSYS_1_BLOCK_COUNT) > 0
|
||||
#define SYSINIT_MSYS_1_MEMBLOCK_SIZE \
|
||||
OS_ALIGN(MYNEWT_VAL(MSYS_1_BLOCK_SIZE), 4)
|
||||
#define SYSINIT_MSYS_1_MEMPOOL_SIZE \
|
||||
OS_MEMPOOL_SIZE(MYNEWT_VAL(MSYS_1_BLOCK_COUNT), \
|
||||
SYSINIT_MSYS_1_MEMBLOCK_SIZE)
|
||||
static os_membuf_t os_msys_init_1_data[SYSINIT_MSYS_1_MEMPOOL_SIZE];
|
||||
static struct os_mbuf_pool os_msys_init_1_mbuf_pool;
|
||||
static struct os_mempool os_msys_init_1_mempool;
|
||||
#endif
|
||||
|
||||
#if MYNEWT_VAL(MSYS_2_BLOCK_COUNT) > 0
|
||||
#define SYSINIT_MSYS_2_MEMBLOCK_SIZE \
|
||||
OS_ALIGN(MYNEWT_VAL(MSYS_2_BLOCK_SIZE), 4)
|
||||
#define SYSINIT_MSYS_2_MEMPOOL_SIZE \
|
||||
OS_MEMPOOL_SIZE(MYNEWT_VAL(MSYS_2_BLOCK_COUNT), \
|
||||
SYSINIT_MSYS_2_MEMBLOCK_SIZE)
|
||||
static os_membuf_t os_msys_init_2_data[SYSINIT_MSYS_2_MEMPOOL_SIZE];
|
||||
static struct os_mbuf_pool os_msys_init_2_mbuf_pool;
|
||||
static struct os_mempool os_msys_init_2_mempool;
|
||||
#endif
|
||||
|
||||
static void
|
||||
os_msys_init_once(void *data, struct os_mempool *mempool,
|
||||
struct os_mbuf_pool *mbuf_pool,
|
||||
int block_count, int block_size, char *name)
|
||||
{
|
||||
int rc;
|
||||
|
||||
rc = mem_init_mbuf_pool(data, mempool, mbuf_pool, block_count, block_size,
|
||||
name);
|
||||
assert(rc == 0);
|
||||
|
||||
rc = os_msys_register(mbuf_pool);
|
||||
assert(rc == 0);
|
||||
}
|
||||
|
||||
void
|
||||
os_msys_init(void)
|
||||
{
|
||||
os_msys_reset();
|
||||
|
||||
(void)os_msys_init_once;
|
||||
#if MYNEWT_VAL(MSYS_1_BLOCK_COUNT) > 0
|
||||
os_msys_init_once(os_msys_init_1_data,
|
||||
&os_msys_init_1_mempool,
|
||||
&os_msys_init_1_mbuf_pool,
|
||||
MYNEWT_VAL(MSYS_1_BLOCK_COUNT),
|
||||
SYSINIT_MSYS_1_MEMBLOCK_SIZE,
|
||||
"msys_1");
|
||||
#endif
|
||||
|
||||
#if MYNEWT_VAL(MSYS_2_BLOCK_COUNT) > 0
|
||||
os_msys_init_once(os_msys_init_2_data,
|
||||
&os_msys_init_2_mempool,
|
||||
&os_msys_init_2_mbuf_pool,
|
||||
MYNEWT_VAL(MSYS_2_BLOCK_COUNT),
|
||||
SYSINIT_MSYS_2_MEMBLOCK_SIZE,
|
||||
"msys_2");
|
||||
#endif
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
#ifndef _NIMBLE_NPL_OS_H_
|
||||
#define _NIMBLE_NPL_OS_H_
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define BLE_NPL_OS_ALIGNMENT 4
|
||||
|
||||
#define BLE_NPL_TIME_FOREVER UINT32_MAX
|
||||
|
||||
typedef uint32_t ble_npl_time_t;
|
||||
typedef int32_t ble_npl_stime_t;
|
||||
|
||||
struct ble_npl_event {
|
||||
int dummy;
|
||||
};
|
||||
|
||||
struct ble_npl_eventq {
|
||||
int dummy;
|
||||
};
|
||||
|
||||
struct ble_npl_callout {
|
||||
int dummy;
|
||||
};
|
||||
|
||||
struct ble_npl_mutex {
|
||||
int dummy;
|
||||
};
|
||||
|
||||
struct ble_npl_sem {
|
||||
int dummy;
|
||||
};
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _NPL_H_ */
|
||||
@@ -0,0 +1,250 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include "syscfg/syscfg.h"
|
||||
#include "sysinit/sysinit.h"
|
||||
#include "os/os_mempool.h"
|
||||
#include "nimble/ble.h"
|
||||
#include "nimble/ble_hci_trans.h"
|
||||
#include "nimble/hci_common.h"
|
||||
|
||||
/* HCI packet types */
|
||||
#define HCI_PKT_CMD 0x01
|
||||
#define HCI_PKT_ACL 0x02
|
||||
#define HCI_PKT_EVT 0x04
|
||||
#define HCI_PKT_GTL 0x05
|
||||
|
||||
/* Buffers for HCI commands data */
|
||||
static uint8_t trans_buf_cmd[BLE_HCI_TRANS_CMD_SZ];
|
||||
static uint8_t trans_buf_cmd_allocd;
|
||||
|
||||
/* Buffers for HCI events data */
|
||||
static uint8_t trans_buf_evt_hi_pool_buf[ OS_MEMPOOL_BYTES(
|
||||
MYNEWT_VAL(BLE_HCI_EVT_HI_BUF_COUNT),
|
||||
MYNEWT_VAL(BLE_HCI_EVT_BUF_SIZE)) ];
|
||||
static struct os_mempool trans_buf_evt_hi_pool;
|
||||
static uint8_t trans_buf_evt_lo_pool_buf[ OS_MEMPOOL_BYTES(
|
||||
MYNEWT_VAL(BLE_HCI_EVT_LO_BUF_COUNT),
|
||||
MYNEWT_VAL(BLE_HCI_EVT_BUF_SIZE)) ];
|
||||
static struct os_mempool trans_buf_evt_lo_pool;
|
||||
|
||||
/* Buffers for HCI ACL data */
|
||||
#define ACL_POOL_BLOCK_SIZE OS_ALIGN(MYNEWT_VAL(BLE_ACL_BUF_SIZE) + \
|
||||
BLE_MBUF_MEMBLOCK_OVERHEAD + \
|
||||
BLE_HCI_DATA_HDR_SZ, OS_ALIGNMENT)
|
||||
static uint8_t trans_buf_acl_pool_buf[ OS_MEMPOOL_BYTES(
|
||||
MYNEWT_VAL(BLE_ACL_BUF_COUNT),
|
||||
ACL_POOL_BLOCK_SIZE) ];
|
||||
static struct os_mempool trans_buf_acl_pool;
|
||||
static struct os_mbuf_pool trans_buf_acl_mbuf_pool;
|
||||
|
||||
/* Host interface */
|
||||
static ble_hci_trans_rx_cmd_fn *trans_rx_cmd_cb;
|
||||
static void *trans_rx_cmd_arg;
|
||||
static ble_hci_trans_rx_acl_fn *trans_rx_acl_cb;
|
||||
static void *trans_rx_acl_arg;
|
||||
|
||||
/* Called by NimBLE host to reset HCI transport state (i.e. on host reset) */
|
||||
int
|
||||
ble_hci_trans_reset(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Called by NimBLE host to setup callbacks from HCI transport */
|
||||
void
|
||||
ble_hci_trans_cfg_hs(ble_hci_trans_rx_cmd_fn *cmd_cb, void *cmd_arg,
|
||||
ble_hci_trans_rx_acl_fn *acl_cb, void *acl_arg)
|
||||
{
|
||||
trans_rx_cmd_cb = cmd_cb;
|
||||
trans_rx_cmd_arg = cmd_arg;
|
||||
trans_rx_acl_cb = acl_cb;
|
||||
trans_rx_acl_arg = acl_arg;
|
||||
}
|
||||
|
||||
/*
|
||||
* Called by NimBLE host to allocate buffer for HCI Command packet.
|
||||
* Called by HCI transport to allocate buffer for HCI Event packet.
|
||||
*/
|
||||
uint8_t *
|
||||
ble_hci_trans_buf_alloc(int type)
|
||||
{
|
||||
uint8_t *buf;
|
||||
|
||||
switch (type) {
|
||||
case BLE_HCI_TRANS_BUF_CMD:
|
||||
assert(!trans_buf_cmd_allocd);
|
||||
trans_buf_cmd_allocd = 1;
|
||||
buf = trans_buf_cmd;
|
||||
break;
|
||||
case BLE_HCI_TRANS_BUF_EVT_HI:
|
||||
buf = os_memblock_get(&trans_buf_evt_hi_pool);
|
||||
if (buf) {
|
||||
break;
|
||||
}
|
||||
/* no break */
|
||||
case BLE_HCI_TRANS_BUF_EVT_LO:
|
||||
buf = os_memblock_get(&trans_buf_evt_lo_pool);
|
||||
break;
|
||||
default:
|
||||
assert(0);
|
||||
buf = NULL;
|
||||
}
|
||||
|
||||
return buf;
|
||||
}
|
||||
|
||||
/*
|
||||
* Called by NimBLE host to free buffer allocated for HCI Event packet.
|
||||
* Called by HCI transport to free buffer allocated for HCI Command packet.
|
||||
*/
|
||||
void
|
||||
ble_hci_trans_buf_free(uint8_t *buf)
|
||||
{
|
||||
int rc;
|
||||
|
||||
if (buf == trans_buf_cmd) {
|
||||
assert(trans_buf_cmd_allocd);
|
||||
trans_buf_cmd_allocd = 0;
|
||||
} else if (os_memblock_from(&trans_buf_evt_hi_pool, buf)) {
|
||||
rc = os_memblock_put(&trans_buf_evt_hi_pool, buf);
|
||||
assert(rc == 0);
|
||||
} else {
|
||||
assert(os_memblock_from(&trans_buf_evt_lo_pool, buf));
|
||||
rc = os_memblock_put(&trans_buf_evt_lo_pool, buf);
|
||||
assert(rc == 0);
|
||||
}
|
||||
}
|
||||
|
||||
/* Called by NimBLE host to send HCI Command packet over HCI transport */
|
||||
int
|
||||
ble_hci_trans_hs_cmd_tx(uint8_t *cmd)
|
||||
{
|
||||
uint8_t *buf = cmd;
|
||||
|
||||
/*
|
||||
* TODO Send HCI Command packet somewhere.
|
||||
* Buffer pointed by 'cmd' contains complete HCI Command packet as defined
|
||||
* by Core spec.
|
||||
*/
|
||||
|
||||
ble_hci_trans_buf_free(buf);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Called by NimBLE host to send HCI ACL Data packet over HCI transport */
|
||||
int
|
||||
ble_hci_trans_hs_acl_tx(struct os_mbuf *om)
|
||||
{
|
||||
uint8_t *buf = om->om_data;
|
||||
|
||||
/*
|
||||
* TODO Send HCI ACL Data packet somewhere.
|
||||
* mbuf pointed by 'om' contains complete HCI ACL Data packet as defined
|
||||
* by Core spec.
|
||||
*/
|
||||
(void)buf;
|
||||
|
||||
os_mbuf_free_chain(om);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Called by application to send HCI ACL Data packet to host */
|
||||
int
|
||||
hci_transport_send_acl_to_host(uint8_t *buf, uint16_t size)
|
||||
{
|
||||
struct os_mbuf *trans_mbuf;
|
||||
int rc;
|
||||
|
||||
trans_mbuf = os_mbuf_get_pkthdr(&trans_buf_acl_mbuf_pool,
|
||||
sizeof(struct ble_mbuf_hdr));
|
||||
os_mbuf_append(trans_mbuf, buf, size);
|
||||
rc = trans_rx_acl_cb(trans_mbuf, trans_rx_acl_arg);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
/* Called by application to send HCI Event packet to host */
|
||||
int
|
||||
hci_transport_send_evt_to_host(uint8_t *buf, uint8_t size)
|
||||
{
|
||||
uint8_t *trans_buf;
|
||||
int rc;
|
||||
|
||||
/* Allocate LE Advertising Report Event from lo pool only */
|
||||
if ((buf[0] == BLE_HCI_EVCODE_LE_META) &&
|
||||
(buf[2] == BLE_HCI_LE_SUBEV_ADV_RPT)) {
|
||||
trans_buf = ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_EVT_LO);
|
||||
if (!trans_buf) {
|
||||
/* Skip advertising report if we're out of memory */
|
||||
return 0;
|
||||
}
|
||||
} else {
|
||||
trans_buf = ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_EVT_HI);
|
||||
}
|
||||
|
||||
memcpy(trans_buf, buf, size);
|
||||
|
||||
rc = trans_rx_cmd_cb(trans_buf, trans_rx_cmd_arg);
|
||||
if (rc != 0) {
|
||||
ble_hci_trans_buf_free(trans_buf);
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
/* Called by application to initialize transport structures */
|
||||
int
|
||||
hci_transport_init(void)
|
||||
{
|
||||
int rc;
|
||||
|
||||
trans_buf_cmd_allocd = 0;
|
||||
|
||||
rc = os_mempool_init(&trans_buf_acl_pool, MYNEWT_VAL(BLE_ACL_BUF_COUNT),
|
||||
ACL_POOL_BLOCK_SIZE, trans_buf_acl_pool_buf,
|
||||
"dummy_hci_acl_pool");
|
||||
SYSINIT_PANIC_ASSERT(rc == 0);
|
||||
|
||||
rc = os_mbuf_pool_init(&trans_buf_acl_mbuf_pool, &trans_buf_acl_pool,
|
||||
ACL_POOL_BLOCK_SIZE,
|
||||
MYNEWT_VAL(BLE_ACL_BUF_COUNT));
|
||||
SYSINIT_PANIC_ASSERT(rc == 0);
|
||||
|
||||
rc = os_mempool_init(&trans_buf_evt_hi_pool,
|
||||
MYNEWT_VAL(BLE_HCI_EVT_HI_BUF_COUNT),
|
||||
MYNEWT_VAL(BLE_HCI_EVT_BUF_SIZE),
|
||||
trans_buf_evt_hi_pool_buf,
|
||||
"dummy_hci_hci_evt_hi_pool");
|
||||
SYSINIT_PANIC_ASSERT(rc == 0);
|
||||
|
||||
rc = os_mempool_init(&trans_buf_evt_lo_pool,
|
||||
MYNEWT_VAL(BLE_HCI_EVT_LO_BUF_COUNT),
|
||||
MYNEWT_VAL(BLE_HCI_EVT_BUF_SIZE),
|
||||
trans_buf_evt_lo_pool_buf,
|
||||
"dummy_hci_hci_evt_lo_pool");
|
||||
SYSINIT_PANIC_ASSERT(rc == 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,201 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
#include <stddef.h>
|
||||
#include "nimble/nimble_npl.h"
|
||||
|
||||
bool
|
||||
ble_npl_os_started(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
void *
|
||||
ble_npl_get_current_task_id(void)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct ble_npl_eventq *
|
||||
ble_npl_eventq_dflt_get(void)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void
|
||||
ble_npl_eventq_init(struct ble_npl_eventq *evq)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
ble_npl_eventq_put(struct ble_npl_eventq *evq, struct ble_npl_event *ev)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
ble_npl_eventq_remove(struct ble_npl_eventq *evq,
|
||||
struct ble_npl_event *ev)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
ble_npl_eventq_run(struct ble_npl_eventq *evq)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
ble_npl_event_init(struct ble_npl_event *ev, ble_npl_event_fn *fn,
|
||||
void *arg)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
bool ble_npl_event_is_queued(struct ble_npl_event *ev)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
void *
|
||||
ble_npl_event_get_arg(struct ble_npl_event *ev)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void
|
||||
ble_npl_event_set_arg(struct ble_npl_event *ev, void *arg)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
ble_npl_error_t
|
||||
ble_npl_mutex_init(struct ble_npl_mutex *mu)
|
||||
{
|
||||
return BLE_NPL_ENOENT;
|
||||
}
|
||||
|
||||
ble_npl_error_t
|
||||
ble_npl_mutex_pend(struct ble_npl_mutex *mu, ble_npl_time_t timeout)
|
||||
{
|
||||
return BLE_NPL_ENOENT;
|
||||
}
|
||||
|
||||
ble_npl_error_t
|
||||
ble_npl_mutex_release(struct ble_npl_mutex *mu)
|
||||
{
|
||||
return BLE_NPL_ENOENT;
|
||||
}
|
||||
|
||||
ble_npl_error_t
|
||||
ble_npl_sem_init(struct ble_npl_sem *sem, uint16_t tokens)
|
||||
{
|
||||
return BLE_NPL_ENOENT;
|
||||
}
|
||||
|
||||
ble_npl_error_t
|
||||
ble_npl_sem_pend(struct ble_npl_sem *sem, ble_npl_time_t timeout)
|
||||
{
|
||||
return BLE_NPL_ENOENT;
|
||||
}
|
||||
|
||||
ble_npl_error_t
|
||||
ble_npl_sem_release(struct ble_npl_sem *sem)
|
||||
{
|
||||
return BLE_NPL_ENOENT;
|
||||
}
|
||||
|
||||
uint16_t
|
||||
ble_npl_sem_get_count(struct ble_npl_sem *sem)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
ble_npl_callout_init(struct ble_npl_callout *c, struct ble_npl_eventq *evq,
|
||||
ble_npl_event_fn *ev_cb, void *ev_arg)
|
||||
{
|
||||
}
|
||||
|
||||
int
|
||||
ble_npl_callout_reset(struct ble_npl_callout *c, ble_npl_time_t ticks)
|
||||
{
|
||||
return BLE_NPL_ENOENT;
|
||||
}
|
||||
|
||||
void
|
||||
ble_npl_callout_stop(struct ble_npl_callout *co)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
int
|
||||
ble_npl_callout_queued(struct ble_npl_callout *c)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
ble_npl_time_t
|
||||
ble_npl_callout_get_ticks(struct ble_npl_callout *co)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint32_t
|
||||
ble_npl_time_get(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
ble_npl_error_t
|
||||
ble_npl_time_ms_to_ticks(uint32_t ms, ble_npl_time_t *out_ticks)
|
||||
{
|
||||
return BLE_NPL_ENOENT;
|
||||
}
|
||||
|
||||
ble_npl_error_t
|
||||
ble_npl_time_ticks_to_ms(ble_npl_time_t ticks, uint32_t *out_ms)
|
||||
{
|
||||
return BLE_NPL_ENOENT;
|
||||
}
|
||||
|
||||
ble_npl_time_t
|
||||
ble_npl_time_ms_to_ticks32(uint32_t ms)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint32_t
|
||||
ble_npl_time_ticks_to_ms32(ble_npl_time_t ticks)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint32_t
|
||||
ble_npl_hw_enter_critical(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
ble_npl_hw_exit_critical(uint32_t ctx)
|
||||
{
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user