forked from xuos/xiuos
				
			Merge branch 'prepare_for_master' of https://git.trustie.net/xuos/xiuos into xidatong
This commit is contained in:
		
						commit
						6fc09a8864
					
				| 
						 | 
				
			
			@ -6,6 +6,10 @@ config ADAPTER_E220
 | 
			
		|||
        bool "Using lora adapter device E220-400T22S"
 | 
			
		||||
        default n
 | 
			
		||||
 | 
			
		||||
config ADAPTER_E22
 | 
			
		||||
        bool "Using lora adapter device E22-400T33D"
 | 
			
		||||
        default n
 | 
			
		||||
 | 
			
		||||
choice 
 | 
			
		||||
        prompt "Lora device adapter select net role type "
 | 
			
		||||
        default AS_LORA_CLIENT_ROLE
 | 
			
		||||
| 
						 | 
				
			
			@ -39,4 +43,8 @@ endif
 | 
			
		|||
 | 
			
		||||
if ADAPTER_E220
 | 
			
		||||
    source "$APP_DIR/Framework/connection/lora/e220/Kconfig"
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
if ADAPTER_E22
 | 
			
		||||
    source "$APP_DIR/Framework/connection/lora/e22/Kconfig"
 | 
			
		||||
endif 
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -28,6 +28,10 @@ extern AdapterProductInfoType Sx1278Attach(struct Adapter *adapter);
 | 
			
		|||
extern AdapterProductInfoType E220Attach(struct Adapter *adapter);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef ADAPTER_E22
 | 
			
		||||
extern AdapterProductInfoType E22Attach(struct Adapter *adapter);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//#define CLIENT_UPDATE_MODE
 | 
			
		||||
#define GATEWAY_CMD_MODE
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -887,6 +891,19 @@ int AdapterLoraInit(void)
 | 
			
		|||
    adapter->done = product_info->model_done;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef ADAPTER_E22
 | 
			
		||||
    AdapterProductInfoType product_info = E22Attach(adapter);
 | 
			
		||||
    if (!product_info) {
 | 
			
		||||
        printf("AdapterLoraInit e22 attach error\n");
 | 
			
		||||
        PrivFree(adapter);
 | 
			
		||||
        return -1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    adapter->product_info_flag = 1;
 | 
			
		||||
    adapter->info = product_info;
 | 
			
		||||
    adapter->done = product_info->model_done;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    PrivSemaphoreCreate(&adapter->sem, 0, 0);
 | 
			
		||||
 | 
			
		||||
    PrivSemaphoreCreate(&gateway_recv_data_sem, 0, 0);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,28 @@
 | 
			
		|||
config ADAPTER_LORA_E22
 | 
			
		||||
        string "E22-400T33D adapter name"
 | 
			
		||||
        default "e22"
 | 
			
		||||
 | 
			
		||||
if ADD_XIZI_FETURES
 | 
			
		||||
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
if ADD_NUTTX_FETURES
 | 
			
		||||
 | 
			
		||||
    config ADAPTER_E22_M0_PATH
 | 
			
		||||
        string "E22 M0 pin device"
 | 
			
		||||
        default "/dev/gpio0"
 | 
			
		||||
 | 
			
		||||
    config ADAPTER_E22_M1_PATH
 | 
			
		||||
        string "E22 M1 pin device"
 | 
			
		||||
        default "/dev/gpio1"
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    config ADAPTER_E22_DRIVER
 | 
			
		||||
        string "E22 device uart driver path"
 | 
			
		||||
        default "/dev/ttyS3"
 | 
			
		||||
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
if ADD_RTTHREAD_FETURES
 | 
			
		||||
 | 
			
		||||
endif
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,6 @@
 | 
			
		|||
############################################################################
 | 
			
		||||
# APP_Framework/Framework/connection/lora/e22/Make.defs
 | 
			
		||||
############################################################################
 | 
			
		||||
ifneq ($(CONFIG_ADAPTER_E22),)
 | 
			
		||||
CONFIGURED_APPS += $(APPDIR)/../../../APP_Framework/Framework/connection/lora/e22
 | 
			
		||||
endif
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,7 @@
 | 
			
		|||
include $(KERNEL_ROOT)/.config
 | 
			
		||||
ifeq ($(CONFIG_ADD_NUTTX_FETURES),y)
 | 
			
		||||
    include $(APPDIR)/Make.defs
 | 
			
		||||
    CSRCS += e22.c
 | 
			
		||||
    include $(APPDIR)/Application.mk
 | 
			
		||||
 | 
			
		||||
endif
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,509 @@
 | 
			
		|||
/*
 | 
			
		||||
* Copyright (c) 2020 AIIT XUOS Lab
 | 
			
		||||
* XiUOS is licensed under Mulan PSL v2.
 | 
			
		||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
 | 
			
		||||
* You may obtain a copy of Mulan PSL v2 at:
 | 
			
		||||
*        http://license.coscl.org.cn/MulanPSL2
 | 
			
		||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 | 
			
		||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 | 
			
		||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 | 
			
		||||
* See the Mulan PSL v2 for more details.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @file e22.c
 | 
			
		||||
 * @brief Implement the connection E22-400T22S lora adapter function
 | 
			
		||||
 * @version 2.0
 | 
			
		||||
 * @author AIIT XUOS Lab
 | 
			
		||||
 * @date 2022.4.20
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <adapter.h>
 | 
			
		||||
 | 
			
		||||
#define E22_GATEWAY_ADDRESS 0xFFFF
 | 
			
		||||
#define E22_CHANNEL 0x05
 | 
			
		||||
 | 
			
		||||
#ifdef AS_LORA_GATEWAY_ROLE
 | 
			
		||||
#define E22_ADDRESS E22_GATEWAY_ADDRESS
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef AS_LORA_CLIENT_ROLE
 | 
			
		||||
#define E22_ADDRESS ADAPTER_LORA_NET_ROLE_ID
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define E22_UART_BAUD_RATE 115200
 | 
			
		||||
 | 
			
		||||
enum E22LoraMode
 | 
			
		||||
{
 | 
			
		||||
    DATA_TRANSFER_MODE = 0,  //M1 : M0 = 0 : 0
 | 
			
		||||
    WOR_SEND_MODE,           //M1 : M0 = 0 : 1
 | 
			
		||||
    CONFIGURE_MODE,          //M1 : M0 = 1 : 0
 | 
			
		||||
    SLEEP_MODE,              //M1 : M0 = 1 : 1
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @description: Config E22 work mode by set M1/M0 pin
 | 
			
		||||
 * @param mode Lora working mode
 | 
			
		||||
 * @return NULL
 | 
			
		||||
 */
 | 
			
		||||
static void E22LoraModeConfig(enum E22LoraMode mode)
 | 
			
		||||
{
 | 
			
		||||
    int m0_fd, m1_fd;
 | 
			
		||||
 | 
			
		||||
    //delay 1s , wait AUX ready
 | 
			
		||||
    PrivTaskDelay(1000);
 | 
			
		||||
    m0_fd = PrivOpen(ADAPTER_E22_M0_PATH, O_RDWR);
 | 
			
		||||
    if (m0_fd < 0) {
 | 
			
		||||
        printf("open %s error\n", ADAPTER_E22_M0_PATH);
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    m1_fd = PrivOpen(ADAPTER_E22_M1_PATH, O_RDWR);
 | 
			
		||||
    if (m1_fd < 0) {
 | 
			
		||||
        printf("open %s error\n", ADAPTER_E22_M1_PATH);
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    //Both M0 and M1 GPIO are outputs mode, set M0 and M1 high or low
 | 
			
		||||
    switch (mode)
 | 
			
		||||
    {
 | 
			
		||||
    case DATA_TRANSFER_MODE:
 | 
			
		||||
        PrivIoctl(m1_fd, GPIOC_WRITE, (unsigned long)GPIO_LOW);
 | 
			
		||||
        PrivIoctl(m0_fd, GPIOC_WRITE, (unsigned long)GPIO_LOW);
 | 
			
		||||
        break;
 | 
			
		||||
 | 
			
		||||
    case WOR_SEND_MODE:
 | 
			
		||||
        PrivIoctl(m1_fd, GPIOC_WRITE, (unsigned long)GPIO_LOW);
 | 
			
		||||
        PrivIoctl(m0_fd, GPIOC_WRITE, (unsigned long)GPIO_HIGH);
 | 
			
		||||
        break;
 | 
			
		||||
    
 | 
			
		||||
    case CONFIGURE_MODE:
 | 
			
		||||
        PrivIoctl(m1_fd, GPIOC_WRITE, (unsigned long)GPIO_HIGH);
 | 
			
		||||
        PrivIoctl(m0_fd, GPIOC_WRITE,(unsigned long)GPIO_LOW);
 | 
			
		||||
        break;
 | 
			
		||||
 | 
			
		||||
    case SLEEP_MODE:
 | 
			
		||||
        PrivIoctl(m1_fd, GPIOC_WRITE, (unsigned long)GPIO_HIGH);
 | 
			
		||||
        PrivIoctl(m0_fd, GPIOC_WRITE, (unsigned long)GPIO_HIGH);
 | 
			
		||||
        break;
 | 
			
		||||
    
 | 
			
		||||
    default:
 | 
			
		||||
        break;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    PrivClose(m0_fd);
 | 
			
		||||
    PrivClose(m1_fd);
 | 
			
		||||
 | 
			
		||||
    //delay 20ms , wait mode switch done
 | 
			
		||||
    PrivTaskDelay(20);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @description: Switch baud rate to register bit
 | 
			
		||||
 * @param baud_rate - baud_rate
 | 
			
		||||
 * @return baud_rate_bit
 | 
			
		||||
 */
 | 
			
		||||
static uint8 E22BaudRateSwitch(uint32 baud_rate)
 | 
			
		||||
{
 | 
			
		||||
    uint8 baud_rate_bit;
 | 
			
		||||
 | 
			
		||||
    switch (baud_rate)
 | 
			
		||||
    {
 | 
			
		||||
    case 1200:
 | 
			
		||||
        baud_rate_bit = 0x0;
 | 
			
		||||
        break;
 | 
			
		||||
 | 
			
		||||
    case 2400:
 | 
			
		||||
        baud_rate_bit = 0x1;
 | 
			
		||||
        break;
 | 
			
		||||
 | 
			
		||||
    case 4800:
 | 
			
		||||
        baud_rate_bit = 0x2;
 | 
			
		||||
        break;
 | 
			
		||||
 | 
			
		||||
    case 9600:
 | 
			
		||||
        baud_rate_bit = 0x3;
 | 
			
		||||
        break;
 | 
			
		||||
 | 
			
		||||
    case 19200:
 | 
			
		||||
        baud_rate_bit = 0x4;
 | 
			
		||||
        break;
 | 
			
		||||
 | 
			
		||||
    case 38400:
 | 
			
		||||
        baud_rate_bit = 0x5;
 | 
			
		||||
        break;
 | 
			
		||||
 | 
			
		||||
    case 57600:
 | 
			
		||||
        baud_rate_bit = 0x6;
 | 
			
		||||
        break;
 | 
			
		||||
 | 
			
		||||
    case 115200:
 | 
			
		||||
        baud_rate_bit = 0x7;
 | 
			
		||||
        break;
 | 
			
		||||
    
 | 
			
		||||
    default:
 | 
			
		||||
        break;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return baud_rate_bit;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @description: Set E22 register, such as address、channel、baud rate...
 | 
			
		||||
 * @param adapter - lora adapter
 | 
			
		||||
 * @param address - address
 | 
			
		||||
 * @param channel - channel
 | 
			
		||||
 * @param baud_rate - baud_rate
 | 
			
		||||
 * @return success: 0, failure: -1
 | 
			
		||||
 */
 | 
			
		||||
static int E22SetRegisterParam(struct Adapter *adapter, uint16 address, uint8 channel, uint32 baud_rate)
 | 
			
		||||
{
 | 
			
		||||
    int ret;
 | 
			
		||||
    uint8 buffer[50] = {0};
 | 
			
		||||
    uint8 baud_rate_bit = E22BaudRateSwitch(baud_rate);
 | 
			
		||||
 | 
			
		||||
    E22LoraModeConfig(CONFIGURE_MODE);
 | 
			
		||||
    PrivTaskDelay(30);
 | 
			
		||||
 | 
			
		||||
    buffer[0] = 0xC0;                   //write register order
 | 
			
		||||
    buffer[1] = 0x00;                   //register start-address
 | 
			
		||||
    buffer[2] = 0x09;                   //register length
 | 
			
		||||
 | 
			
		||||
    buffer[3] = (address >> 8) & 0xFF;  //high address
 | 
			
		||||
    buffer[4] = address & 0xFF;         //low adderss
 | 
			
		||||
 | 
			
		||||
    buffer[5] = 0x00;                   //net id
 | 
			
		||||
 | 
			
		||||
    buffer[6] = ((baud_rate_bit << 5) & 0xE0) | 0x04;  // baud、stop bits、air rate
 | 
			
		||||
 | 
			
		||||
    buffer[7] = 0x00;
 | 
			
		||||
    buffer[8] = channel;                 //channel
 | 
			
		||||
    buffer[9] = 0x03;
 | 
			
		||||
    buffer[10] = 0;                       //high-cipher
 | 
			
		||||
    buffer[11] = 0;                      //low-cipher
 | 
			
		||||
 | 
			
		||||
    ret = PrivWrite(adapter->fd, (void *)buffer, 12);
 | 
			
		||||
    if(ret < 0){
 | 
			
		||||
        printf("E22SetRegisterParam send failed %d!\n", ret);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    PrivTaskDelay(1000);
 | 
			
		||||
    ret = PrivRead(adapter->fd, buffer, 19);
 | 
			
		||||
    if(ret < 0){
 | 
			
		||||
        printf("E22 RegisterParam get failed %d!\n", ret);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    E22LoraModeConfig(DATA_TRANSFER_MODE);
 | 
			
		||||
    PrivTaskDelay(1000);
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @description: Get E22 register, such as address、channel、baud rate...
 | 
			
		||||
 * @param buf - data buf
 | 
			
		||||
 * @return success: 0, failure: -1
 | 
			
		||||
 */
 | 
			
		||||
static int E22GetRegisterParam(uint8 *buf)
 | 
			
		||||
{
 | 
			
		||||
    int ret;
 | 
			
		||||
    uint8 buffer[20] = {0};
 | 
			
		||||
 | 
			
		||||
    struct Adapter *adapter = AdapterDeviceFindByName(ADAPTER_LORA_NAME);
 | 
			
		||||
    if (NULL == adapter) {
 | 
			
		||||
        printf("E22GetRegisterParam find lora adapter error\n");
 | 
			
		||||
        return -1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    E22LoraModeConfig(CONFIGURE_MODE);
 | 
			
		||||
    PrivTaskDelay(30);
 | 
			
		||||
 | 
			
		||||
    buffer[0] = 0xC1;                   //read register order
 | 
			
		||||
    buffer[1] = 0x00;                   //register start-address
 | 
			
		||||
    buffer[2] = 0x09;                   //register length
 | 
			
		||||
 | 
			
		||||
    ret = PrivWrite(adapter->fd, (void *)buffer, 3);
 | 
			
		||||
    if(ret < 0){
 | 
			
		||||
        printf("E22GetRegisterParam send failed %d!\n", ret);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    PrivTaskDelay(1000);
 | 
			
		||||
    ret = PrivRead(adapter->fd, buf, 19);
 | 
			
		||||
    if(ret < 0){
 | 
			
		||||
        printf("E22 RegisterParam get failed %d!\n", ret);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    E22LoraModeConfig(DATA_TRANSFER_MODE);
 | 
			
		||||
    PrivTaskDelay(1000);
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @description: Open E22 uart function
 | 
			
		||||
 * @param adapter - Lora device pointer
 | 
			
		||||
 * @return success: 0, failure: -1
 | 
			
		||||
 */
 | 
			
		||||
static int E22Open(struct Adapter *adapter)
 | 
			
		||||
{
 | 
			
		||||
    int ret = 0;
 | 
			
		||||
    struct termios cfg;
 | 
			
		||||
    /*step1: open e22 uart port*/
 | 
			
		||||
    adapter->fd = PrivOpen(ADAPTER_E22_DRIVER, O_RDWR);
 | 
			
		||||
    if (adapter->fd < 0) {
 | 
			
		||||
        printf("E22Open get uart %s fd error\n", ADAPTER_E22_DRIVER);
 | 
			
		||||
        return -1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    tcgetattr(adapter->fd, &cfg);
 | 
			
		||||
    cfsetspeed(&cfg, BAUD_RATE_9600);
 | 
			
		||||
    tcsetattr(adapter->fd, TCSANOW, &cfg);
 | 
			
		||||
 | 
			
		||||
    E22SetRegisterParam(adapter, E22_ADDRESS, E22_CHANNEL, E22_UART_BAUD_RATE);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    cfsetspeed(&cfg, E22_UART_BAUD_RATE);
 | 
			
		||||
    tcsetattr(adapter->fd, TCSANOW, &cfg);
 | 
			
		||||
 | 
			
		||||
    ADAPTER_DEBUG("E22Open done\n");
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @description: Close E22 uart function
 | 
			
		||||
 * @param adapter - Lora device pointer
 | 
			
		||||
 * @return success: 0, failure: -1
 | 
			
		||||
 */
 | 
			
		||||
static int E22Close(struct Adapter *adapter)
 | 
			
		||||
{
 | 
			
		||||
    /*step1: close e22 uart port*/
 | 
			
		||||
    int ret;
 | 
			
		||||
    ret = PrivClose(adapter->fd);
 | 
			
		||||
    if(ret < 0) {
 | 
			
		||||
        printf("E22 close failed: %d!\n", ret);
 | 
			
		||||
        return -1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ADAPTER_DEBUG("E22 Close done\n");
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @description: E22 ioctl function
 | 
			
		||||
 * @param adapter - Lora device pointer
 | 
			
		||||
 * @param cmd - ioctl cmd
 | 
			
		||||
 * @param args - iotl params
 | 
			
		||||
 * @return success: 0, failure: -1
 | 
			
		||||
 */
 | 
			
		||||
static int E22Ioctl(struct Adapter *adapter, int cmd, void *args)
 | 
			
		||||
{
 | 
			
		||||
    /*to do*/
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @description: E22 join lora net group function
 | 
			
		||||
 * @param adapter - Lora device pointer
 | 
			
		||||
 * @param priv_net_group - priv_net_group params
 | 
			
		||||
 * @return success: 0, failure: -1
 | 
			
		||||
 */
 | 
			
		||||
static int E22Join(struct Adapter *adapter, unsigned char *priv_net_group)
 | 
			
		||||
{
 | 
			
		||||
    int ret;
 | 
			
		||||
    struct AdapterData *priv_net_group_data = (struct AdapterData *)priv_net_group;
 | 
			
		||||
 | 
			
		||||
    ret = PrivWrite(adapter->fd, (void *)priv_net_group_data->buffer, priv_net_group_data->len);
 | 
			
		||||
    if(ret < 0) {
 | 
			
		||||
        printf("E22 Join net group failed: %d!\n", ret);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @description: E22 send data function
 | 
			
		||||
 * @param adapter - Lora device pointer
 | 
			
		||||
 * @param buf - data buffers
 | 
			
		||||
 * @param len - data len
 | 
			
		||||
 * @return success: 0, failure: -1
 | 
			
		||||
 */
 | 
			
		||||
static int E22Send(struct Adapter *adapter, const void *buf, size_t len)
 | 
			
		||||
{
 | 
			
		||||
    int ret;
 | 
			
		||||
 | 
			
		||||
    ret = PrivWrite(adapter->fd, (void *)buf, len);
 | 
			
		||||
    if(ret < 0){
 | 
			
		||||
        printf("send failed %d!\n", ret);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @description: E22 receive data function 
 | 
			
		||||
 * @param adapter - Lora device pointer
 | 
			
		||||
 * @param buf - data buffers
 | 
			
		||||
 * @param len - data len
 | 
			
		||||
 * @return success: 0, failure: -1
 | 
			
		||||
 */
 | 
			
		||||
static int E22Recv(struct Adapter *adapter, void *buf, size_t len)
 | 
			
		||||
{
 | 
			
		||||
    int recv_len, recv_len_continue;
 | 
			
		||||
 | 
			
		||||
    uint8 *recv_buf = PrivMalloc(len);
 | 
			
		||||
 | 
			
		||||
    recv_len = PrivRead(adapter->fd, recv_buf, len);
 | 
			
		||||
    if (recv_len) {
 | 
			
		||||
        while (recv_len < len) {
 | 
			
		||||
            recv_len_continue = PrivRead(adapter->fd, recv_buf + recv_len, len - recv_len);
 | 
			
		||||
            if (recv_len_continue) {
 | 
			
		||||
                recv_len += recv_len_continue;
 | 
			
		||||
            } else {
 | 
			
		||||
                recv_len = 0;
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        memcpy(buf, recv_buf, len);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    PrivFree(recv_buf);
 | 
			
		||||
    
 | 
			
		||||
    return recv_len;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @description: E22 quit lora net group function
 | 
			
		||||
 * @param adapter - Lora device pointer
 | 
			
		||||
 * @param priv_net_group - priv_net_group params
 | 
			
		||||
 * @return success: 0, failure: -1
 | 
			
		||||
 */
 | 
			
		||||
static int E22Quit(struct Adapter *adapter, unsigned char *priv_net_group)
 | 
			
		||||
{
 | 
			
		||||
    int ret;
 | 
			
		||||
 | 
			
		||||
    struct AdapterData *priv_net_group_data = (struct AdapterData *)priv_net_group;
 | 
			
		||||
 | 
			
		||||
    ret = PrivWrite(adapter->fd, (void *)priv_net_group_data->buffer, priv_net_group_data->len);
 | 
			
		||||
    if(ret < 0){
 | 
			
		||||
        printf("E22 quit net group failed %d!\n", ret);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static const struct PrivProtocolDone e22_done = 
 | 
			
		||||
{
 | 
			
		||||
    .open = E22Open,
 | 
			
		||||
    .close = E22Close,
 | 
			
		||||
    .ioctl = E22Ioctl,
 | 
			
		||||
    .setup = NULL,
 | 
			
		||||
    .setdown = NULL,
 | 
			
		||||
    .setaddr = NULL,
 | 
			
		||||
    .setdns = NULL,
 | 
			
		||||
    .setdhcp = NULL,
 | 
			
		||||
    .ping = NULL,
 | 
			
		||||
    .netstat = NULL,
 | 
			
		||||
    .join = E22Join,
 | 
			
		||||
    .send = E22Send,
 | 
			
		||||
    .recv = E22Recv,
 | 
			
		||||
    .quit = E22Quit,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
AdapterProductInfoType E22Attach(struct Adapter *adapter)
 | 
			
		||||
{
 | 
			
		||||
    struct AdapterProductInfo *product_info = malloc(sizeof(struct AdapterProductInfo));
 | 
			
		||||
    if (!product_info) {
 | 
			
		||||
        printf("E22Attach malloc product_info error\n");
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    strncpy(product_info->model_name, ADAPTER_LORA_E22,sizeof(product_info->model_name));
 | 
			
		||||
    product_info->model_done = (void *)&e22_done;
 | 
			
		||||
 | 
			
		||||
    return product_info;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//###################TEST####################
 | 
			
		||||
static void LoraOpen(void)
 | 
			
		||||
{
 | 
			
		||||
    struct Adapter *adapter = AdapterDeviceFindByName(ADAPTER_LORA_NAME);
 | 
			
		||||
    if (NULL == adapter) {
 | 
			
		||||
        printf("LoraReceive find lora adapter error\n");
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    E22Open(adapter);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void LoraRead(void *parameter)
 | 
			
		||||
{
 | 
			
		||||
	int RevLen;
 | 
			
		||||
	int i, cnt = 0;
 | 
			
		||||
 | 
			
		||||
    uint8 buffer[256];
 | 
			
		||||
 | 
			
		||||
    memset(buffer, 0, 256);
 | 
			
		||||
 | 
			
		||||
    struct Adapter *adapter = AdapterDeviceFindByName(ADAPTER_LORA_NAME);
 | 
			
		||||
    if (NULL == adapter) {
 | 
			
		||||
        printf("LoraRead find lora adapter error\n");
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
	
 | 
			
		||||
    while (1)
 | 
			
		||||
    {
 | 
			
		||||
        printf("ready to read lora data\n");
 | 
			
		||||
 | 
			
		||||
        RevLen = E22Recv(adapter, buffer, 256);
 | 
			
		||||
		if (RevLen) {
 | 
			
		||||
            printf("lora get data %u\n", RevLen);
 | 
			
		||||
            for (i = 0; i < RevLen; i ++) {
 | 
			
		||||
                printf("i %u data 0x%x\n", i, buffer[i]);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            memset(buffer, 0, 256);
 | 
			
		||||
 | 
			
		||||
            PrivTaskDelay(1000);
 | 
			
		||||
 | 
			
		||||
			cnt ++;
 | 
			
		||||
            E22Send(adapter, &cnt, 1);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void E22LoraReceive(void)
 | 
			
		||||
{
 | 
			
		||||
    int ret;
 | 
			
		||||
    pthread_t thread; 
 | 
			
		||||
    pthread_attr_t attr = PTHREAD_ATTR_INITIALIZER;
 | 
			
		||||
    attr.priority = 80;
 | 
			
		||||
    attr.stacksize = 2048;
 | 
			
		||||
 | 
			
		||||
    LoraOpen(); 
 | 
			
		||||
 | 
			
		||||
    ret = PrivTaskCreate(&thread, &attr, (void*)LoraRead, NULL);
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        printf("task lora read create failed, status=%d\n", ret);
 | 
			
		||||
		return;
 | 
			
		||||
	} 
 | 
			
		||||
}
 | 
			
		||||
void E22LoraSend(int argc, char *argv[])
 | 
			
		||||
{
 | 
			
		||||
    struct Adapter *adapter = AdapterDeviceFindByName(ADAPTER_LORA_NAME);
 | 
			
		||||
    if (NULL == adapter) {
 | 
			
		||||
        printf("LoraRead find lora adapter error\n");
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (argc == 2) {
 | 
			
		||||
        char Msg[256] = {0};
 | 
			
		||||
        strncpy(Msg, argv[1], 256);
 | 
			
		||||
 | 
			
		||||
        E22Open(adapter);
 | 
			
		||||
        E22Send(adapter, Msg, strlen(Msg));
 | 
			
		||||
        E22Close(adapter);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,30 @@
 | 
			
		|||
#
 | 
			
		||||
# For a description of the syntax of this configuration file,
 | 
			
		||||
# see the file kconfig-language.txt in the NuttX tools repository.
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
config EXAMPLES_E22
 | 
			
		||||
	tristate "E22 driver example"
 | 
			
		||||
	default n
 | 
			
		||||
	depends on STM32_USART3
 | 
			
		||||
	---help---
 | 
			
		||||
		Enable the e22 driver example
 | 
			
		||||
 | 
			
		||||
if EXAMPLES_E22
 | 
			
		||||
 | 
			
		||||
config EXAMPLES_E22_PROGNAME
 | 
			
		||||
	string "Program name"
 | 
			
		||||
	default "e22"
 | 
			
		||||
	---help---
 | 
			
		||||
		This is the name of the program that will be used when the NSH ELF
 | 
			
		||||
		program is installed.
 | 
			
		||||
 | 
			
		||||
config EXAMPLES_E22_PRIORITY
 | 
			
		||||
	int "E22 task priority"
 | 
			
		||||
	default 100
 | 
			
		||||
 | 
			
		||||
config EXAMPLES_E22_STACKSIZE
 | 
			
		||||
	int "E22 stack size"
 | 
			
		||||
	default DEFAULT_TASK_STACKSIZE
 | 
			
		||||
 | 
			
		||||
endif
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,23 @@
 | 
			
		|||
############################################################################
 | 
			
		||||
# apps/examples/gpio/Make.defs
 | 
			
		||||
#
 | 
			
		||||
# 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.
 | 
			
		||||
#
 | 
			
		||||
############################################################################
 | 
			
		||||
 | 
			
		||||
ifneq ($(CONFIG_EXAMPLES_E22),)
 | 
			
		||||
CONFIGURED_APPS += $(APPDIR)/examples/e22_demo
 | 
			
		||||
endif
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,34 @@
 | 
			
		|||
############################################################################
 | 
			
		||||
# apps/examples/gpio/Makefile
 | 
			
		||||
#
 | 
			
		||||
# 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 $(APPDIR)/Make.defs
 | 
			
		||||
 | 
			
		||||
# GPIO, World! built-in application info
 | 
			
		||||
 | 
			
		||||
PROGNAME = $(CONFIG_EXAMPLES_E22_PROGNAME)
 | 
			
		||||
PRIORITY = $(CONFIG_EXAMPLES_E22_PRIORITY)
 | 
			
		||||
STACKSIZE = $(CONFIG_EXAMPLES_E22_STACKSIZE)
 | 
			
		||||
MODULE = $(CONFIG_EXAMPLES_E22)
 | 
			
		||||
 | 
			
		||||
# GPIO, World! Example
 | 
			
		||||
 | 
			
		||||
MAINSRC = e22_main.c
 | 
			
		||||
 | 
			
		||||
include $(APPDIR)/Application.mk
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,109 @@
 | 
			
		|||
/*
 | 
			
		||||
* Copyright (c) 2020 AIIT XUOS Lab
 | 
			
		||||
* XiOS is licensed under Mulan PSL v2.
 | 
			
		||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
 | 
			
		||||
* You may obtain a copy of Mulan PSL v2 at:
 | 
			
		||||
*        http://license.coscl.org.cn/MulanPSL2
 | 
			
		||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 | 
			
		||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 | 
			
		||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 | 
			
		||||
* See the Mulan PSL v2 for more details.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @file e22_main.c
 | 
			
		||||
 * @brief e22 demo
 | 
			
		||||
 * @version 1.0
 | 
			
		||||
 * @author AIIT XUOS Lab
 | 
			
		||||
 * @date 2022.05.20
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
#include <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <sys/ioctl.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <fcntl.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
#include <termios.h>
 | 
			
		||||
#include <nuttx/ioexpander/gpio.h>
 | 
			
		||||
 | 
			
		||||
int main(int argc, FAR char *argv[])
 | 
			
		||||
{
 | 
			
		||||
    int fd, m0fd, m1fd;
 | 
			
		||||
    int ret;
 | 
			
		||||
    int i;
 | 
			
		||||
    struct termios tio;
 | 
			
		||||
 | 
			
		||||
    char sendbuffer1[4] = {0xC0,0x05,0x01,0x09};
 | 
			
		||||
    char sendbuffer2[7] = {0xC0,0x00,0x04,0x12,0x34,0x00,0x61};
 | 
			
		||||
    char sendbuffer3[3] = {0xC1,0x00,0x04};
 | 
			
		||||
    char buffer[256];
 | 
			
		||||
    int readlen;
 | 
			
		||||
 | 
			
		||||
    fd = open("/dev/ttyS3", O_RDWR);
 | 
			
		||||
    if(fd < 0)
 | 
			
		||||
    {
 | 
			
		||||
      printf("Error opening serial: %d\n", fd);;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    ret = tcgetattr(fd, &tio);
 | 
			
		||||
    if (ret < 0)
 | 
			
		||||
    {
 | 
			
		||||
        printf("Error getting attributes: %d\n", ret);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    ret = cfsetspeed(&tio, B9600);
 | 
			
		||||
    if (ret < 0)
 | 
			
		||||
    {
 | 
			
		||||
        printf("Error setting baud rate: %d\n", ret);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    ret = tcsetattr(fd, TCSANOW, &tio);
 | 
			
		||||
    if (ret < 0)
 | 
			
		||||
    {
 | 
			
		||||
        printf("Error getting attributes: %d\n", ret);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    m0fd = open("/dev/gpout0", O_RDWR);
 | 
			
		||||
    m1fd = open("/dev/gpout1", O_RDWR);
 | 
			
		||||
    ioctl(m0fd, GPIOC_WRITE, (unsigned long)0);
 | 
			
		||||
    ioctl(m1fd, GPIOC_WRITE, (unsigned long)1);
 | 
			
		||||
    sleep(1);
 | 
			
		||||
 | 
			
		||||
    write(fd, sendbuffer1,4);
 | 
			
		||||
    sleep(1);
 | 
			
		||||
    readlen = read(fd, buffer, 256);
 | 
			
		||||
    printf("readlen1 = %d\n", readlen);
 | 
			
		||||
    for(i = 0;i< readlen; ++i)
 | 
			
		||||
    {
 | 
			
		||||
        printf("0x%x\n", buffer[i]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    write(fd, sendbuffer2,7);
 | 
			
		||||
    sleep(1);
 | 
			
		||||
    readlen = read(fd, buffer, 256);
 | 
			
		||||
    printf("readlen1 = %d\n", readlen);
 | 
			
		||||
    for(i = 0;i< readlen; ++i)
 | 
			
		||||
    {
 | 
			
		||||
        printf("0x%x\n", buffer[i]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    write(fd, sendbuffer3,3);
 | 
			
		||||
    sleep(1);
 | 
			
		||||
    readlen = read(fd, buffer, 256);
 | 
			
		||||
    printf("readlen1 = %d\n", readlen);
 | 
			
		||||
    for(i = 0;i< readlen; ++i)
 | 
			
		||||
    {
 | 
			
		||||
        printf("0x%x\n", buffer[i]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    close(fd);
 | 
			
		||||
    close(m0fd);
 | 
			
		||||
    close(m1fd);
 | 
			
		||||
    
 | 
			
		||||
    return 0;  
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -635,6 +635,14 @@ config NSH_DISABLE_E220_LORA_SEND
 | 
			
		|||
	bool "Disable e220 Lora send."
 | 
			
		||||
	default n
 | 
			
		||||
 | 
			
		||||
config NSH_DISABLE_E22_LORA_RECEIVE
 | 
			
		||||
	bool "Disable e22 Lora receive."
 | 
			
		||||
	default n
 | 
			
		||||
 | 
			
		||||
config NSH_DISABLE_E22_LORA_SEND
 | 
			
		||||
	bool "Disable e22 Lora send."
 | 
			
		||||
	default n
 | 
			
		||||
 | 
			
		||||
config NSH_DISABLE_ADAPTER_BLUETOOTH_TEST
 | 
			
		||||
	bool "Disable hc08  AdapterBlueToothTest."
 | 
			
		||||
	default n
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1527,7 +1527,8 @@ int nsh_foreach_var(FAR struct nsh_vtbl_s *vtbl, nsh_foreach_var_t cb,
 | 
			
		|||
  int cmd_recvzigbee(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if (defined(CONFIG_ADAPTER_LORA_SX1278) || defined(CONFIG_ADAPTER_LORA_E220)) && !defined(CONFIG_NSH_DISABLE_ADAPTER_LORATEST)
 | 
			
		||||
#if (defined(CONFIG_ADAPTER_LORA_SX1278) || defined(CONFIG_ADAPTER_LORA_E220) || defined(CONFIG_ADAPTER_LORA_E22)) && \
 | 
			
		||||
    !defined(CONFIG_NSH_DISABLE_ADAPTER_LORATEST)
 | 
			
		||||
  int cmd_AdapterLoraTest(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1543,6 +1544,14 @@ int nsh_foreach_var(FAR struct nsh_vtbl_s *vtbl, nsh_foreach_var_t cb,
 | 
			
		|||
  int cmd_E220LoraSend(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(CONFIG_ADAPTER_LORA_E22) && !defined(CONFIG_NSH_DISABLE_E22_LORA_RECEIVE)
 | 
			
		||||
  int cmd_E22LoraReceive(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(CONFIG_ADAPTER_LORA_E22) && !defined(CONFIG_NSH_DISABLE_E22_LORA_SEND)
 | 
			
		||||
  int cmd_E22LoraSend(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(CONFIG_ADAPTER_BLUETOOTH_HC08) && !defined(CONFIG_NSH_DISABLE_ADAPTER_BLUETOOTH_TEST)
 | 
			
		||||
  int cmd_AdapterBlueToothTest(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv);
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -36,6 +36,8 @@
 | 
			
		|||
#include "nsh.h"
 | 
			
		||||
#include "nsh_console.h"
 | 
			
		||||
 | 
			
		||||
extern int FrameworkInit(void);
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: cmd_Ch438
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
| 
						 | 
				
			
			@ -322,7 +324,8 @@ int cmd_AdapterWifiTest(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)
 | 
			
		|||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if (defined(CONFIG_ADAPTER_LORA_SX1278) || defined(CONFIG_ADAPTER_LORA_E220)) && !defined(CONFIG_NSH_DISABLE_ADAPTER_LORATEST)
 | 
			
		||||
#if (defined(CONFIG_ADAPTER_LORA_SX1278) || defined(CONFIG_ADAPTER_LORA_E220) || defined(CONFIG_ADAPTER_LORA_E22)) && \
 | 
			
		||||
    !defined(CONFIG_NSH_DISABLE_ADAPTER_LORATEST)
 | 
			
		||||
extern int AdapterLoraTest(void);
 | 
			
		||||
int cmd_AdapterLoraTest(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -366,6 +369,28 @@ int cmd_E220LoraSend(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)
 | 
			
		|||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(CONFIG_ADAPTER_LORA_E22) && !defined(CONFIG_NSH_DISABLE_E22_LORA_RECEIVE)
 | 
			
		||||
void E22LoraReceive(void);
 | 
			
		||||
int cmd_E22LoraReceive(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)
 | 
			
		||||
{
 | 
			
		||||
    nsh_output(vtbl, "Hello, world!\n");
 | 
			
		||||
    FrameworkInit();
 | 
			
		||||
    E22LoraReceive();
 | 
			
		||||
    return OK;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(CONFIG_ADAPTER_LORA_E22) && !defined(CONFIG_NSH_DISABLE_E22_LORA_SEND)
 | 
			
		||||
extern void E22LoraSend(int argc, char *argv[]);
 | 
			
		||||
int cmd_E22LoraSend(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)
 | 
			
		||||
{
 | 
			
		||||
    nsh_output(vtbl, "Hello, world!\n");
 | 
			
		||||
    FrameworkInit();
 | 
			
		||||
    E22LoraSend(argc,argv);
 | 
			
		||||
    return OK;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(CONFIG_ADAPTER_BLUETOOTH_HC08) && !defined(CONFIG_NSH_DISABLE_ADAPTER_BLUETOOTH_TEST)
 | 
			
		||||
extern int AdapterBlueToothTest(void);
 | 
			
		||||
int cmd_AdapterBlueToothTest(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -672,8 +672,9 @@ static const struct cmdmap_s g_cmdmap[] =
 | 
			
		|||
  { "recvzigbee",       cmd_recvzigbee,       1, 1, "[receive message.]" },
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if (defined(CONFIG_ADAPTER_LORA_SX1278) || defined(CONFIG_ADAPTER_LORA_E220)) && !defined(CONFIG_NSH_DISABLE_ADAPTER_LORATEST)
 | 
			
		||||
  { "AdapterLoraTest",       cmd_AdapterLoraTest,       1, 1, "[Lora sx128 test.]" },
 | 
			
		||||
#if (defined(CONFIG_ADAPTER_LORA_SX1278) || defined(CONFIG_ADAPTER_LORA_E220) || defined(CONFIG_ADAPTER_LORA_E22)) && \
 | 
			
		||||
    !defined(CONFIG_NSH_DISABLE_ADAPTER_LORATEST)
 | 
			
		||||
  { "AdapterLoraTest",       cmd_AdapterLoraTest,       1, 1, "[Lora test.]" },
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(CONFIG_ADAPTER_4G_EC200T) && !defined(CONFIG_NSH_DISABLE_ADAPTER_4GTEST)
 | 
			
		||||
| 
						 | 
				
			
			@ -688,6 +689,14 @@ static const struct cmdmap_s g_cmdmap[] =
 | 
			
		|||
  { "E220Send",       cmd_E220LoraSend,       1, 2, "[e220loraSend <message>]" },
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(CONFIG_ADAPTER_LORA_E22) && !defined(CONFIG_NSH_DISABLE_E22_LORA_RECEIVE)
 | 
			
		||||
  { "E22Receive",       cmd_E22LoraReceive,       1, 1, "[e22 lora receive.]" },
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(CONFIG_ADAPTER_LORA_E22) && !defined(CONFIG_NSH_DISABLE_E22_LORA_SEND)
 | 
			
		||||
  { "E22Send",       cmd_E22LoraSend,       1, 2, "[e22loraSend <message>]" },
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(CONFIG_ADAPTER_BLUETOOTH_HC08) && !defined(CONFIG_NSH_DISABLE_ADAPTER_BLUETOOTH_TEST)
 | 
			
		||||
  { "AdapterBlueToothTest",       cmd_AdapterBlueToothTest,       1, 1, "[BlueTooth hc08 test.]" },
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2051,6 +2051,18 @@ source "binfmt/Kconfig"
 | 
			
		|||
endmenu
 | 
			
		||||
 | 
			
		||||
menu "Library Routines"
 | 
			
		||||
 | 
			
		||||
choice
 | 
			
		||||
	prompt "Selcet C library,built-in libc or musl libc."
 | 
			
		||||
	default NUTTX_BUILT_IN_LIBC
 | 
			
		||||
 | 
			
		||||
config NUTTX_BUILT_IN_LIBC
 | 
			
		||||
	bool "nuttx built-in libc"
 | 
			
		||||
 | 
			
		||||
config MUSL_LIBC
 | 
			
		||||
	bool "musl libc"
 | 
			
		||||
endchoice
 | 
			
		||||
 | 
			
		||||
source "libs/libc/Kconfig"
 | 
			
		||||
source "libs/libxx/Kconfig"
 | 
			
		||||
source "libs/libdsp/Kconfig"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,68 @@
 | 
			
		|||
#
 | 
			
		||||
# This file is autogenerated: PLEASE DO NOT EDIT IT.
 | 
			
		||||
#
 | 
			
		||||
# You can use "make menuconfig" to make any modifications to the installed .config file.
 | 
			
		||||
# You can then do "make savedefconfig" to generate a new defconfig file that includes your
 | 
			
		||||
# modifications.
 | 
			
		||||
#
 | 
			
		||||
# CONFIG_ARCH_FPU is not set
 | 
			
		||||
# CONFIG_NSH_ARGCAT is not set
 | 
			
		||||
# CONFIG_NSH_CMDOPT_HEXDUMP is not set
 | 
			
		||||
# CONFIG_NSH_CMDPARMS is not set
 | 
			
		||||
CONFIG_ADD_NUTTX_FETURES=y
 | 
			
		||||
CONFIG_ARCH="arm"
 | 
			
		||||
CONFIG_ARCH_BOARD="stm32f4discovery"
 | 
			
		||||
CONFIG_ARCH_BOARD_STM32F4_DISCOVERY=y
 | 
			
		||||
CONFIG_ARCH_BUTTONS=y
 | 
			
		||||
CONFIG_ARCH_CHIP="stm32"
 | 
			
		||||
CONFIG_ARCH_CHIP_STM32=y
 | 
			
		||||
CONFIG_ARCH_CHIP_STM32F407VG=y
 | 
			
		||||
CONFIG_ARCH_STACKDUMP=y
 | 
			
		||||
CONFIG_BOARD_LATE_INITIALIZE=y
 | 
			
		||||
CONFIG_BOARD_LOOPSPERMSEC=16717
 | 
			
		||||
CONFIG_BUILTIN=y
 | 
			
		||||
CONFIG_EXAMPLES_HELLO=y
 | 
			
		||||
CONFIG_FS_PROCFS=y
 | 
			
		||||
CONFIG_HAVE_CXX=y
 | 
			
		||||
CONFIG_HAVE_CXXINITIALIZE=y
 | 
			
		||||
CONFIG_HOST_WINDOWS=y
 | 
			
		||||
CONFIG_INIT_ENTRYPOINT="nsh_main"
 | 
			
		||||
CONFIG_INTELHEX_BINARY=y
 | 
			
		||||
CONFIG_MM_REGIONS=2
 | 
			
		||||
CONFIG_NSH_BUILTIN_APPS=y
 | 
			
		||||
CONFIG_NSH_FILEIOSIZE=512
 | 
			
		||||
CONFIG_NSH_LINELEN=64
 | 
			
		||||
CONFIG_NSH_READLINE=y
 | 
			
		||||
CONFIG_PREALLOC_TIMERS=4
 | 
			
		||||
CONFIG_RAM_SIZE=114688
 | 
			
		||||
CONFIG_RAM_START=0x20000000
 | 
			
		||||
CONFIG_RAW_BINARY=y
 | 
			
		||||
CONFIG_RR_INTERVAL=200
 | 
			
		||||
CONFIG_SCHED_WAITPID=y
 | 
			
		||||
CONFIG_START_DAY=6
 | 
			
		||||
CONFIG_START_MONTH=12
 | 
			
		||||
CONFIG_START_YEAR=2011
 | 
			
		||||
CONFIG_STM32_JTAG_SW_ENABLE=y
 | 
			
		||||
CONFIG_STM32_PWR=y
 | 
			
		||||
CONFIG_STM32_SPI1=y
 | 
			
		||||
CONFIG_STM32_USART2=y
 | 
			
		||||
CONFIG_STM32_USART3=y
 | 
			
		||||
CONFIG_SERIAL_TERMIOS=y
 | 
			
		||||
CONFIG_SYSTEM_NSH=y
 | 
			
		||||
CONFIG_USART2_RXBUFSIZE=128
 | 
			
		||||
CONFIG_USART2_SERIAL_CONSOLE=y
 | 
			
		||||
CONFIG_USART2_TXBUFSIZE=128
 | 
			
		||||
CONFIG_DEV_GPIO=y
 | 
			
		||||
CONFIG_BOARDCTL_RESET=y
 | 
			
		||||
CONFIG_READLINE_CMD_HISTORY=y
 | 
			
		||||
CONFIG_READLINE_CMD_HISTORY_LEN=100
 | 
			
		||||
CONFIG_READLINE_CMD_HISTORY_LINELEN=120
 | 
			
		||||
CONFIG_READLINE_TABCOMPLETION=y
 | 
			
		||||
CONFIG_SUPPORT_CONNECTION_FRAMEWORK=y
 | 
			
		||||
CONFIG_CONNECTION_FRAMEWORK_DEBUG=y
 | 
			
		||||
CONFIG_CONNECTION_ADAPTER_LORA=y
 | 
			
		||||
CONFIG_ADAPTER_E22=y
 | 
			
		||||
CONFIG_ADAPTER_LORA_E22="e22"
 | 
			
		||||
CONFIG_ADAPTER_E22_M0_PATH="/dev/gpio0"
 | 
			
		||||
CONFIG_ADAPTER_E22_M1_PATH="/dev/gpio1"
 | 
			
		||||
CONFIG_ADAPTER_E22_DRIVER="/dev/ttyS3"
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,60 @@
 | 
			
		|||
#
 | 
			
		||||
# This file is autogenerated: PLEASE DO NOT EDIT IT.
 | 
			
		||||
#
 | 
			
		||||
# You can use "make menuconfig" to make any modifications to the installed .config file.
 | 
			
		||||
# You can then do "make savedefconfig" to generate a new defconfig file that includes your
 | 
			
		||||
# modifications.
 | 
			
		||||
#
 | 
			
		||||
# CONFIG_ARCH_FPU is not set
 | 
			
		||||
# CONFIG_NSH_ARGCAT is not set
 | 
			
		||||
# CONFIG_NSH_CMDOPT_HEXDUMP is not set
 | 
			
		||||
# CONFIG_NSH_CMDPARMS is not set
 | 
			
		||||
CONFIG_ADD_NUTTX_FETURES=y
 | 
			
		||||
CONFIG_ARCH="arm"
 | 
			
		||||
CONFIG_ARCH_BOARD="stm32f4discovery"
 | 
			
		||||
CONFIG_ARCH_BOARD_STM32F4_DISCOVERY=y
 | 
			
		||||
CONFIG_ARCH_BUTTONS=y
 | 
			
		||||
CONFIG_ARCH_CHIP="stm32"
 | 
			
		||||
CONFIG_ARCH_CHIP_STM32=y
 | 
			
		||||
CONFIG_ARCH_CHIP_STM32F407VG=y
 | 
			
		||||
CONFIG_ARCH_STACKDUMP=y
 | 
			
		||||
CONFIG_BOARD_LATE_INITIALIZE=y
 | 
			
		||||
CONFIG_BOARD_LOOPSPERMSEC=16717
 | 
			
		||||
CONFIG_BUILTIN=y
 | 
			
		||||
CONFIG_EXAMPLES_HELLO=y
 | 
			
		||||
CONFIG_FS_PROCFS=y
 | 
			
		||||
CONFIG_HAVE_CXX=y
 | 
			
		||||
CONFIG_HAVE_CXXINITIALIZE=y
 | 
			
		||||
CONFIG_HOST_WINDOWS=y
 | 
			
		||||
CONFIG_INIT_ENTRYPOINT="nsh_main"
 | 
			
		||||
CONFIG_INTELHEX_BINARY=y
 | 
			
		||||
CONFIG_MM_REGIONS=2
 | 
			
		||||
CONFIG_NSH_BUILTIN_APPS=y
 | 
			
		||||
CONFIG_NSH_FILEIOSIZE=512
 | 
			
		||||
CONFIG_NSH_LINELEN=64
 | 
			
		||||
CONFIG_NSH_READLINE=y
 | 
			
		||||
CONFIG_PREALLOC_TIMERS=4
 | 
			
		||||
CONFIG_RAM_SIZE=114688
 | 
			
		||||
CONFIG_RAM_START=0x20000000
 | 
			
		||||
CONFIG_RAW_BINARY=y
 | 
			
		||||
CONFIG_RR_INTERVAL=200
 | 
			
		||||
CONFIG_SCHED_WAITPID=y
 | 
			
		||||
CONFIG_START_DAY=6
 | 
			
		||||
CONFIG_START_MONTH=12
 | 
			
		||||
CONFIG_START_YEAR=2011
 | 
			
		||||
CONFIG_STM32_JTAG_SW_ENABLE=y
 | 
			
		||||
CONFIG_STM32_PWR=y
 | 
			
		||||
CONFIG_STM32_SPI1=y
 | 
			
		||||
CONFIG_STM32_USART2=y
 | 
			
		||||
CONFIG_STM32_USART3=y
 | 
			
		||||
CONFIG_SERIAL_TERMIOS=y
 | 
			
		||||
CONFIG_SYSTEM_NSH=y
 | 
			
		||||
CONFIG_USART2_RXBUFSIZE=128
 | 
			
		||||
CONFIG_USART2_SERIAL_CONSOLE=y
 | 
			
		||||
CONFIG_USART2_TXBUFSIZE=128
 | 
			
		||||
CONFIG_DEV_GPIO=y
 | 
			
		||||
CONFIG_BOARDCTL_RESET=y
 | 
			
		||||
CONFIG_READLINE_CMD_HISTORY=y
 | 
			
		||||
CONFIG_READLINE_CMD_HISTORY_LEN=100
 | 
			
		||||
CONFIG_READLINE_CMD_HISTORY_LINELEN=120
 | 
			
		||||
CONFIG_READLINE_TABCOMPLETION=y
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,184 @@
 | 
			
		|||
############################################################################
 | 
			
		||||
# boards/arm/stm32/stm32f4discovery/src/Make.defs
 | 
			
		||||
#
 | 
			
		||||
# 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 $(TOPDIR)/Make.defs
 | 
			
		||||
 | 
			
		||||
CSRCS = stm32_boot.c stm32_bringup.c stm32_spi.c stm32_perfcount.c
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_ARCH_LEDS),y)
 | 
			
		||||
CSRCS += stm32_autoleds.c
 | 
			
		||||
else
 | 
			
		||||
CSRCS += stm32_userleds.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_AUDIO_CS43L22),y)
 | 
			
		||||
CSRCS += stm32_cs43l22.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_ARCH_BUTTONS),y)
 | 
			
		||||
CSRCS +=  stm32_buttons.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_STM32_CAN_CHARDRIVER),y)
 | 
			
		||||
CSRCS += stm32_can.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_STM32_OTGFS),y)
 | 
			
		||||
CSRCS += stm32_usb.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_LCD_ST7567),y)
 | 
			
		||||
CSRCS += stm32_st7567.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_ENC28J60),y)
 | 
			
		||||
CSRCS += stm32_enc28j60.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_LPWAN_SX127X),y)
 | 
			
		||||
CSRCS += stm32_sx127x.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_LCD_MAX7219),y)
 | 
			
		||||
CSRCS += stm32_max7219.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_LCD_ST7032),y)
 | 
			
		||||
CSRCS += stm32_st7032.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_PCA9635PW),y)
 | 
			
		||||
CSRCS += stm32_pca9635.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_STM32_SDIO),y)
 | 
			
		||||
CSRCS += stm32_sdio.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_STM32_ETHMAC),y)
 | 
			
		||||
CSRCS += stm32_ethernet.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_LEDS_MAX7219),y)
 | 
			
		||||
CSRCS += stm32_max7219_leds.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_RGBLED),y)
 | 
			
		||||
CSRCS += stm32_rgbled.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_RTC_DS1307),y)
 | 
			
		||||
CSRCS += stm32_ds1307.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_PWM),y)
 | 
			
		||||
CSRCS += stm32_pwm.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_BOARDCTL),y)
 | 
			
		||||
CSRCS += stm32_appinit.c
 | 
			
		||||
ifeq ($(CONFIG_BOARDCTL_RESET),y)
 | 
			
		||||
CSRCS += stm32_reset.c
 | 
			
		||||
endif
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_ARCH_CUSTOM_PMINIT),y)
 | 
			
		||||
CSRCS += stm32_pm.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_PM_BUTTONS),y)
 | 
			
		||||
CSRCS += stm32_pmbuttons.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_ARCH_IDLE_CUSTOM),y)
 | 
			
		||||
CSRCS += stm32_idle.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_STM32_FSMC),y)
 | 
			
		||||
CSRCS += stm32_extmem.c
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_LCD_SSD1289),y)
 | 
			
		||||
CSRCS += stm32_ssd1289.c
 | 
			
		||||
endif
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_LCD_SSD1351),y)
 | 
			
		||||
CSRCS += stm32_ssd1351.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_LCD_UG2864AMBAG01),y)
 | 
			
		||||
CSRCS += stm32_ug2864ambag01.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_LCD_UG2864HSWEG01),y)
 | 
			
		||||
CSRCS += stm32_ug2864hsweg01.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_TESTING_OSTEST),y)
 | 
			
		||||
CSRCS += stm32_ostest.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_TIMER),y)
 | 
			
		||||
CSRCS += stm32_timer.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_STM32_HCIUART),y)
 | 
			
		||||
ifeq ($(CONFIG_BLUETOOTH_UART),y)
 | 
			
		||||
CSRCS += stm32_hciuart.c
 | 
			
		||||
endif
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_STM32_ROMFS),y)
 | 
			
		||||
CSRCS += stm32_romfs_initialize.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_BOARDCTL_UNIQUEID),y)
 | 
			
		||||
CSRCS += stm32_uid.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_USBMSC),y)
 | 
			
		||||
CSRCS += stm32_usbmsc.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifneq ($(CONFIG_STM32_ETHMAC),y)
 | 
			
		||||
ifeq ($(CONFIG_NETDEVICES),y)
 | 
			
		||||
CSRCS += stm32_netinit.c
 | 
			
		||||
endif
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_MMCSD_SPI),y)
 | 
			
		||||
CSRCS += stm32_mmcsd.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_WL_GS2200M),y)
 | 
			
		||||
CSRCS += stm32_gs2200m.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_LCD_ST7789),y)
 | 
			
		||||
CSRCS += stm32_st7789.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_DEV_GPIO),y)
 | 
			
		||||
CSRCS += stm32_gpio.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
DEPPATH += --dep-path board
 | 
			
		||||
VPATH += :board
 | 
			
		||||
CFLAGS += $(shell $(INCDIR) "$(CC)" $(TOPDIR)$(DELIM)arch$(DELIM)$(CONFIG_ARCH)$(DELIM)src$(DELIM)board$(DELIM)board)
 | 
			
		||||
| 
						 | 
				
			
			@ -571,5 +571,14 @@ int stm32_bringup(void)
 | 
			
		|||
    }
 | 
			
		||||
#endif /* CONFIG_SENSORS_HS300X */
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_DEV_GPIO
 | 
			
		||||
  ret = stm32_gpio_initialize();
 | 
			
		||||
  if (ret < 0)
 | 
			
		||||
    {
 | 
			
		||||
      syslog(LOG_ERR, "Failed to initialize GPIO Driver: %d\n", ret);
 | 
			
		||||
      return ret;
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,344 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/stm32/stm32f4discovery/src/stm32_goio.c
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed to the Apache Software Foundation (ASF) under one or more
 | 
			
		||||
 * contributor license agreements.  See the NOTICE file distributed with
 | 
			
		||||
 * this work for additional information regarding copyright ownership.  The
 | 
			
		||||
 * ASF licenses this file to you under the Apache License, Version 2.0 (the
 | 
			
		||||
 * "License"); you may not use this file except in compliance with the
 | 
			
		||||
 * License.  You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *   http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 | 
			
		||||
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
 | 
			
		||||
 * License for the specific language governing permissions and limitations
 | 
			
		||||
 * under the License.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
* @file stm32_goio.c
 | 
			
		||||
* @brief nuttx source code
 | 
			
		||||
*                https://github.com/apache/incubator-nuttx.git
 | 
			
		||||
* @version 10.3.0 
 | 
			
		||||
* @author AIIT XUOS Lab
 | 
			
		||||
* @date 2022-05-19
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <debug.h>
 | 
			
		||||
 | 
			
		||||
#include <nuttx/clock.h>
 | 
			
		||||
#include <nuttx/wdog.h>
 | 
			
		||||
#include <nuttx/ioexpander/gpio.h>
 | 
			
		||||
 | 
			
		||||
#include <arch/board/board.h>
 | 
			
		||||
 | 
			
		||||
#include "chip.h"
 | 
			
		||||
#include "stm32.h"
 | 
			
		||||
#include "stm32f4discovery.h"
 | 
			
		||||
 | 
			
		||||
#if defined(CONFIG_DEV_GPIO) && !defined(CONFIG_GPIO_LOWER_HALF)
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Private Types
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
struct stm32gpio_dev_s
 | 
			
		||||
{
 | 
			
		||||
  struct gpio_dev_s gpio;
 | 
			
		||||
  uint8_t id;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct stm32gpint_dev_s
 | 
			
		||||
{
 | 
			
		||||
  struct stm32gpio_dev_s stm32gpio;
 | 
			
		||||
  pin_interrupt_t callback;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Private Function Prototypes
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
#if BOARD_NGPIOIN > 0
 | 
			
		||||
static int gpin_read(FAR struct gpio_dev_s *dev, FAR bool *value);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if BOARD_NGPIOOUT > 0
 | 
			
		||||
static int gpout_read(FAR struct gpio_dev_s *dev, FAR bool *value);
 | 
			
		||||
static int gpout_write(FAR struct gpio_dev_s *dev, bool value);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if BOARD_NGPIOINT > 0
 | 
			
		||||
static int stm32gpio_interrupt(int irq, void *context, void *arg);
 | 
			
		||||
static int gpint_read(FAR struct gpio_dev_s *dev, FAR bool *value);
 | 
			
		||||
static int gpint_attach(FAR struct gpio_dev_s *dev,
 | 
			
		||||
                        pin_interrupt_t callback);
 | 
			
		||||
static int gpint_enable(FAR struct gpio_dev_s *dev, bool enable);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Private Data
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 #if BOARD_NGPIOIN > 0
 | 
			
		||||
static const struct gpio_operations_s gpin_ops =
 | 
			
		||||
{
 | 
			
		||||
  .go_read   = gpin_read,
 | 
			
		||||
  .go_write  = NULL,
 | 
			
		||||
  .go_attach = NULL,
 | 
			
		||||
  .go_enable = NULL,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* This array maps the GPIO pins used as INPUT */
 | 
			
		||||
 | 
			
		||||
static const uint32_t g_gpioinputs[BOARD_NGPIOIN] =
 | 
			
		||||
{
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static struct stm32gpio_dev_s g_gpin[BOARD_NGPIOIN];
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if BOARD_NGPIOOUT > 0
 | 
			
		||||
static const struct gpio_operations_s gpout_ops =
 | 
			
		||||
{
 | 
			
		||||
  .go_read   = gpout_read,
 | 
			
		||||
  .go_write  = gpout_write,
 | 
			
		||||
  .go_attach = NULL,
 | 
			
		||||
  .go_enable = NULL,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* This array maps the GPIO pins used as OUTPUT */
 | 
			
		||||
 | 
			
		||||
static const uint32_t g_gpiooutputs[BOARD_NGPIOOUT] =
 | 
			
		||||
{
 | 
			
		||||
  GPIO_E22_M0,
 | 
			
		||||
  GPIO_E22_M1,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static struct stm32gpio_dev_s g_gpout[BOARD_NGPIOOUT];
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if BOARD_NGPIOINT > 0
 | 
			
		||||
static const struct gpio_operations_s gpint_ops =
 | 
			
		||||
{
 | 
			
		||||
  .go_read   = gpint_read,
 | 
			
		||||
  .go_write  = NULL,
 | 
			
		||||
  .go_attach = gpint_attach,
 | 
			
		||||
  .go_enable = gpint_enable,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* This array maps the GPIO pins used as INTERRUPT INPUTS */
 | 
			
		||||
 | 
			
		||||
static const uint32_t g_gpiointinputs[BOARD_NGPIOINT] =
 | 
			
		||||
{
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static struct stm32gpint_dev_s g_gpint[BOARD_NGPIOINT];
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Private Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#if BOARD_NGPIOIN > 0
 | 
			
		||||
static int gpin_read(FAR struct gpio_dev_s *dev, FAR bool *value)
 | 
			
		||||
{
 | 
			
		||||
  FAR struct stm32gpio_dev_s *stm32gpio =
 | 
			
		||||
                        (FAR struct stm32gpio_dev_s *)dev;
 | 
			
		||||
 | 
			
		||||
  DEBUGASSERT(stm32gpio != NULL && value != NULL);
 | 
			
		||||
  DEBUGASSERT(stm32gpio->id < BOARD_NGPIOIN);
 | 
			
		||||
  gpioinfo("Reading...\n");
 | 
			
		||||
 | 
			
		||||
  *value = stm32_gpioread(g_gpioinputs[stm32gpio->id]);
 | 
			
		||||
  return OK;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if BOARD_NGPIOOUT > 0
 | 
			
		||||
static int gpout_read(FAR struct gpio_dev_s *dev, FAR bool *value)
 | 
			
		||||
{
 | 
			
		||||
  FAR struct stm32gpio_dev_s *stm32gpio =
 | 
			
		||||
                        (FAR struct stm32gpio_dev_s *)dev;
 | 
			
		||||
 | 
			
		||||
  DEBUGASSERT(stm32gpio != NULL && value != NULL);
 | 
			
		||||
  DEBUGASSERT(stm32gpio->id < BOARD_NGPIOOUT);
 | 
			
		||||
  gpioinfo("Reading...\n");
 | 
			
		||||
 | 
			
		||||
  *value = stm32_gpioread(g_gpiooutputs[stm32gpio->id]);
 | 
			
		||||
  return OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int gpout_write(FAR struct gpio_dev_s *dev, bool value)
 | 
			
		||||
{
 | 
			
		||||
  FAR struct stm32gpio_dev_s *stm32gpio =
 | 
			
		||||
                             (FAR struct stm32gpio_dev_s *)dev;
 | 
			
		||||
 | 
			
		||||
  DEBUGASSERT(stm32gpio != NULL);
 | 
			
		||||
  DEBUGASSERT(stm32gpio->id < BOARD_NGPIOOUT);
 | 
			
		||||
  gpioinfo("Writing %d\n", (int)value);
 | 
			
		||||
 | 
			
		||||
  stm32_gpiowrite(g_gpiooutputs[stm32gpio->id], value);
 | 
			
		||||
  return OK;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if BOARD_NGPIOINT > 0
 | 
			
		||||
static int stm32gpio_interrupt(int irq, void *context, void *arg)
 | 
			
		||||
{
 | 
			
		||||
  FAR struct stm32gpint_dev_s *stm32gpint =
 | 
			
		||||
                        (FAR struct stm32gpint_dev_s *)arg;
 | 
			
		||||
 | 
			
		||||
  DEBUGASSERT(stm32gpint != NULL && stm32gpint->callback != NULL);
 | 
			
		||||
  gpioinfo("Interrupt! callback=%p\n", stm32gpint->callback);
 | 
			
		||||
 | 
			
		||||
  stm32gpint->callback(&stm32gpint->stm32gpio.gpio,
 | 
			
		||||
                       stm32gpint->stm32gpio.id);
 | 
			
		||||
  return OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int gpint_read(FAR struct gpio_dev_s *dev, FAR bool *value)
 | 
			
		||||
{
 | 
			
		||||
  FAR struct stm32gpint_dev_s *stm32gpint =
 | 
			
		||||
                              (FAR struct stm32gpint_dev_s *)dev;
 | 
			
		||||
 | 
			
		||||
  DEBUGASSERT(stm32gpint != NULL && value != NULL);
 | 
			
		||||
  DEBUGASSERT(stm32gpint->stm32gpio.id < BOARD_NGPIOINT);
 | 
			
		||||
  gpioinfo("Reading int pin...\n");
 | 
			
		||||
 | 
			
		||||
  *value = stm32_gpioread(g_gpiointinputs[stm32gpint->stm32gpio.id]);
 | 
			
		||||
  return OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int gpint_attach(FAR struct gpio_dev_s *dev,
 | 
			
		||||
                        pin_interrupt_t callback)
 | 
			
		||||
{
 | 
			
		||||
  FAR struct stm32gpint_dev_s *stm32gpint =
 | 
			
		||||
                             (FAR struct stm32gpint_dev_s *)dev;
 | 
			
		||||
 | 
			
		||||
  gpioinfo("Attaching the callback\n");
 | 
			
		||||
 | 
			
		||||
  /* Make sure the interrupt is disabled */
 | 
			
		||||
 | 
			
		||||
  stm32_gpiosetevent(g_gpiointinputs[stm32gpint->stm32gpio.id], false,
 | 
			
		||||
                     false, false, NULL, NULL);
 | 
			
		||||
 | 
			
		||||
  gpioinfo("Attach %p\n", callback);
 | 
			
		||||
  stm32gpint->callback = callback;
 | 
			
		||||
  return OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int gpint_enable(FAR struct gpio_dev_s *dev, bool enable)
 | 
			
		||||
{
 | 
			
		||||
  FAR struct stm32gpint_dev_s *stm32gpint =
 | 
			
		||||
                              (FAR struct stm32gpint_dev_s *)dev;
 | 
			
		||||
 | 
			
		||||
  if (enable)
 | 
			
		||||
    {
 | 
			
		||||
      if (stm32gpint->callback != NULL)
 | 
			
		||||
        {
 | 
			
		||||
          gpioinfo("Enabling the interrupt\n");
 | 
			
		||||
 | 
			
		||||
          /* Configure the interrupt for rising edge */
 | 
			
		||||
 | 
			
		||||
          stm32_gpiosetevent(g_gpiointinputs[stm32gpint->stm32gpio.id],
 | 
			
		||||
                             true, false, false, stm32gpio_interrupt,
 | 
			
		||||
                             &g_gpint[stm32gpint->stm32gpio.id]);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    {
 | 
			
		||||
      gpioinfo("Disable the interrupt\n");
 | 
			
		||||
      stm32_gpiosetevent(g_gpiointinputs[stm32gpint->stm32gpio.id],
 | 
			
		||||
                         false, false, false, NULL, NULL);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return OK;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: stm32_gpio_initialize
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Initialize GPIO drivers for use with /apps/examples/gpio
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
int stm32_gpio_initialize(void)
 | 
			
		||||
{
 | 
			
		||||
  int i;
 | 
			
		||||
  int pincount;
 | 
			
		||||
 | 
			
		||||
#if BOARD_NGPIOIN > 0
 | 
			
		||||
  pincount = 0;
 | 
			
		||||
  for (i = 0; i < BOARD_NGPIOIN; i++)
 | 
			
		||||
    {
 | 
			
		||||
      /* Setup and register the GPIO pin */
 | 
			
		||||
 | 
			
		||||
      g_gpin[i].gpio.gp_pintype = GPIO_INPUT_PIN;
 | 
			
		||||
      g_gpin[i].gpio.gp_ops     = &gpin_ops;
 | 
			
		||||
      g_gpin[i].id              = i;
 | 
			
		||||
      gpio_pin_register(&g_gpin[i].gpio, pincount);
 | 
			
		||||
 | 
			
		||||
      /* Configure the pin that will be used as input */
 | 
			
		||||
 | 
			
		||||
      stm32_configgpio(g_gpioinputs[i]);
 | 
			
		||||
 | 
			
		||||
      pincount++;
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if BOARD_NGPIOOUT > 0
 | 
			
		||||
  pincount = 0;
 | 
			
		||||
  for (i = 0; i < BOARD_NGPIOOUT; i++)
 | 
			
		||||
    {
 | 
			
		||||
      /* Setup and register the GPIO pin */
 | 
			
		||||
 | 
			
		||||
      g_gpout[i].gpio.gp_pintype = GPIO_OUTPUT_PIN;
 | 
			
		||||
      g_gpout[i].gpio.gp_ops     = &gpout_ops;
 | 
			
		||||
      g_gpout[i].id              = i;
 | 
			
		||||
      gpio_pin_register(&g_gpout[i].gpio, pincount);
 | 
			
		||||
 | 
			
		||||
      /* Configure the pin that will be used as output */
 | 
			
		||||
 | 
			
		||||
      stm32_gpiowrite(g_gpiooutputs[i], 0);
 | 
			
		||||
      stm32_configgpio(g_gpiooutputs[i]);
 | 
			
		||||
 | 
			
		||||
      pincount++;
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if BOARD_NGPIOINT > 0
 | 
			
		||||
  pincount = 0;
 | 
			
		||||
  for (i = 0; i < BOARD_NGPIOINT; i++)
 | 
			
		||||
    {
 | 
			
		||||
      /* Setup and register the GPIO pin */
 | 
			
		||||
 | 
			
		||||
      g_gpint[i].stm32gpio.gpio.gp_pintype = GPIO_INTERRUPT_PIN;
 | 
			
		||||
      g_gpint[i].stm32gpio.gpio.gp_ops     = &gpint_ops;
 | 
			
		||||
      g_gpint[i].stm32gpio.id              = i;
 | 
			
		||||
      gpio_pin_register(&g_gpint[i].stm32gpio.gpio, pincount);
 | 
			
		||||
 | 
			
		||||
      /* Configure the pin that will be used as interrupt input */
 | 
			
		||||
 | 
			
		||||
      stm32_configgpio(g_gpiointinputs[i]);
 | 
			
		||||
 | 
			
		||||
      pincount++;
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
#endif /* CONFIG_DEV_GPIO && !CONFIG_GPIO_LOWER_HALF */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,885 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * boards/arm/stm32/stm32f4discovery/src/stm32f4discovery.h
 | 
			
		||||
 *
 | 
			
		||||
 * 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.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
* @file stm32f4discovery.h
 | 
			
		||||
* @brief nuttx source code
 | 
			
		||||
*                https://github.com/apache/incubator-nuttx.git
 | 
			
		||||
* @version 10.3.0 
 | 
			
		||||
* @author AIIT XUOS Lab
 | 
			
		||||
* @date 2022-05-19
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifndef __BOARDS_ARM_STM32_STM32F4DISCOVERY_SRC_STM32F4DISCOVERY_H
 | 
			
		||||
#define __BOARDS_ARM_STM32_STM32F4DISCOVERY_SRC_STM32F4DISCOVERY_H
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <nuttx/config.h>
 | 
			
		||||
#include <nuttx/compiler.h>
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include <arch/stm32/chip.h>
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Pre-processor Definitions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/* Configuration ************************************************************/
 | 
			
		||||
 | 
			
		||||
/* How many SPI modules does this chip support? */
 | 
			
		||||
 | 
			
		||||
#if STM32_NSPI < 1
 | 
			
		||||
#  undef CONFIG_STM32_SPI1
 | 
			
		||||
#  undef CONFIG_STM32_SPI2
 | 
			
		||||
#  undef CONFIG_STM32_SPI3
 | 
			
		||||
#elif STM32_NSPI < 2
 | 
			
		||||
#  undef CONFIG_STM32_SPI2
 | 
			
		||||
#  undef CONFIG_STM32_SPI3
 | 
			
		||||
#elif STM32_NSPI < 3
 | 
			
		||||
#  undef CONFIG_STM32_SPI3
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define PCA9635_I2CBUS  1
 | 
			
		||||
#define PCA9635_I2CADDR 0x40
 | 
			
		||||
 | 
			
		||||
/* Assume that we have everything */
 | 
			
		||||
 | 
			
		||||
#define HAVE_USBDEV     1
 | 
			
		||||
#define HAVE_USBHOST    1
 | 
			
		||||
#define HAVE_USBMONITOR 1
 | 
			
		||||
#define HAVE_SDIO       1
 | 
			
		||||
#define HAVE_CS43L22    1
 | 
			
		||||
#define HAVE_RTC_DRIVER 1
 | 
			
		||||
#define HAVE_NETMONITOR 1
 | 
			
		||||
#define HAVE_HCIUART    1
 | 
			
		||||
 | 
			
		||||
/* Can't support USB host or device features if USB OTG FS is not enabled */
 | 
			
		||||
 | 
			
		||||
#ifndef CONFIG_STM32_OTGFS
 | 
			
		||||
#  undef HAVE_USBDEV
 | 
			
		||||
#  undef HAVE_USBHOST
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* Can't support USB device if USB device is not enabled */
 | 
			
		||||
 | 
			
		||||
#ifndef CONFIG_USBDEV
 | 
			
		||||
#  undef HAVE_USBDEV
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* Can't support USB host is USB host is not enabled */
 | 
			
		||||
 | 
			
		||||
#ifndef CONFIG_USBHOST
 | 
			
		||||
#  undef HAVE_USBHOST
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* Check if we should enable the USB monitor before starting NSH */
 | 
			
		||||
 | 
			
		||||
#ifndef CONFIG_USBMONITOR
 | 
			
		||||
#  undef HAVE_USBMONITOR
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef HAVE_USBDEV
 | 
			
		||||
#  undef CONFIG_USBDEV_TRACE
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef HAVE_USBHOST
 | 
			
		||||
#  undef CONFIG_USBHOST_TRACE
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if !defined(CONFIG_USBDEV_TRACE) && !defined(CONFIG_USBHOST_TRACE)
 | 
			
		||||
#  undef HAVE_USBMONITOR
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* Can't support MMC/SD features if mountpoints are disabled or if SDIO
 | 
			
		||||
 * support is not enabled.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#if defined(CONFIG_DISABLE_MOUNTPOINT) || !defined(CONFIG_STM32_SDIO)
 | 
			
		||||
#  undef HAVE_SDIO
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#undef  SDIO_MINOR     /* Any minor number, default 0 */
 | 
			
		||||
#define SDIO_SLOTNO 0  /* Only one slot */
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_SDIO
 | 
			
		||||
#  if !defined(CONFIG_NSH_MMCSDSLOTNO)
 | 
			
		||||
#    define CONFIG_NSH_MMCSDSLOTNO SDIO_SLOTNO
 | 
			
		||||
#  elif CONFIG_NSH_MMCSDSLOTNO != 0
 | 
			
		||||
#    warning "Only one MMC/SD slot, slot 0"
 | 
			
		||||
#    undef CONFIG_NSH_MMCSDSLOTNO
 | 
			
		||||
#    define CONFIG_NSH_MMCSDSLOTNO SDIO_SLOTNO
 | 
			
		||||
#  endif
 | 
			
		||||
 | 
			
		||||
#  if defined(CONFIG_NSH_MMCSDMINOR)
 | 
			
		||||
#    define SDIO_MINOR CONFIG_NSH_MMCSDMINOR
 | 
			
		||||
#  else
 | 
			
		||||
#    define SDIO_MINOR 0
 | 
			
		||||
#  endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* The CS43L22 depends on the CS43L22 driver, I2C1, and I2S3 support */
 | 
			
		||||
 | 
			
		||||
#if !defined(CONFIG_AUDIO_CS43L22) || !defined(CONFIG_STM32_I2C1) || \
 | 
			
		||||
    !defined(CONFIG_STM32_I2S3)
 | 
			
		||||
#  undef HAVE_CS43L22
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_CS43L22
 | 
			
		||||
  /* The CS43L22 communicates on I2C1, I2C address 0x1a for control
 | 
			
		||||
   * operations
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
#  define CS43L22_I2C_BUS      1
 | 
			
		||||
#  define CS43L22_I2C_ADDRESS  (0x94 >> 1)
 | 
			
		||||
 | 
			
		||||
  /* The CS43L22 transfers data on I2S3 */
 | 
			
		||||
 | 
			
		||||
#  define CS43L22_I2S_BUS      3
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* Check if we can support the RTC driver */
 | 
			
		||||
 | 
			
		||||
#if !defined(CONFIG_RTC) || !defined(CONFIG_RTC_DRIVER)
 | 
			
		||||
#  undef HAVE_RTC_DRIVER
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* NSH Network monitor  */
 | 
			
		||||
 | 
			
		||||
#if !defined(CONFIG_NET) || !defined(CONFIG_STM32_EMACMAC)
 | 
			
		||||
#  undef HAVE_NETMONITOR
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if !defined(CONFIG_NSH_NETINIT_THREAD) || !defined(CONFIG_ARCH_PHY_INTERRUPT) || \
 | 
			
		||||
    !defined(CONFIG_NETDEV_PHY_IOCTL) || !defined(CONFIG_NET_UDP)
 | 
			
		||||
#  undef HAVE_NETMONITOR
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* The NSH Network Monitor cannot be used with the STM32F4DIS-BB base board.
 | 
			
		||||
 * That is because the LAN8720 is configured in REF_CLK OUT mode.  In that
 | 
			
		||||
 * mode, the PHY interrupt is not supported.  The NINT pin serves instead as
 | 
			
		||||
 * REFLCK0.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_STM32F4DISBB
 | 
			
		||||
#  undef HAVE_NETMONITOR
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* procfs File System */
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_FS_PROCFS
 | 
			
		||||
#  ifdef CONFIG_NSH_PROC_MOUNTPOINT
 | 
			
		||||
#    define STM32_PROCFS_MOUNTPOINT CONFIG_NSH_PROC_MOUNTPOINT
 | 
			
		||||
#  else
 | 
			
		||||
#    define STM32_PROCFS_MOUNTPOINT "/proc"
 | 
			
		||||
#  endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* Check if we have the prerequisites for an HCI UART */
 | 
			
		||||
 | 
			
		||||
#if !defined(CONFIG_STM32_HCIUART) || !defined(CONFIG_BLUETOOTH_UART)
 | 
			
		||||
#  undef HAVE_HCIUART
 | 
			
		||||
#elif defined(CONFIG_STM32_USART1_HCIUART)
 | 
			
		||||
#  define HCIUART_SERDEV HCIUART1
 | 
			
		||||
#elif defined(CONFIG_STM32_USART2_HCIUART)
 | 
			
		||||
#  define HCIUART_SERDEV HCIUART2
 | 
			
		||||
#elif defined(CONFIG_STM32_USART3_HCIUART)
 | 
			
		||||
#  define HCIUART_SERDEV HCIUART3
 | 
			
		||||
#elif defined(CONFIG_STM32_USART6_HCIUART)
 | 
			
		||||
#  define HCIUART_SERDEV HCIUART6
 | 
			
		||||
#elif defined(CONFIG_STM32_UART7_HCIUART)
 | 
			
		||||
#  define HCIUART_SERDEV HCIUART7
 | 
			
		||||
#elif defined(CONFIG_STM32_UART8_HCIUART)
 | 
			
		||||
#  define HCIUART_SERDEV HCIUART8
 | 
			
		||||
#else
 | 
			
		||||
#  error No HCI UART specifified
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* STM32F4 Discovery GPIOs **************************************************/
 | 
			
		||||
 | 
			
		||||
/* LEDs */
 | 
			
		||||
 | 
			
		||||
#define GPIO_LED1       (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_50MHz|\
 | 
			
		||||
                         GPIO_OUTPUT_CLEAR|GPIO_PORTD|GPIO_PIN12)
 | 
			
		||||
#define GPIO_LED2       (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_50MHz|\
 | 
			
		||||
                         GPIO_OUTPUT_CLEAR|GPIO_PORTD|GPIO_PIN13)
 | 
			
		||||
#define GPIO_LED3       (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_50MHz|\
 | 
			
		||||
                         GPIO_OUTPUT_CLEAR|GPIO_PORTD|GPIO_PIN14)
 | 
			
		||||
#define GPIO_LED4       (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_50MHz|\
 | 
			
		||||
                         GPIO_OUTPUT_CLEAR|GPIO_PORTD|GPIO_PIN15)
 | 
			
		||||
 | 
			
		||||
/* BUTTONS -- NOTE that all have EXTI interrupts configured */
 | 
			
		||||
 | 
			
		||||
#define MIN_IRQBUTTON   BUTTON_USER
 | 
			
		||||
#define MAX_IRQBUTTON   BUTTON_USER
 | 
			
		||||
#define NUM_IRQBUTTONS  1
 | 
			
		||||
 | 
			
		||||
#define GPIO_BTN_USER   (GPIO_INPUT|GPIO_FLOAT|GPIO_EXTI|GPIO_PORTA|GPIO_PIN0)
 | 
			
		||||
 | 
			
		||||
#define GPIO_CS43L22_RESET  (GPIO_OUTPUT|GPIO_SPEED_50MHz|GPIO_PORTD|GPIO_PIN4)
 | 
			
		||||
 | 
			
		||||
/* LoRa SX127x */
 | 
			
		||||
 | 
			
		||||
#define GPIO_SX127X_DIO0    (GPIO_INPUT|GPIO_FLOAT|GPIO_EXTI|GPIO_PORTD|GPIO_PIN0)
 | 
			
		||||
 | 
			
		||||
#define GPIO_SX127X_RESET   (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_OUTPUT_CLEAR|\
 | 
			
		||||
                             GPIO_SPEED_50MHz|GPIO_PORTD|GPIO_PIN4)
 | 
			
		||||
 | 
			
		||||
/* PWM
 | 
			
		||||
 *
 | 
			
		||||
 * The STM32F4 Discovery has no real on-board PWM devices, but the board can
 | 
			
		||||
 * be configured to output a pulse train using TIM4 CH2 on PD13.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define STM32F4DISCOVERY_PWMTIMER   4
 | 
			
		||||
#define STM32F4DISCOVERY_PWMCHANNEL 2
 | 
			
		||||
 | 
			
		||||
/* SPI chip selects */
 | 
			
		||||
 | 
			
		||||
#define GPIO_CS_MEMS      (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_50MHz|\
 | 
			
		||||
                           GPIO_OUTPUT_SET|GPIO_PORTE|GPIO_PIN3)
 | 
			
		||||
 | 
			
		||||
#define GPIO_MAX31855_CS  (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_50MHz|\
 | 
			
		||||
                           GPIO_OUTPUT_SET|GPIO_PORTD|GPIO_PIN8)
 | 
			
		||||
 | 
			
		||||
#define GPIO_MAX6675_CS   (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_50MHz|\
 | 
			
		||||
                           GPIO_OUTPUT_SET|GPIO_PORTD|GPIO_PIN8)
 | 
			
		||||
 | 
			
		||||
#define GPIO_SX127X_CS    (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_50MHz|\
 | 
			
		||||
                           GPIO_OUTPUT_SET|GPIO_PORTD|GPIO_PIN8)
 | 
			
		||||
 | 
			
		||||
#define GPIO_MAX7219_CS   (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_50MHz|\
 | 
			
		||||
                           GPIO_OUTPUT_SET|GPIO_PORTC|GPIO_PIN3)
 | 
			
		||||
 | 
			
		||||
#define GPIO_GS2200M_CS   (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_50MHz|\
 | 
			
		||||
                           GPIO_OUTPUT_SET|GPIO_PORTE|GPIO_PIN5)
 | 
			
		||||
 | 
			
		||||
#define GPIO_ENC28J60_CS    (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_50MHz|\
 | 
			
		||||
                             GPIO_OUTPUT_SET|GPIO_PORTA|GPIO_PIN4)
 | 
			
		||||
 | 
			
		||||
#define GPIO_ENC28J60_RESET (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_50MHz|\
 | 
			
		||||
                             GPIO_OUTPUT_CLEAR|GPIO_PORTE|GPIO_PIN1)
 | 
			
		||||
 | 
			
		||||
#define GPIO_ENC28J60_INTR  (GPIO_INPUT|GPIO_FLOAT|GPIO_EXTI|\
 | 
			
		||||
                             GPIO_OPENDRAIN|GPIO_PORTE|GPIO_PIN4)
 | 
			
		||||
 | 
			
		||||
/* USB OTG FS
 | 
			
		||||
 *
 | 
			
		||||
 * PA9  OTG_FS_VBUS VBUS sensing (also connected to the green LED)
 | 
			
		||||
 * PC0  OTG_FS_PowerSwitchOn
 | 
			
		||||
 * PD5  OTG_FS_Overcurrent
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define GPIO_OTGFS_VBUS   (GPIO_INPUT|GPIO_FLOAT|GPIO_SPEED_100MHz|\
 | 
			
		||||
                           GPIO_OPENDRAIN|GPIO_PORTA|GPIO_PIN9)
 | 
			
		||||
#define GPIO_OTGFS_PWRON  (GPIO_OUTPUT|GPIO_FLOAT|GPIO_SPEED_100MHz|\
 | 
			
		||||
                           GPIO_PUSHPULL|GPIO_PORTC|GPIO_PIN0)
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_USBHOST
 | 
			
		||||
#  define GPIO_OTGFS_OVER (GPIO_INPUT|GPIO_EXTI|GPIO_FLOAT|\
 | 
			
		||||
                           GPIO_SPEED_100MHz|GPIO_PUSHPULL|\
 | 
			
		||||
                           GPIO_PORTD|GPIO_PIN5)
 | 
			
		||||
#else
 | 
			
		||||
#  define GPIO_OTGFS_OVER (GPIO_INPUT|GPIO_FLOAT|GPIO_SPEED_100MHz|\
 | 
			
		||||
                           GPIO_PUSHPULL|GPIO_PORTD|GPIO_PIN5)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define BOARD_NGPIOIN   0 /* Amount of GPIO Input pins */
 | 
			
		||||
#define BOARD_NGPIOOUT  2 /* Amount of GPIO Output pins */
 | 
			
		||||
#define BOARD_NGPIOINT  0 /* Amount of GPIO Input w/ Interruption pins */
 | 
			
		||||
 | 
			
		||||
#define GPIO_E22_M0    (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_50MHz|\
 | 
			
		||||
                        GPIO_OUTPUT_CLEAR|GPIO_PORTC|GPIO_PIN6)
 | 
			
		||||
 | 
			
		||||
#define GPIO_E22_M1    (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_50MHz|\
 | 
			
		||||
                        GPIO_OUTPUT_CLEAR|GPIO_PORTC|GPIO_PIN7)
 | 
			
		||||
 | 
			
		||||
/* UG-2864AMBAG01 or UG-2864HSWEG01 OLED Display (SPI 4-wire):
 | 
			
		||||
 *
 | 
			
		||||
 * --------------------------+----------------------------------------------
 | 
			
		||||
 * Connector CON10 J1:      | STM32F4Discovery
 | 
			
		||||
 * --------------+-----------+----------------------------------------------
 | 
			
		||||
 * CON10 J1:     | CON20 J2: | P1/P2:
 | 
			
		||||
 * --------------+-----------+----------------------------------------------
 | 
			
		||||
 * 1  3v3        | 3,4 3v3   | P2 3V
 | 
			
		||||
 * 3  /RESET     | 8 /RESET  | P2 PB6 (Arbitrary selection)
 | 
			
		||||
 * 5  /CS        | 7 /CS     | P2 PB7 (Arbitrary selection)
 | 
			
		||||
 * 7  A0|D/C     | 9 A0|D/C  | P2 PB8 (Arbitrary selection)
 | 
			
		||||
 * 9  LED+ (N/C) | -----     | -----
 | 
			
		||||
 * 2  5V Vcc     | 1,2 Vcc   | P2 5V
 | 
			
		||||
 * 4  DI         | 18 D1/SI  | P1 PA7 (GPIO_SPI1_MOSI == GPIO_SPI1_MOSI_1(1))
 | 
			
		||||
 * 6  SCLK       | 19 D0/SCL | P1 PA5 (GPIO_SPI1_SCK == GPIO_SPI1_SCK_1(1))
 | 
			
		||||
 * 8  LED- (N/C) | -----     | ------
 | 
			
		||||
 * 10 GND        | 20 GND    | P2 GND
 | 
			
		||||
 * --------------+-----------+----------------------------------------------
 | 
			
		||||
 * (1) Required because of on-board MEMS
 | 
			
		||||
 * -------------------------------------------------------------------------
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#if defined(CONFIG_LCD_UG2864AMBAG01) || defined(CONFIG_LCD_UG2864HSWEG01) || \
 | 
			
		||||
    defined(CONFIG_LCD_SSD1351)
 | 
			
		||||
#  define GPIO_OLED_RESET (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_50MHz|\
 | 
			
		||||
                           GPIO_OUTPUT_CLEAR|GPIO_PORTB|GPIO_PIN6)
 | 
			
		||||
#  define GPIO_OLED_CS    (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_50MHz|\
 | 
			
		||||
                           GPIO_OUTPUT_SET|GPIO_PORTB|GPIO_PIN7)
 | 
			
		||||
#  define GPIO_OLED_A0    (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_50MHz|\
 | 
			
		||||
                           GPIO_OUTPUT_CLEAR|GPIO_PORTB|GPIO_PIN8)
 | 
			
		||||
#  define GPIO_OLED_DC    GPIO_OLED_A0
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* Display JLX12864G */
 | 
			
		||||
 | 
			
		||||
#define STM32_LCD_RST     (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_50MHz|\
 | 
			
		||||
                           GPIO_OUTPUT_SET|GPIO_PORTB|GPIO_PIN6)
 | 
			
		||||
 | 
			
		||||
#define STM32_LCD_CS      (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_50MHz|\
 | 
			
		||||
                           GPIO_OUTPUT_SET|GPIO_PORTB|GPIO_PIN7)
 | 
			
		||||
 | 
			
		||||
#define STM32_LCD_RS      (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_50MHz|\
 | 
			
		||||
                           GPIO_OUTPUT_SET|GPIO_PORTB|GPIO_PIN8)
 | 
			
		||||
 | 
			
		||||
/* STM32F4DIS-BB MicroSD
 | 
			
		||||
 *
 | 
			
		||||
 * ---------- ------------- ------------------------------
 | 
			
		||||
 * PIO        SIGNAL        Comments
 | 
			
		||||
 * ---------- ------------- ------------------------------
 | 
			
		||||
 * PB15       NCD           Pulled up externally
 | 
			
		||||
 * PC9        DAT1          Configured by driver
 | 
			
		||||
 * PC8        DAT0          "        " "" "    "
 | 
			
		||||
 * PC12       CLK           "        " "" "    "
 | 
			
		||||
 * PD2        CMD           "        " "" "    "
 | 
			
		||||
 * PC11       CD/DAT3       "        " "" "    "
 | 
			
		||||
 * PC10       DAT2          "        " "" "    "
 | 
			
		||||
 * ---------- ------------- ------------------------------
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#if defined(CONFIG_STM32F4DISBB) && defined(CONFIG_STM32_SDIO)
 | 
			
		||||
#  define GPIO_SDIO_NCD   (GPIO_INPUT|GPIO_FLOAT|GPIO_EXTI|\
 | 
			
		||||
                           GPIO_PORTB|GPIO_PIN15)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* STM32F4DIS-BB LAN8720
 | 
			
		||||
 *
 | 
			
		||||
 * ---------- ------------- ------------------------------
 | 
			
		||||
 * PIO        SIGNAL        Comments
 | 
			
		||||
 * ---------- ------------- ------------------------------
 | 
			
		||||
 * PB11       TXEN           Configured by driver
 | 
			
		||||
 * PB12       TXD0          "        " "" "    "
 | 
			
		||||
 * PB13       TXD1          "        " "" "    "
 | 
			
		||||
 * PC4        RXD0/MODE0    "        " "" "    "
 | 
			
		||||
 * PC5        RXD1/MODE1    "        " "" "    "
 | 
			
		||||
 * PA7        CRS_DIV/MODE2 "        " "" "    "
 | 
			
		||||
 * PA2        MDIO          "        " "" "    "
 | 
			
		||||
 * PC1        MDC           "        " "" "    "
 | 
			
		||||
 * PA1        NINT/REFCLK0  "        " "" "    "
 | 
			
		||||
 * PE2        DAT2          "        " "" "    "
 | 
			
		||||
 * ---------- ------------- ------------------------------
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#if defined(CONFIG_STM32F4DISBB) && defined(CONFIG_STM32_ETHMAC)
 | 
			
		||||
#  define GPIO_EMAC_NINT  (GPIO_INPUT|GPIO_PULLUP|GPIO_EXTI|\
 | 
			
		||||
                           GPIO_PORTA|GPIO_PIN1)
 | 
			
		||||
#  define GPIO_EMAC_NRST  (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_50MHz|\
 | 
			
		||||
                           GPIO_OUTPUT_SET|GPIO_PORTE|GPIO_PIN2)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Types
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Data
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifndef __ASSEMBLY__
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Function Prototypes
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: stm32_bringup
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Perform architecture-specific initialization
 | 
			
		||||
 *
 | 
			
		||||
 *   CONFIG_BOARD_LATE_INITIALIZE=y :
 | 
			
		||||
 *     Called from board_late_initialize().
 | 
			
		||||
 *
 | 
			
		||||
 *   CONFIG_BOARD_LATE_INITIALIZE=y && CONFIG_BOARDCTL=y :
 | 
			
		||||
 *     Called from the NSH library
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
int stm32_bringup(void);
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: stm32_spidev_initialize
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Called to configure SPI chip select GPIO pins for the stm32f4discovery
 | 
			
		||||
 *   board.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
void weak_function stm32_spidev_initialize(void);
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: stm32_i2sdev_initialize
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Called to configure I2S chip select GPIO pins for the stm32f4discovery
 | 
			
		||||
 *   board.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
void weak_function stm32_i2sdev_initialize(void);
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: stm32_bh1750initialize
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Called to configure an I2C and to register BH1750FVI for the
 | 
			
		||||
 *   stm32f4discovery board.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_SENSORS_BH1750FVI
 | 
			
		||||
int stm32_bh1750initialize(FAR const char *devpath);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: stm32_lpwaninitialize
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Initialize SX127X LPWAN interaface.
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_LPWAN_SX127X
 | 
			
		||||
int stm32_lpwaninitialize(void);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: stm32_mmcsdinitialize
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Sets up MMC/SD interface.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_MMCSD_SPI
 | 
			
		||||
int stm32_mmcsd_initialize(int port, int minor);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: nunchuck_initialize
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Initialize and register the button joystick driver
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_INPUT_NUNCHUCK
 | 
			
		||||
int nunchuck_initialize(FAR char *devname);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: stm32_max7219init
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Initialize and register the max7219 numeric display controller
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_LEDS_MAX7219
 | 
			
		||||
int stm32_max7219init(FAR const char *devpath);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: stm32_ds1307_init
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Initialize and register the DS1307 RTC
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_RTC_DS1307
 | 
			
		||||
int stm32_ds1307_init(void);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: stm32_st7032init
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Initialize and register the Sitronix ST7032i
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
int stm32_st7032init(FAR const char *devpath);
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: stm32_usbinitialize
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Called from stm32_usbinitialize very early in initialization to setup
 | 
			
		||||
 *   USB-related GPIO pins for the STM32F4Discovery board.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_STM32_OTGFS
 | 
			
		||||
void weak_function stm32_usbinitialize(void);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: stm32_usbhost_initialize
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Called at application startup time to initialize the USB host
 | 
			
		||||
 *   functionality. This function will start a thread that will monitor for
 | 
			
		||||
 *   device connection/disconnection events.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#if defined(CONFIG_STM32_OTGFS) && defined(CONFIG_USBHOST)
 | 
			
		||||
int stm32_usbhost_initialize(void);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: stm32_pwm_setup
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Initialize PWM and register the PWM device.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_PWM
 | 
			
		||||
int stm32_pwm_setup(void);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: stm32_can_setup
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *  Initialize CAN and register the CAN device
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_STM32_CAN_CHARDRIVER
 | 
			
		||||
int stm32_can_setup(void);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: stm32_extmemgpios
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Initialize GPIOs for external memory usage
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_STM32_FSMC
 | 
			
		||||
void stm32_extmemgpios(const uint32_t *gpios, int ngpios);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: stm32_extmemaddr
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Initialize address line GPIOs for external memory access
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_STM32_FSMC
 | 
			
		||||
void stm32_extmemaddr(int naddrs);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: stm32_extmemdata
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Initialize data line GPIOs for external memory access
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_STM32_FSMC
 | 
			
		||||
void stm32_extmemdata(int ndata);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: stm32_led_pminitialize
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Enable logic to use the LEDs on the STM32F4Discovery to support power
 | 
			
		||||
 *   management testing
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_PM
 | 
			
		||||
void stm32_led_pminitialize(void);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: stm32_pm_buttons
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Configure the user button of the STM32f4discovery board as EXTI,
 | 
			
		||||
 *   so it is able to wakeup the MCU from the PM_STANDBY mode
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#if defined(CONFIG_PM) && defined(CONFIG_ARCH_IDLE_CUSTOM) && \
 | 
			
		||||
    defined(CONFIG_PM_BUTTONS)
 | 
			
		||||
void stm32_pm_buttons(void);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: stm32_sdio_initialize
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Initialize SDIO-based MMC/SD card support
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#if !defined(CONFIG_DISABLE_MOUNTPOINT) && defined(CONFIG_STM32_SDIO)
 | 
			
		||||
int stm32_sdio_initialize(void);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: stm32_netinitialize
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Configure board resources to support networking.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_NETMONITOR
 | 
			
		||||
void weak_function stm32_netinitialize(void);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: stm32_zerocross_initialize
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Initialize and register the zero cross driver
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_SENSORS_ZEROCROSS
 | 
			
		||||
int stm32_zerocross_initialize(void);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: stm32_max31855initialize
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Initialize and register the MAX31855 Temperature Sensor driver.
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   devpath - The full path to the driver to register. E.g., "/dev/temp0"
 | 
			
		||||
 *   bus     - Bus number (for hardware that has multiple SPI interfaces)
 | 
			
		||||
 *   devid   - ID associated to the device. E.g., 0, 1, 2, etc.
 | 
			
		||||
 *
 | 
			
		||||
 * Returned Value:
 | 
			
		||||
 *   Zero (OK) on success; a negated errno value on failure.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_SENSORS_MAX31855
 | 
			
		||||
int stm32_max31855initialize(FAR const char *devpath, int bus,
 | 
			
		||||
                             uint16_t devid);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: stm32_mlx90614init
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Called to configure an I2C and to register MLX90614 for the
 | 
			
		||||
 *   stm32f103-minimum board.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_SENSORS_MLX90614
 | 
			
		||||
int stm32_mlx90614init(FAR const char *devpath);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: stm32_max6675initialize
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Initialize and register the max6675 driver
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_SENSORS_MAX6675
 | 
			
		||||
int stm32_max6675initialize(FAR const char *devpath);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: stm32_cs43l22_initialize
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   This function is called by platform-specific, setup logic to configure
 | 
			
		||||
 *   and register the CS43L22 device.  This function will register the
 | 
			
		||||
 *   driver as /dev/cs43l22[x] where x is determined by the minor device
 | 
			
		||||
 *   number.
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   minor - The input device minor number
 | 
			
		||||
 *
 | 
			
		||||
 * Returned Value:
 | 
			
		||||
 *   Zero is returned on success.  Otherwise, a negated errno value is
 | 
			
		||||
 *   returned to indicate the nature of the failure.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_CS43L22
 | 
			
		||||
int stm32_cs43l22_initialize(int minor);
 | 
			
		||||
#endif /* HAVE_CS43L22 */
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: stm32_pca9635_initialize
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   This function is called by board initialization logic to configure the
 | 
			
		||||
 *   LED PWM chip.  This function will register the driver as /dev/leddrv0.
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   None
 | 
			
		||||
 *
 | 
			
		||||
 * Returned Value:
 | 
			
		||||
 *   Zero is returned on success.  Otherwise, a negated errno value is
 | 
			
		||||
 *   returned to indicate the nature of the failure.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_PCA9635PW
 | 
			
		||||
int stm32_pca9635_initialize(void);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: stm32_rgbled_setup
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   This function is called by board initialization logic to configure the
 | 
			
		||||
 *   RGB LED driver.  This function will register the driver as /dev/rgbled0.
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   None
 | 
			
		||||
 *
 | 
			
		||||
 * Returned Value:
 | 
			
		||||
 *   Zero is returned on success.  Otherwise, a negated errno value is
 | 
			
		||||
 *   returned to indicate the nature of the failure.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_RGBLED
 | 
			
		||||
int stm32_rgbled_setup(void);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: stm32_timer_driver_setup
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Configure the timer driver.
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   devpath - The full path to the timer device.  This should be of the
 | 
			
		||||
 *             form /dev/timer0
 | 
			
		||||
 *   timer   - The timer's number.
 | 
			
		||||
 *
 | 
			
		||||
 * Returned Value:
 | 
			
		||||
 *   Zero (OK) is returned on success; A negated errno value is returned
 | 
			
		||||
 *   to indicate the nature of any failure.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_TIMER
 | 
			
		||||
int stm32_timer_driver_setup(FAR const char *devpath, int timer);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: xen1210_archinitialize
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Each board that supports an xen1210 device must provide this function.
 | 
			
		||||
 *   This function is called by application-specific, setup logic to
 | 
			
		||||
 *   configure the accelerometer device.  This function will register the
 | 
			
		||||
 *   driver as /dev/accelN where N is the minor device number.
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   minor   - The input device minor number
 | 
			
		||||
 *
 | 
			
		||||
 * Returned Value:
 | 
			
		||||
 *   Zero is returned on success.  Otherwise, a negated errno value is
 | 
			
		||||
 *   returned to indicate the nature of the failure.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_SENSORS_XEN1210
 | 
			
		||||
int xen1210_archinitialize(int minor);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: hciuart_dev_initialize
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   This function is called by board initialization logic to configure the
 | 
			
		||||
 *   Bluetooth HCI UART driver
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   None
 | 
			
		||||
 *
 | 
			
		||||
 * Returned Value:
 | 
			
		||||
 *   Zero is returned on success.  Otherwise, a negated errno value is
 | 
			
		||||
 *   returned to indicate the nature of the failure.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_HCIUART
 | 
			
		||||
int hciuart_dev_initialize(void);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: stm32_gs2200m_initialize
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Configure the gs2200m driver.
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   devpath - The full path to the device.
 | 
			
		||||
 *   bus     - The SPI bus number
 | 
			
		||||
 *
 | 
			
		||||
 * Returned Value:
 | 
			
		||||
 *   Zero (OK) is returned on success; A negated errno value is returned
 | 
			
		||||
 *   to indicate the nature of any failure.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_WL_GS2200M
 | 
			
		||||
int stm32_gs2200m_initialize(FAR const char *devpath, int bus);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_DEV_GPIO
 | 
			
		||||
int stm32_gpio_initialize(void);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif /* __ASSEMBLY__ */
 | 
			
		||||
#endif /* __BOARDS_ARM_STM32_STM32F4DISCOVERY_SRC_STM32F4DISCOVERY_H */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,614 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * include/nuttx/lib/math.h
 | 
			
		||||
 *
 | 
			
		||||
 * 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 __INCLUDE_NUTTX_LIB_MATH_H
 | 
			
		||||
#define __INCLUDE_NUTTX_LIB_MATH_H
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
/* If CONFIG_ARCH_MATH_H is defined, then the top-level Makefile will copy
 | 
			
		||||
 * this header file to include/math.h where it will become the system math.h
 | 
			
		||||
 * header file.  In this case, the architecture specific code must provide
 | 
			
		||||
 * an arch/<architecture>/include/math.h file which will be included below:
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_ARCH_MATH_H
 | 
			
		||||
#  include <arch/math.h>
 | 
			
		||||
 | 
			
		||||
/* If CONFIG_LIBM is enabled, then the math library at lib/math will be
 | 
			
		||||
 * built.  This library was taken from the math library developed for the
 | 
			
		||||
 * Rhombus OS by Nick Johnson (https://github.com/nickbjohnson4224/rhombus).
 | 
			
		||||
 * The port or the Rhombus math library was contributed by Darcy Gong.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#elif defined(CONFIG_LIBM)
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Copyright (C) 2009-2011 Nick Johnson <nickbjohnson4224 at gmail.com>
 | 
			
		||||
 *
 | 
			
		||||
 * Permission to use, copy, modify, and distribute this software for any
 | 
			
		||||
 * purpose with or without fee is hereby granted, provided that the above
 | 
			
		||||
 * copyright notice and this permission notice appear in all copies.
 | 
			
		||||
 *
 | 
			
		||||
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 | 
			
		||||
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 | 
			
		||||
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 | 
			
		||||
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 | 
			
		||||
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 | 
			
		||||
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 | 
			
		||||
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <nuttx/config.h>
 | 
			
		||||
#include <nuttx/compiler.h>
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Pre-processor Definitions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/* General Constants ********************************************************/
 | 
			
		||||
 | 
			
		||||
#define INFINITY    (1.0/0.0)
 | 
			
		||||
#define NAN         (0.0/0.0)
 | 
			
		||||
#define HUGE_VAL    INFINITY
 | 
			
		||||
 | 
			
		||||
#define INFINITY_F  (1.0F/0.0F)
 | 
			
		||||
#define NAN_F       (0.0F/0.0F)
 | 
			
		||||
 | 
			
		||||
#define isnan(x)    ((x) != (x))
 | 
			
		||||
#define isinf(x)    (((x) == INFINITY) || ((x) == -INFINITY))
 | 
			
		||||
#define isfinite(x) (!(isinf(x) || isnan(x)))
 | 
			
		||||
 | 
			
		||||
#define isinf_f(x)  (((x) == INFINITY_F) || ((x) == -INFINITY_F))
 | 
			
		||||
 | 
			
		||||
/* Exponential and Logarithmic constants ************************************/
 | 
			
		||||
 | 
			
		||||
#define M_E        2.7182818284590452353602874713526625
 | 
			
		||||
#define M_SQRT2    1.4142135623730950488016887242096981
 | 
			
		||||
#define M_SQRT1_2  0.7071067811865475244008443621048490
 | 
			
		||||
#define M_LOG2E    1.4426950408889634073599246810018921
 | 
			
		||||
#define M_LOG10E   0.4342944819032518276511289189166051
 | 
			
		||||
#define M_LN2      0.6931471805599453094172321214581765
 | 
			
		||||
#define M_LN10     2.3025850929940456840179914546843642
 | 
			
		||||
 | 
			
		||||
/* Trigonometric Constants **************************************************/
 | 
			
		||||
 | 
			
		||||
#define M_PI       3.1415926535897932384626433832795029
 | 
			
		||||
#define M_PI_2     1.5707963267948966192313216916397514
 | 
			
		||||
#define M_PI_4     0.7853981633974483096156608458198757
 | 
			
		||||
#define M_1_PI     0.3183098861837906715377675267450287
 | 
			
		||||
#define M_2_PI     0.6366197723675813430755350534900574
 | 
			
		||||
#define M_2_SQRTPI 1.1283791670955125738961589031215452
 | 
			
		||||
 | 
			
		||||
#define M_PI_F     ((float)M_PI)
 | 
			
		||||
#define M_PI_2_F   ((float)M_PI_2)
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Type Declarations
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/* Floating point types */
 | 
			
		||||
 | 
			
		||||
typedef float        float_t;
 | 
			
		||||
#ifndef CONFIG_HAVE_DOUBLE
 | 
			
		||||
typedef float        double_t;
 | 
			
		||||
#else
 | 
			
		||||
typedef double       double_t;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Function Prototypes
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#if defined(__cplusplus)
 | 
			
		||||
extern "C"
 | 
			
		||||
{
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* General Functions ********************************************************/
 | 
			
		||||
 | 
			
		||||
float       ceilf (float x);
 | 
			
		||||
#ifdef CONFIG_HAVE_DOUBLE
 | 
			
		||||
double      ceil  (double x);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CONFIG_HAVE_LONG_DOUBLE
 | 
			
		||||
long double ceill (long double x);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
float       floorf(float x);
 | 
			
		||||
#ifdef CONFIG_HAVE_DOUBLE
 | 
			
		||||
double      floor (double x);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CONFIG_HAVE_LONG_DOUBLE
 | 
			
		||||
long double floorl(long double x);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
float       roundf(float x);
 | 
			
		||||
#ifdef CONFIG_HAVE_DOUBLE
 | 
			
		||||
double      round (double x);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CONFIG_HAVE_LONG_DOUBLE
 | 
			
		||||
long double roundl(long double x);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
long int    lroundf(float x);
 | 
			
		||||
#ifdef CONFIG_HAVE_DOUBLE
 | 
			
		||||
long int    lround(double x);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CONFIG_HAVE_LONG_DOUBLE
 | 
			
		||||
long int    lroundl(long double x);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_HAVE_LONG_LONG
 | 
			
		||||
long long int llroundf(float x);
 | 
			
		||||
#ifdef CONFIG_HAVE_DOUBLE
 | 
			
		||||
long long int llround (double x);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CONFIG_HAVE_LONG_DOUBLE
 | 
			
		||||
long long int llroundl(long double x);
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
float       rintf(float x);      /* Not implemented */
 | 
			
		||||
#ifdef CONFIG_HAVE_DOUBLE
 | 
			
		||||
double      rint(double x);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CONFIG_HAVE_LONG_DOUBLE
 | 
			
		||||
long double rintl(long double x); /* Not implemented */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
long int    lrintf(float x);
 | 
			
		||||
#ifdef CONFIG_HAVE_DOUBLE
 | 
			
		||||
long int    lrint(double x);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CONFIG_HAVE_LONG_DOUBLE
 | 
			
		||||
long int    lrintl(long double x);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_HAVE_LONG_LONG
 | 
			
		||||
long long int llrintf(float x);
 | 
			
		||||
#ifdef CONFIG_HAVE_DOUBLE
 | 
			
		||||
long long int llrint(double x);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CONFIG_HAVE_LONG_DOUBLE
 | 
			
		||||
long long int llrintl(long double x);
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
float       fabsf (float x);
 | 
			
		||||
#ifdef CONFIG_HAVE_DOUBLE
 | 
			
		||||
double      fabs  (double x);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CONFIG_HAVE_LONG_DOUBLE
 | 
			
		||||
long double fabsl (long double x);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
float       modff (float x, float *iptr);
 | 
			
		||||
#ifdef CONFIG_HAVE_DOUBLE
 | 
			
		||||
double      modf  (double x, double *iptr);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CONFIG_HAVE_LONG_DOUBLE
 | 
			
		||||
long double modfl (long double x, long double *iptr);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
float       fmodf (float x, float div);
 | 
			
		||||
#ifdef CONFIG_HAVE_DOUBLE
 | 
			
		||||
double      fmod  (double x, double div);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CONFIG_HAVE_LONG_DOUBLE
 | 
			
		||||
long double fmodl (long double x, long double div);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* Exponential and Logarithmic Functions ************************************/
 | 
			
		||||
 | 
			
		||||
float       powf  (float b, float e);
 | 
			
		||||
#ifdef CONFIG_HAVE_DOUBLE
 | 
			
		||||
double      pow   (double b, double e);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CONFIG_HAVE_LONG_DOUBLE
 | 
			
		||||
long double powl  (long double b, long double e);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
float       expf  (float x);
 | 
			
		||||
float       exp2f (float x);
 | 
			
		||||
float       expm1f(float x);
 | 
			
		||||
#ifdef CONFIG_HAVE_DOUBLE
 | 
			
		||||
double      exp   (double x);
 | 
			
		||||
double      exp2  (double x);
 | 
			
		||||
double      expm1 (double x);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CONFIG_HAVE_LONG_DOUBLE
 | 
			
		||||
long double expl  (long double x);
 | 
			
		||||
long double exp2l (long double x);
 | 
			
		||||
long double expm1l(long double x);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
float       fdimf(float x, float y);
 | 
			
		||||
#ifdef CONFIG_HAVE_DOUBLE
 | 
			
		||||
double      fdim(double x, double y);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CONFIG_HAVE_LONG_DOUBLE
 | 
			
		||||
long double fdiml(long double x, long double y);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
float       fmaf(float x, float y, float z);
 | 
			
		||||
#ifdef CONFIG_HAVE_DOUBLE
 | 
			
		||||
double      fma(double x, double y, double z);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CONFIG_HAVE_LONG_DOUBLE
 | 
			
		||||
long double fmal(long double x, long double y, long double z);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
float       fmaxf(float x, float y);
 | 
			
		||||
#ifdef CONFIG_HAVE_DOUBLE
 | 
			
		||||
double      fmax(double x, double y);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CONFIG_HAVE_LONG_DOUBLE
 | 
			
		||||
long double fmaxl(long double x, long double y);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
float       fminf(float x, float y);
 | 
			
		||||
#ifdef CONFIG_HAVE_DOUBLE
 | 
			
		||||
double      fmin(double x, double y);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CONFIG_HAVE_LONG_DOUBLE
 | 
			
		||||
long double fminl(long double x, long double y);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
float       hypotf(float x, float y);
 | 
			
		||||
#ifdef CONFIG_HAVE_DOUBLE
 | 
			
		||||
double      hypot(double x, double y);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CONFIG_HAVE_LONG_DOUBLE
 | 
			
		||||
long double hypotl(long double x, long double y);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
float       lgammaf(float x);
 | 
			
		||||
#ifdef CONFIG_HAVE_DOUBLE
 | 
			
		||||
double      __cos(double x, double y);
 | 
			
		||||
double      __sin(double x, double y, int iy);
 | 
			
		||||
double      gamma(double x);
 | 
			
		||||
double      lgamma(double x);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CONFIG_HAVE_LONG_DOUBLE
 | 
			
		||||
long double lgammal(long double x);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
float       tgammaf(float x);
 | 
			
		||||
#ifdef CONFIG_HAVE_DOUBLE
 | 
			
		||||
double      tgamma(double x);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CONFIG_HAVE_LONG_DOUBLE
 | 
			
		||||
long double tgammal(long double x);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
float       logf  (float x);
 | 
			
		||||
#ifdef CONFIG_HAVE_DOUBLE
 | 
			
		||||
double      log   (double x);
 | 
			
		||||
#ifdef CONFIG_MUSL_LIBC
 | 
			
		||||
double     log1p(double x);
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CONFIG_HAVE_LONG_DOUBLE
 | 
			
		||||
long double logl  (long double x);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
float       log10f(float x);
 | 
			
		||||
#ifdef CONFIG_HAVE_DOUBLE
 | 
			
		||||
double      log10 (double x);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CONFIG_HAVE_LONG_DOUBLE
 | 
			
		||||
long double log10l(long double x);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
float       log1pf(float x);
 | 
			
		||||
#ifdef CONFIG_HAVE_DOUBLE
 | 
			
		||||
double      log1p (double x);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CONFIG_HAVE_LONG_DOUBLE
 | 
			
		||||
long double log1pl(long double x);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
float       log2f (float x);
 | 
			
		||||
#ifdef CONFIG_HAVE_DOUBLE
 | 
			
		||||
double      log2  (double x);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CONFIG_HAVE_LONG_DOUBLE
 | 
			
		||||
long double log2l (long double x);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
float       logbf (float x);
 | 
			
		||||
#ifdef CONFIG_HAVE_DOUBLE
 | 
			
		||||
double      logb  (double x);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CONFIG_HAVE_LONG_DOUBLE
 | 
			
		||||
long double logbl (long double x);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
int         ilogbf (float x);
 | 
			
		||||
#ifdef CONFIG_HAVE_DOUBLE
 | 
			
		||||
int         ilogb  (double x);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CONFIG_HAVE_LONG_DOUBLE
 | 
			
		||||
int         ilogbl (long double x);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
float       sqrtf (float x);
 | 
			
		||||
#ifdef CONFIG_HAVE_DOUBLE
 | 
			
		||||
double      sqrt  (double x);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CONFIG_HAVE_LONG_DOUBLE
 | 
			
		||||
long double sqrtl (long double x);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
float       ldexpf(float x, int n);
 | 
			
		||||
#ifdef CONFIG_HAVE_DOUBLE
 | 
			
		||||
double      ldexp (double x, int n);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CONFIG_HAVE_LONG_DOUBLE
 | 
			
		||||
long double ldexpl(long double x, int n);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
float       frexpf(float x, int *exp);
 | 
			
		||||
#ifdef CONFIG_HAVE_DOUBLE
 | 
			
		||||
double      frexp (double x, int *exp);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CONFIG_HAVE_LONG_DOUBLE
 | 
			
		||||
long double frexpl(long double x, int *exp);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* Trigonometric Functions **************************************************/
 | 
			
		||||
 | 
			
		||||
float       sinf  (float x);
 | 
			
		||||
#ifdef CONFIG_HAVE_DOUBLE
 | 
			
		||||
double      sin   (double x);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CONFIG_HAVE_LONG_DOUBLE
 | 
			
		||||
long double sinl  (long double x);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
float       cosf  (float x);
 | 
			
		||||
#ifdef CONFIG_HAVE_DOUBLE
 | 
			
		||||
double      cos   (double x);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CONFIG_HAVE_LONG_DOUBLE
 | 
			
		||||
long double cosl  (long double x);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
float       tanf  (float x);
 | 
			
		||||
#ifdef CONFIG_HAVE_DOUBLE
 | 
			
		||||
double      tan   (double x);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CONFIG_HAVE_LONG_DOUBLE
 | 
			
		||||
long double tanl  (long double x);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
float       asinf (float x);
 | 
			
		||||
#ifdef CONFIG_HAVE_DOUBLE
 | 
			
		||||
double      asin  (double x);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CONFIG_HAVE_LONG_DOUBLE
 | 
			
		||||
long double asinl (long double x);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
float       acosf (float x);
 | 
			
		||||
#ifdef CONFIG_HAVE_DOUBLE
 | 
			
		||||
double      acos  (double x);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CONFIG_HAVE_LONG_DOUBLE
 | 
			
		||||
long double acosl (long double x);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
float       atanf (float x);
 | 
			
		||||
#ifdef CONFIG_HAVE_DOUBLE
 | 
			
		||||
double      atan  (double x);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CONFIG_HAVE_LONG_DOUBLE
 | 
			
		||||
long double atanl (long double x);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
float       atan2f(float y, float x);
 | 
			
		||||
#ifdef CONFIG_HAVE_DOUBLE
 | 
			
		||||
double      atan2 (double y, double x);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CONFIG_HAVE_LONG_DOUBLE
 | 
			
		||||
long double atan2l(long double y, long double x);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
float       sinhf (float x);
 | 
			
		||||
#ifdef CONFIG_HAVE_DOUBLE
 | 
			
		||||
double      sinh  (double x);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CONFIG_HAVE_LONG_DOUBLE
 | 
			
		||||
long double sinhl (long double x);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
float       coshf (float x);
 | 
			
		||||
#ifdef CONFIG_HAVE_DOUBLE
 | 
			
		||||
double      cosh  (double x);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CONFIG_HAVE_LONG_DOUBLE
 | 
			
		||||
long double coshl (long double x);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
float       cbrtf (float x);
 | 
			
		||||
#ifdef CONFIG_HAVE_DOUBLE
 | 
			
		||||
double      cbrt  (double x);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CONFIG_HAVE_LONG_DOUBLE
 | 
			
		||||
long double cbrtl (long double x);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
float       tanhf (float x);
 | 
			
		||||
#ifdef CONFIG_HAVE_DOUBLE
 | 
			
		||||
double      tanh  (double x);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CONFIG_HAVE_LONG_DOUBLE
 | 
			
		||||
long double tanhl (long double x);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
float       asinhf (float x);
 | 
			
		||||
#ifdef CONFIG_HAVE_DOUBLE
 | 
			
		||||
double      asinh  (double x);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CONFIG_HAVE_LONG_DOUBLE
 | 
			
		||||
long double asinhl (long double x);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
float       acoshf (float x);
 | 
			
		||||
#ifdef CONFIG_HAVE_DOUBLE
 | 
			
		||||
double      acosh  (double x);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CONFIG_HAVE_LONG_DOUBLE
 | 
			
		||||
long double acoshl (long double x);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
float       atanhf (float x);
 | 
			
		||||
#ifdef CONFIG_HAVE_DOUBLE
 | 
			
		||||
double      atanh  (double x);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CONFIG_HAVE_LONG_DOUBLE
 | 
			
		||||
long double atanhl (long double x);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
float       erff (float x);
 | 
			
		||||
float       erfcf(float x);
 | 
			
		||||
#ifdef CONFIG_HAVE_DOUBLE
 | 
			
		||||
double      erf  (double x);
 | 
			
		||||
double      erfc(double x);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CONFIG_HAVE_LONG_DOUBLE
 | 
			
		||||
long double erfl (long double x);
 | 
			
		||||
long double erfcl(long double x);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
float       copysignf (float x, float y);
 | 
			
		||||
#ifdef CONFIG_HAVE_DOUBLE
 | 
			
		||||
double      copysign  (double x, double y);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CONFIG_HAVE_LONG_DOUBLE
 | 
			
		||||
long double copysignl (long double x, long double y);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
float       truncf (float x);
 | 
			
		||||
#ifdef CONFIG_HAVE_DOUBLE
 | 
			
		||||
double      trunc (double x);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CONFIG_HAVE_LONG_DOUBLE
 | 
			
		||||
long double truncl (long double x);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
float       nanf(const char *tagp);
 | 
			
		||||
#ifdef CONFIG_HAVE_DOUBLE
 | 
			
		||||
double      nan(const char *tagp);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CONFIG_HAVE_LONG_DOUBLE
 | 
			
		||||
long double nanl(const char *tagp);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
float       nearbyintf(float x);
 | 
			
		||||
#ifdef CONFIG_HAVE_DOUBLE
 | 
			
		||||
double      nearbyint(double x);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CONFIG_HAVE_LONG_DOUBLE
 | 
			
		||||
long double nearbyintl(long double x);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
float       nextafterf(float x, float y);
 | 
			
		||||
#ifdef CONFIG_HAVE_DOUBLE
 | 
			
		||||
double      nextafter(double x, double y);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CONFIG_HAVE_LONG_DOUBLE
 | 
			
		||||
long double nextafterl(long double x, long double y);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
float       nexttowardf(float x, long double y);
 | 
			
		||||
#ifdef CONFIG_HAVE_DOUBLE
 | 
			
		||||
double      nexttoward(double x, long double y);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CONFIG_HAVE_LONG_DOUBLE
 | 
			
		||||
long double nexttowardl(long double x, long double y);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
float       remainderf(float x, float y);
 | 
			
		||||
#ifdef CONFIG_HAVE_DOUBLE
 | 
			
		||||
double      remainder(double x, double y);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CONFIG_HAVE_LONG_DOUBLE
 | 
			
		||||
long double remainderl(long double x, long double y);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
float       remquof(float x, float y, int *quo);
 | 
			
		||||
#ifdef CONFIG_HAVE_DOUBLE
 | 
			
		||||
double      remquo(double x, double y, int *quo);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CONFIG_HAVE_LONG_DOUBLE
 | 
			
		||||
long double remquol(long double x, long double y, int *quo);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
float       scalblnf(float x, long int n);
 | 
			
		||||
#ifdef CONFIG_HAVE_DOUBLE
 | 
			
		||||
double      scalbln(double x, long int n);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CONFIG_HAVE_LONG_DOUBLE
 | 
			
		||||
long double scalblnl(long double x, long int n);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
float       scalbnf(float x, int n);
 | 
			
		||||
#ifdef CONFIG_HAVE_DOUBLE
 | 
			
		||||
double      scalbn(double x, int n);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CONFIG_HAVE_LONG_DOUBLE
 | 
			
		||||
long double scalbnl(long double x, int n);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define FP_INFINITE     0
 | 
			
		||||
#define FP_NAN          1
 | 
			
		||||
#define FP_NORMAL       2
 | 
			
		||||
#define FP_SUBNORMAL    3
 | 
			
		||||
#define FP_ZERO         4
 | 
			
		||||
#define fpclassify(x) \
 | 
			
		||||
    __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, FP_SUBNORMAL, \
 | 
			
		||||
                         FP_ZERO, x)
 | 
			
		||||
 | 
			
		||||
#define isunordered(x, y)    __builtin_isunordered(x, y)
 | 
			
		||||
#define isgreater(x, y)      __builtin_isgreater(x, y)
 | 
			
		||||
#define isgreaterequal(x, y) __builtin_isgreaterequal(x, y)
 | 
			
		||||
#define isless(x, y)         __builtin_isless(x, y)
 | 
			
		||||
#define islessequal(x, y)    __builtin_islessequal(x, y)
 | 
			
		||||
#define islessgreater(x, y)  __builtin_islessgreater(x, y)
 | 
			
		||||
#define isnormal(x)          __builtin_isnormal(x)
 | 
			
		||||
#define signbit(x)           __builtin_signbit(x)
 | 
			
		||||
 | 
			
		||||
#if defined(__cplusplus)
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif /* CONFIG_LIBM */
 | 
			
		||||
#endif /* __INCLUDE_NUTTX_LIB_MATH_H */
 | 
			
		||||
							
								
								
									
										2
									
								
								Ubiquitous/Nuttx_Fusion_XiUOS/app_match_nuttx/nuttx/libs/libc-musl/.gitignore
								
								
								
									vendored
								
								
									Normal file
								
							
							
						
						
									
										2
									
								
								Ubiquitous/Nuttx_Fusion_XiUOS/app_match_nuttx/nuttx/libs/libc-musl/.gitignore
								
								
								
									vendored
								
								
									Normal file
								
							| 
						 | 
				
			
			@ -0,0 +1,2 @@
 | 
			
		|||
/exec_symtab.c
 | 
			
		||||
/modlib_symtab.c
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,202 @@
 | 
			
		|||
############################################################################
 | 
			
		||||
# libs/libc-musl/Makefile
 | 
			
		||||
#
 | 
			
		||||
# 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 $(TOPDIR)/Make.defs
 | 
			
		||||
 | 
			
		||||
include aio/Make.defs
 | 
			
		||||
include assert/Make.defs
 | 
			
		||||
include audio/Make.defs
 | 
			
		||||
include builtin/Make.defs
 | 
			
		||||
include ctype/Make.defs
 | 
			
		||||
include dirent/Make.defs
 | 
			
		||||
include dlfcn/Make.defs
 | 
			
		||||
include endian/Make.defs
 | 
			
		||||
include errno/Make.defs
 | 
			
		||||
include eventfd/Make.defs
 | 
			
		||||
include fixedmath/Make.defs
 | 
			
		||||
include grp/Make.defs
 | 
			
		||||
include hex2bin/Make.defs
 | 
			
		||||
include inttypes/Make.defs
 | 
			
		||||
include libgen/Make.defs
 | 
			
		||||
include locale/Make.defs
 | 
			
		||||
include lzf/Make.defs
 | 
			
		||||
include machine/Make.defs
 | 
			
		||||
include math/Make.defs
 | 
			
		||||
include misc/Make.defs
 | 
			
		||||
include modlib/Make.defs
 | 
			
		||||
include net/Make.defs
 | 
			
		||||
include netdb/Make.defs
 | 
			
		||||
include pthread/Make.defs
 | 
			
		||||
include pwd/Make.defs
 | 
			
		||||
include queue/Make.defs
 | 
			
		||||
include sched/Make.defs
 | 
			
		||||
include semaphore/Make.defs
 | 
			
		||||
include signal/Make.defs
 | 
			
		||||
include spawn/Make.defs
 | 
			
		||||
include stdio/Make.defs
 | 
			
		||||
include stdlib/Make.defs
 | 
			
		||||
include stream/Make.defs
 | 
			
		||||
include string/Make.defs
 | 
			
		||||
include symtab/Make.defs
 | 
			
		||||
include syslog/Make.defs
 | 
			
		||||
include termios/Make.defs
 | 
			
		||||
include time/Make.defs
 | 
			
		||||
include tls/Make.defs
 | 
			
		||||
include uio/Make.defs
 | 
			
		||||
include unistd/Make.defs
 | 
			
		||||
include userfs/Make.defs
 | 
			
		||||
include uuid/Make.defs
 | 
			
		||||
include wchar/Make.defs
 | 
			
		||||
include wctype/Make.defs
 | 
			
		||||
include wqueue/Make.defs
 | 
			
		||||
 | 
			
		||||
CFLAGS += ${shell $(INCDIR) "$(CC)" $(TOPDIR)$(DELIM)libs$(DELIM)libc-musl}
 | 
			
		||||
 | 
			
		||||
# Rule for the symbol table generation
 | 
			
		||||
 | 
			
		||||
MKSYMTAB = $(TOPDIR)$(DELIM)tools$(DELIM)mksymtab$(HOSTEXEEXT)
 | 
			
		||||
 | 
			
		||||
$(MKSYMTAB):
 | 
			
		||||
	$(Q) $(MAKE) -C $(TOPDIR)$(DELIM)tools -f Makefile.host mksymtab
 | 
			
		||||
 | 
			
		||||
# C library and math library symbols should be available in the FLAT
 | 
			
		||||
# and PROTECTED builds.  KERNEL builds are separately linked and so should
 | 
			
		||||
# not need symbol tables.
 | 
			
		||||
 | 
			
		||||
CSVFILES  = $(TOPDIR)$(DELIM)libs$(DELIM)libc-musl$(DELIM)libc-musl.csv
 | 
			
		||||
CSVFILES += $(TOPDIR)$(DELIM)libs$(DELIM)libc-musl$(DELIM)math.csv
 | 
			
		||||
 | 
			
		||||
# In the PROTECTED and KERNEL builds, the applications could link with
 | 
			
		||||
# libproxy which will provide symbol-compatible access to OS functions
 | 
			
		||||
# via a call gate, but the applications which link with these functions
 | 
			
		||||
# directly could remove the repeat proxy code to save the space.
 | 
			
		||||
 | 
			
		||||
CSVFILES += $(TOPDIR)$(DELIM)syscall$(DELIM)syscall.csv
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_EXECFUNCS_SYSTEM_SYMTAB),y)
 | 
			
		||||
 | 
			
		||||
exec_symtab.c : $(CSVFILES) $(MKSYMTAB)
 | 
			
		||||
	$(Q) cat $(CSVFILES) | LC_ALL=C sort >$@.csv
 | 
			
		||||
	$(Q) $(MKSYMTAB) $@.csv $@ $(CONFIG_EXECFUNCS_SYMTAB_ARRAY) $(CONFIG_EXECFUNCS_NSYMBOLS_VAR)
 | 
			
		||||
	$(Q) rm -f $@.csv
 | 
			
		||||
 | 
			
		||||
CSRCS += exec_symtab.c
 | 
			
		||||
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_MODLIB_SYSTEM_SYMTAB),y)
 | 
			
		||||
 | 
			
		||||
modlib_sys_symtab.c : $(CSVFILES) $(MKSYMTAB)
 | 
			
		||||
	$(Q) cat $(CSVFILES) | LC_ALL=C sort >$@.csv
 | 
			
		||||
	$(Q) $(MKSYMTAB) $@.csv $@ $(CONFIG_MODLIB_SYMTAB_ARRAY) $(CONFIG_MODLIB_NSYMBOLS_VAR)
 | 
			
		||||
	$(Q) rm -f $@.csv
 | 
			
		||||
 | 
			
		||||
CSRCS += modlib_sys_symtab.c
 | 
			
		||||
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
BINDIR ?= bin
 | 
			
		||||
 | 
			
		||||
AOBJS = $(patsubst %.S, $(BINDIR)$(DELIM)%$(OBJEXT), $(ASRCS))
 | 
			
		||||
COBJS = $(patsubst %.c, $(BINDIR)$(DELIM)%$(OBJEXT), $(CSRCS))
 | 
			
		||||
 | 
			
		||||
SRCS = $(ASRCS) $(CSRCS)
 | 
			
		||||
OBJS = $(AOBJS) $(COBJS)
 | 
			
		||||
 | 
			
		||||
KBIN = libkc$(LIBEXT)
 | 
			
		||||
BIN ?= libc-musl$(LIBEXT)
 | 
			
		||||
 | 
			
		||||
all: $(BIN)
 | 
			
		||||
.PHONY: clean distclean
 | 
			
		||||
 | 
			
		||||
$(AOBJS): $(BINDIR)$(DELIM)%$(OBJEXT): %.S
 | 
			
		||||
	$(call ASSEMBLE, $<, $@)
 | 
			
		||||
 | 
			
		||||
$(COBJS): $(BINDIR)$(DELIM)%$(OBJEXT): %.c
 | 
			
		||||
	$(call COMPILE, $<, $@)
 | 
			
		||||
 | 
			
		||||
# C library for the flat build and
 | 
			
		||||
# the user phase of the two-pass kernel build
 | 
			
		||||
 | 
			
		||||
$(BIN): $(OBJS)
 | 
			
		||||
	$(call ARCHIVE, $@, $(OBJS))
 | 
			
		||||
ifeq ($(CONFIG_LIBC_ZONEINFO_ROMFS),y)
 | 
			
		||||
	$(Q) $(MAKE) -C zoneinfo all BIN=$(BIN)
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
# C library for the kernel phase of the two-pass kernel build
 | 
			
		||||
 | 
			
		||||
ifneq ($(BIN),$(KBIN))
 | 
			
		||||
$(KBIN):
 | 
			
		||||
	$(Q) $(MAKE) $(KBIN) BIN=$(KBIN) BINDIR=kbin EXTRAFLAGS="$(EXTRAFLAGS)"
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
# Context
 | 
			
		||||
 | 
			
		||||
context::
 | 
			
		||||
ifeq ($(CONFIG_LIBC_ZONEINFO_ROMFS),y)
 | 
			
		||||
	$(Q) $(MAKE) -C zoneinfo context BIN=$(BIN)
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
# Dependencies
 | 
			
		||||
 | 
			
		||||
makedepfile: $(CSRCS:.c=.ddc) $(ASRCS:.S=.dds)
 | 
			
		||||
	$(call CATFILE, bin/Make.dep, $^)
 | 
			
		||||
	$(call DELFILE, $^)
 | 
			
		||||
 | 
			
		||||
makekdepfile: $(CSRCS:.c=.ddc) $(ASRCS:.S=.dds)
 | 
			
		||||
	$(call CATFILE, kbin/Make.dep, $^)
 | 
			
		||||
	$(call DELFILE, $^)
 | 
			
		||||
 | 
			
		||||
.depend: Makefile $(SRCS) $(TOPDIR)$(DELIM).config
 | 
			
		||||
	$(Q) $(MAKE) makedepfile OBJPATH="bin"
 | 
			
		||||
ifneq ($(CONFIG_BUILD_FLAT),y)
 | 
			
		||||
	$(Q) $(MAKE) makekdepfile CFLAGS="$(CFLAGS) $(KDEFINE)" OBJPATH="kbin"
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(CONFIG_LIBC_ZONEINFO_ROMFS),y)
 | 
			
		||||
	$(Q) $(MAKE) -C zoneinfo depend BIN=$(BIN)
 | 
			
		||||
endif
 | 
			
		||||
	$(Q) touch $@
 | 
			
		||||
 | 
			
		||||
depend:: .depend
 | 
			
		||||
 | 
			
		||||
# Clean most derived files, retaining the configuration
 | 
			
		||||
 | 
			
		||||
clean::
 | 
			
		||||
	$(Q) $(MAKE) -C bin  clean
 | 
			
		||||
	$(Q) $(MAKE) -C kbin clean
 | 
			
		||||
	$(Q) $(MAKE) -C zoneinfo clean BIN=$(BIN)
 | 
			
		||||
	$(call DELFILE, $(BIN))
 | 
			
		||||
	$(call DELFILE, $(KBIN))
 | 
			
		||||
	$(call CLEAN)
 | 
			
		||||
 | 
			
		||||
# Deep clean -- removes all traces of the configuration
 | 
			
		||||
 | 
			
		||||
distclean:: clean
 | 
			
		||||
	$(Q) $(MAKE) -C bin  distclean
 | 
			
		||||
	$(Q) $(MAKE) -C kbin distclean
 | 
			
		||||
	$(Q) $(MAKE) -C zoneinfo distclean BIN=$(BIN)
 | 
			
		||||
	$(call DELFILE, exec_symtab.c)
 | 
			
		||||
	$(call DELFILE, bin/Make.dep)
 | 
			
		||||
	$(call DELFILE, kbin/Make.dep)
 | 
			
		||||
	$(call DELFILE, .depend)
 | 
			
		||||
 | 
			
		||||
-include bin/Make.dep
 | 
			
		||||
-include kbin/Make.dep
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,143 @@
 | 
			
		|||
lib
 | 
			
		||||
===
 | 
			
		||||
 | 
			
		||||
This directory contains numerous, small functions typically associated with
 | 
			
		||||
what you would expect to find in a standard C library.  The sub-directories
 | 
			
		||||
in this directory contain standard interface that can be executed by user-
 | 
			
		||||
mode programs.
 | 
			
		||||
 | 
			
		||||
Normally, NuttX is built with no protection and all threads running in kerne-
 | 
			
		||||
mode.  In that model, there is no real architectural distinction between
 | 
			
		||||
what is a kernel-mode program and what is a user-mode program; the system is
 | 
			
		||||
more like on multi-threaded program that all runs in kernel-mode.
 | 
			
		||||
 | 
			
		||||
But if the CONFIG_BUILD_PROTECTED option is selected, NuttX will be built
 | 
			
		||||
into distinct user-mode and kernel-mode sections.  In that case, most of the
 | 
			
		||||
code in the nuttx/ directory will run in kernel-mode with exceptions
 | 
			
		||||
of (1) the user-mode "proxies" found in syscall/proxies, and (2) the
 | 
			
		||||
standard C library functions found in this directory.  In this build model,
 | 
			
		||||
it is critical to separate the user-mode OS interfaces in this way.
 | 
			
		||||
 | 
			
		||||
If CONFIG_BUILD_KERNEL is selected, then only a NuttX kernel will be built
 | 
			
		||||
with no applications.
 | 
			
		||||
 | 
			
		||||
Sub-Directories
 | 
			
		||||
===============
 | 
			
		||||
 | 
			
		||||
The files in the libs/libc-musl/ directory are organized (mostly) according which file
 | 
			
		||||
in the include/ directory provides the prototype for library functions.  So
 | 
			
		||||
we have:
 | 
			
		||||
 | 
			
		||||
  audio     - This part of the audio system: nuttx/audio/audio.h
 | 
			
		||||
  builtin   - Support for builtin applications.  Used by nuttx/binfmt and NSH.
 | 
			
		||||
  dlfcn     - dlfcn.h
 | 
			
		||||
  endian    - endian.h
 | 
			
		||||
  errno     - errno.h
 | 
			
		||||
  hex2bin   - hex2bin.h
 | 
			
		||||
  libgen    - libgen.h
 | 
			
		||||
  locale    - locale.h
 | 
			
		||||
  lzf       - lzf.h
 | 
			
		||||
  fixedmath - fixedmath.h
 | 
			
		||||
  grp       - grp.h
 | 
			
		||||
  inttypes  - inttypes.h
 | 
			
		||||
  machine   - Various architecture-specific implementations.
 | 
			
		||||
  math      - math.h
 | 
			
		||||
  modlib    - Part of module and shared library logic: nuttx/lib/modlib.h
 | 
			
		||||
  net       - Various network-related header files: netinet/ether.h, arpa/inet.h
 | 
			
		||||
  pthread   - pthread.h
 | 
			
		||||
  pwd       - pwd.h
 | 
			
		||||
  queue     - queue.h
 | 
			
		||||
  sched     - sched.h
 | 
			
		||||
  semaphore - semaphore.h
 | 
			
		||||
  stdio     - stdio.h
 | 
			
		||||
  stdlib    - stdlib.h
 | 
			
		||||
  string    - string.h (and legacy strings.h and non-standard nuttx/b2c.h)
 | 
			
		||||
  time      - time.h
 | 
			
		||||
  uio       - sys/uio.h
 | 
			
		||||
  unistd    - unistd.h
 | 
			
		||||
  wchar     - wchar.h
 | 
			
		||||
  wctype    - wctype.h
 | 
			
		||||
 | 
			
		||||
Most of these are "standard" header files; some are not: hex2bin.h and
 | 
			
		||||
fixemath.h are non-standard.
 | 
			
		||||
 | 
			
		||||
There is also a misc/ subdirectory that contains various internal functions
 | 
			
		||||
and interfaces from header files that are too few to warrant their own sub-
 | 
			
		||||
directory:
 | 
			
		||||
 | 
			
		||||
  misc      - Nonstandard "glue" logic, debug.h, crc32.h, dirent.h
 | 
			
		||||
 | 
			
		||||
Library Database
 | 
			
		||||
================
 | 
			
		||||
 | 
			
		||||
Information about functions available in the NuttX C library information is
 | 
			
		||||
maintained in a database.  That "database" is implemented as a simple comma-
 | 
			
		||||
separated-value file, libc-musl.csv.  Most spreadsheets programs will accept this
 | 
			
		||||
format and can be used to maintain the library database.
 | 
			
		||||
 | 
			
		||||
This library database will (eventually) be used to generate symbol library
 | 
			
		||||
symbol table information that can be exported to external applications.
 | 
			
		||||
 | 
			
		||||
The format of the CSV file for each line is:
 | 
			
		||||
 | 
			
		||||
  Field 1: Function name
 | 
			
		||||
  Field 2: The header file that contains the function prototype
 | 
			
		||||
  Field 3: Condition for compilation
 | 
			
		||||
  Field 4: The type of function return value.
 | 
			
		||||
  Field 5 - N+5: The type of each of the N formal parameters of the function
 | 
			
		||||
 | 
			
		||||
Each type field has a format as follows:
 | 
			
		||||
 | 
			
		||||
  type name:
 | 
			
		||||
        For all simpler types
 | 
			
		||||
  formal type | actual type:
 | 
			
		||||
        For array types where the form of the formal (eg. int parm[2])
 | 
			
		||||
        differs from the type of actual passed parameter (eg. int*).  This
 | 
			
		||||
        is necessary because you cannot do simple casts to array types.
 | 
			
		||||
  formal type | union member actual type | union member fieldname:
 | 
			
		||||
        A similar situation exists for unions.  For example, the formal
 | 
			
		||||
        parameter type union sigval -- You cannot cast a uintptr_t to
 | 
			
		||||
        a union sigval, but you can cast to the type of one of the union
 | 
			
		||||
        member types when passing the actual parameter.  Similarly, we
 | 
			
		||||
        cannot cast a union sigval to a uinptr_t either.  Rather, we need
 | 
			
		||||
        to cast a specific union member fieldname to uintptr_t.
 | 
			
		||||
 | 
			
		||||
NOTE: The tool mksymtab can be used to generate a symbol table from this CSV
 | 
			
		||||
file.  See nuttx/tools/README.txt for further details about the use of mksymtab.
 | 
			
		||||
 | 
			
		||||
symtab
 | 
			
		||||
======
 | 
			
		||||
 | 
			
		||||
Symbol Tables and Build Modes
 | 
			
		||||
-----------------------------
 | 
			
		||||
This directory provide support for a symbol table which provides all/most of
 | 
			
		||||
system and C library services/functions to the application and NSH.
 | 
			
		||||
 | 
			
		||||
Symbol tables have differing usefulness in different NuttX build modes:
 | 
			
		||||
 | 
			
		||||
  1. In the FLAT build (CONFIG_BUILD_FLAT), symbol tables are used to bind
 | 
			
		||||
     addresses in loaded ELF or NxFLAT modules to base code that usually
 | 
			
		||||
     resides in FLASH memory.  Both OS interfaces and user/application
 | 
			
		||||
     libraries are made available to the loaded module via symbol tables.
 | 
			
		||||
 | 
			
		||||
  2. Symbol tables may be of value in a protected build
 | 
			
		||||
     (CONFIG_BUILD_PROTECTED) where the newly started user task must
 | 
			
		||||
     share resources with other user code (but should use system calls to
 | 
			
		||||
     interact with the OS).
 | 
			
		||||
 | 
			
		||||
  3. But in the kernel build mode (CONFIG_BUILD_LOADABLE), only fully linked
 | 
			
		||||
     executables loadable via execl(), execv(), or posix_spawan() can used.
 | 
			
		||||
     There is no use for a symbol table with the kernel build since all
 | 
			
		||||
     memory resources are separate; nothing is share-able with the newly
 | 
			
		||||
     started process.
 | 
			
		||||
 | 
			
		||||
Code/Text Size Implications
 | 
			
		||||
---------------------------
 | 
			
		||||
The option can have substantial effect on system image size, mainly
 | 
			
		||||
code/text.  That is because the instructions to generate symtab.inc
 | 
			
		||||
above will cause EVERY interface in the NuttX RTOS and the C library to be
 | 
			
		||||
included into build.  Add to that the size of a huge symbol table.
 | 
			
		||||
 | 
			
		||||
In order to reduce the code/text size, you may want to manually prune the
 | 
			
		||||
auto-generated symtab.inc file to remove all interfaces that you do
 | 
			
		||||
not wish to include into the base FLASH image.
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,31 @@
 | 
			
		|||
############################################################################
 | 
			
		||||
# libs/libc-musl/aio/Make.defs
 | 
			
		||||
#
 | 
			
		||||
# 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.
 | 
			
		||||
#
 | 
			
		||||
############################################################################
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_FS_AIO),y)
 | 
			
		||||
 | 
			
		||||
# Add the asynchronous I/O C files to the build
 | 
			
		||||
 | 
			
		||||
CSRCS += aio_error.c aio_return.c aio_suspend.c lio_listio.c
 | 
			
		||||
 | 
			
		||||
# Add the asynchronous I/O directory to the build
 | 
			
		||||
 | 
			
		||||
DEPPATH += --dep-path aio
 | 
			
		||||
VPATH += :aio
 | 
			
		||||
endif
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,72 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * libs/libc-musl/aio/aio.h
 | 
			
		||||
 *
 | 
			
		||||
 * 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.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
* @file aio.h
 | 
			
		||||
* @brief nuttx source code
 | 
			
		||||
*        https://github.com/apache/incubator-nuttx.git
 | 
			
		||||
* @version 10.3.0 
 | 
			
		||||
* @author AIIT XUOS Lab
 | 
			
		||||
* @date 2022-08-04
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef __LIBS_LIBC_AIO_AIO_H
 | 
			
		||||
#define __LIBS_LIBC_AIO_AIO_H
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_FS_AIO
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Pre-processor Definitions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Types
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Data
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#undef EXTERN
 | 
			
		||||
#if defined(__cplusplus)
 | 
			
		||||
#define EXTERN extern "C"
 | 
			
		||||
extern "C"
 | 
			
		||||
{
 | 
			
		||||
#else
 | 
			
		||||
#define EXTERN extern
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Function Prototypes
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#undef EXTERN
 | 
			
		||||
#if defined(__cplusplus)
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif /* CONFIG_FS_AIO */
 | 
			
		||||
#endif /* __LIBS_LIBC_AIO_AIO_H */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,109 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * libs/libc-musl/aio/aio_error.c
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed to the Apache Software Foundation (ASF) under one or more
 | 
			
		||||
 * contributor license agreements.  See the NOTICE file distributed with
 | 
			
		||||
 * this work for additional information regarding copyright ownership.  The
 | 
			
		||||
 * ASF licenses this file to you under the Apache License, Version 2.0 (the
 | 
			
		||||
 * "License"); you may not use this file except in compliance with the
 | 
			
		||||
 * License.  You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *   http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 | 
			
		||||
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
 | 
			
		||||
 * License for the specific language governing permissions and limitations
 | 
			
		||||
 * under the License.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
* @file aio_error.c
 | 
			
		||||
* @brief nuttx source code
 | 
			
		||||
*        https://github.com/apache/incubator-nuttx.git
 | 
			
		||||
* @version 10.3.0 
 | 
			
		||||
* @author AIIT XUOS Lab
 | 
			
		||||
* @date 2022-08-04
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <aio.h>
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_FS_AIO
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Pre-processor Definitions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/* Configuration ************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Private Types
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Private Data
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Data
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Private Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: aio_error
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   The aio_error() function returns the error status associated with the
 | 
			
		||||
 *   aiocb structure referenced by the aiocbp argument. The error status fo
 | 
			
		||||
 *   an asynchronous I/O operation is the errno value that would be set by
 | 
			
		||||
 *   the corresponding read(), write(), fdatasync(), or fsync() operation. If
 | 
			
		||||
 *   the operation has not yet completed, then the error status will be equal
 | 
			
		||||
 *   to EINPROGRESS.
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   aiocbp - A pointer to an instance of struct aiocb
 | 
			
		||||
 *
 | 
			
		||||
 * Returned Value:
 | 
			
		||||
 *   If the asynchronous I/O operation has completed successfully, then 0
 | 
			
		||||
 *   will be returned. If the asynchronous operation has completed
 | 
			
		||||
 *   unsuccessfully, then the error status, as described for read(),
 | 
			
		||||
 *   write(), fdatasync(), and fsync(), will be returned. If the
 | 
			
		||||
 *   asynchronous I/O operation has not yet completed, then EINPROGRESS will
 | 
			
		||||
 *   be returned.
 | 
			
		||||
 *
 | 
			
		||||
 *   The aio_error() function may fail if:
 | 
			
		||||
 *
 | 
			
		||||
 *     EINVAL - The aiocbp argument does not refer to an asynchronous
 | 
			
		||||
 *       operation whose return status has not yet been retrieved.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
int aio_error(FAR const struct aiocb *aiocbp)
 | 
			
		||||
{
 | 
			
		||||
  DEBUGASSERT(aiocbp);
 | 
			
		||||
 | 
			
		||||
  if (aiocbp->aio_result < 0)
 | 
			
		||||
    {
 | 
			
		||||
      return -aiocbp->aio_result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif /* CONFIG_FS_AIO */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,113 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * libs/libc-musl/aio/aio_return.c
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed to the Apache Software Foundation (ASF) under one or more
 | 
			
		||||
 * contributor license agreements.  See the NOTICE file distributed with
 | 
			
		||||
 * this work for additional information regarding copyright ownership.  The
 | 
			
		||||
 * ASF licenses this file to you under the Apache License, Version 2.0 (the
 | 
			
		||||
 * "License"); you may not use this file except in compliance with the
 | 
			
		||||
 * License.  You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *   http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 | 
			
		||||
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
 | 
			
		||||
 * License for the specific language governing permissions and limitations
 | 
			
		||||
 * under the License.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
* @file aio_return.c
 | 
			
		||||
* @brief nuttx source code
 | 
			
		||||
*        https://github.com/apache/incubator-nuttx.git
 | 
			
		||||
* @version 10.3.0 
 | 
			
		||||
* @author AIIT XUOS Lab
 | 
			
		||||
* @date 2022-08-04
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <aio.h>
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_FS_AIO
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Pre-processor Definitions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/* Configuration ************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Private Types
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Private Data
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Data
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Private Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: aio_return
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   The aio_return() function returns the return status associated with
 | 
			
		||||
 *   the aiocb structure referenced by the aiocbp argument. The return
 | 
			
		||||
 *   status for an asynchronous I/O operation is the value that would be
 | 
			
		||||
 *   returned by the corresponding read(), write(), or fsync() function
 | 
			
		||||
 *   call. If the error status for the operation is equal to EINPROGRESS,
 | 
			
		||||
 *   then the return status for the operation is undefined. The aio_return()
 | 
			
		||||
 *   function may be called exactly once to retrieve the return status of
 | 
			
		||||
 *   a given asynchronous operation; thereafter, if the same aiocb structure
 | 
			
		||||
 *   is used in a call to aio_return() or aio_error(), an error may be
 | 
			
		||||
 *   returned. When the aiocb structure referred to by aiocbp is used to
 | 
			
		||||
 *   submit another asynchronous operation, then aio_return() may be
 | 
			
		||||
 *   successfully used to retrieve the return status of that operation.
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   aiocbp - A pointer to an instance of struct aiocb
 | 
			
		||||
 *
 | 
			
		||||
 * Returned Value:
 | 
			
		||||
 *   If the asynchronous I/O operation has completed, then the return
 | 
			
		||||
 *   status, as described for read(), write(), and fsync(), will be
 | 
			
		||||
 *   returned. If the asynchronous I/O operation has not yet completed,
 | 
			
		||||
 *   the results of aio_return() are undefined.
 | 
			
		||||
 *
 | 
			
		||||
 *    The aio_return() function may fail if:
 | 
			
		||||
 *
 | 
			
		||||
 *    EINVAL - The aiocbp argument does not refer to an asynchronous
 | 
			
		||||
 *      operation whose return status has not yet been retrieved.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
ssize_t aio_return(FAR struct aiocb *aiocbp)
 | 
			
		||||
{
 | 
			
		||||
  DEBUGASSERT(aiocbp);
 | 
			
		||||
  if (aiocbp->aio_result < 0)
 | 
			
		||||
    {
 | 
			
		||||
      set_errno((int)-aiocbp->aio_result);
 | 
			
		||||
      return (ssize_t)ERROR;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return aiocbp->aio_result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif /* CONFIG_FS_AIO */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,142 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * libs/libc-musl/aio/aio_suspend.c
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed to the Apache Software Foundation (ASF) under one or more
 | 
			
		||||
 * contributor license agreements.  See the NOTICE file distributed with
 | 
			
		||||
 * this work for additional information regarding copyright ownership.  The
 | 
			
		||||
 * ASF licenses this file to you under the Apache License, Version 2.0 (the
 | 
			
		||||
 * "License"); you may not use this file except in compliance with the
 | 
			
		||||
 * License.  You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *   http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 | 
			
		||||
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
 | 
			
		||||
 * License for the specific language governing permissions and limitations
 | 
			
		||||
 * under the License.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
* @file aio_suspend.c
 | 
			
		||||
* @brief nuttx source code
 | 
			
		||||
*        https://github.com/apache/incubator-nuttx.git
 | 
			
		||||
* @version 10.3.0 
 | 
			
		||||
* @author AIIT XUOS Lab
 | 
			
		||||
* @date 2022-08-04
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <sched.h>
 | 
			
		||||
#include <signal.h>
 | 
			
		||||
#include <aio.h>
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_FS_AIO
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: aio_suspend
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   The aio_suspend() function suspends the calling thread until at least
 | 
			
		||||
 *   one of the asynchronous I/O operations referenced by the 'list' argument
 | 
			
		||||
 *   has completed, until a signal interrupts the function, or, if 'timeout'
 | 
			
		||||
 *   is not NULL, until the time interval specified by 'timeout' has passed.
 | 
			
		||||
 *   If any of the aiocb structures in the list correspond to completed
 | 
			
		||||
 *   asynchronous I/O operations (that is, the error status for the
 | 
			
		||||
 *   operation is not equal to EINPROGRESS) at the time of the call, the
 | 
			
		||||
 *   function returns without suspending the calling thread.
 | 
			
		||||
 *
 | 
			
		||||
 *   Each aiocb structure pointed to must have been used in initiating an
 | 
			
		||||
 *   asynchronous I/O request via aio_read(), aio_write(), or lio_listio().
 | 
			
		||||
 *   This array may contain NULL pointers, which are ignored. If this
 | 
			
		||||
 *   array contains pointers that refer to aiocb structures that have not
 | 
			
		||||
 *   been used in submitting asynchronous I/O, the effect is undefined.
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   list    - An array of pointers to asynchronous I/O control blocks.
 | 
			
		||||
 *   nent    - The number of elements in the array.
 | 
			
		||||
 *   aiocbp  - A pointer to an array
 | 
			
		||||
 *   timeout - If not NULL, this parameter is pointer to a timespec
 | 
			
		||||
 *             structure that determines a timeout on the operation.  If
 | 
			
		||||
 *             the time referred to timeout passes before any of the I/O
 | 
			
		||||
 *             operations referenced by list are completed, then
 | 
			
		||||
 *             aio_suspend() returns with an error.
 | 
			
		||||
 *
 | 
			
		||||
 * Returned Value:
 | 
			
		||||
 *   If the aio_suspend() function returns after one or more asynchronous
 | 
			
		||||
 *   I/O operations have completed, the function returns zero. Otherwise,
 | 
			
		||||
 *   the function returns a value of -1 and sets errno to indicate the
 | 
			
		||||
 *   error.  The application may determine which asynchronous I/O completed
 | 
			
		||||
 *   by scanning the associated error and return status using aio_error()
 | 
			
		||||
 *   and aio_return(), respectively.
 | 
			
		||||
 *
 | 
			
		||||
 *   The aio_suspend() function will fail if:
 | 
			
		||||
 *
 | 
			
		||||
 *     EAGAIN - No asynchronous I/O indicated in the list referenced by
 | 
			
		||||
 *              list completed in the time interval indicated by timeout.
 | 
			
		||||
 *     EINTR  - A signal interrupted the aio_suspend() function.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
int aio_suspend(FAR const struct aiocb * const list[], int nent,
 | 
			
		||||
                FAR const struct timespec *timeout)
 | 
			
		||||
{
 | 
			
		||||
  sigset_t set;
 | 
			
		||||
  int ret;
 | 
			
		||||
  int i;
 | 
			
		||||
 | 
			
		||||
  DEBUGASSERT(list);
 | 
			
		||||
 | 
			
		||||
  /* Lock the scheduler so that no I/O events can complete on the worker
 | 
			
		||||
   * thread until we set our wait set up.  Pre-emption will, of course, be
 | 
			
		||||
   * re-enabled while we are waiting for the signal.
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  sched_lock();
 | 
			
		||||
 | 
			
		||||
  /* Check each entry in the list.  Break out of the loop if any entry
 | 
			
		||||
   * has completed.
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  for (i = 0; i < nent; i++)
 | 
			
		||||
    {
 | 
			
		||||
      /* Check if the I/O has completed */
 | 
			
		||||
 | 
			
		||||
      if (list[i] && list[i]->aio_result != -EINPROGRESS)
 | 
			
		||||
        {
 | 
			
		||||
          /* Yes, return success */
 | 
			
		||||
 | 
			
		||||
          sched_unlock();
 | 
			
		||||
          return OK;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* Then wait for SIGPOLL.  On success sigtimedwait() will return the
 | 
			
		||||
   * signal number that cause the error (SIGPOLL).  It will set errno
 | 
			
		||||
   * appropriately for this function on errors.
 | 
			
		||||
   *
 | 
			
		||||
   * NOTE: If completion of the I/O causes other signals to be generated
 | 
			
		||||
   * first, then this will wake up and return EINTR instead of success.
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  sigemptyset(&set);
 | 
			
		||||
  sigaddset(&set, SIGPOLL);
 | 
			
		||||
 | 
			
		||||
  ret = sigtimedwait(&set, NULL, timeout);
 | 
			
		||||
  sched_unlock();
 | 
			
		||||
  return ret >= 0 ? OK : ERROR;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif /* CONFIG_FS_AIO */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,705 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * libs/libc-musl/aio/lio_listio.c
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed to the Apache Software Foundation (ASF) under one or more
 | 
			
		||||
 * contributor license agreements.  See the NOTICE file distributed with
 | 
			
		||||
 * this work for additional information regarding copyright ownership.  The
 | 
			
		||||
 * ASF licenses this file to you under the Apache License, Version 2.0 (the
 | 
			
		||||
 * "License"); you may not use this file except in compliance with the
 | 
			
		||||
 * License.  You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *   http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 | 
			
		||||
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
 | 
			
		||||
 * License for the specific language governing permissions and limitations
 | 
			
		||||
 * under the License.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
* @file lio_listio.c
 | 
			
		||||
* @brief nuttx source code
 | 
			
		||||
*        https://github.com/apache/incubator-nuttx.git
 | 
			
		||||
* @version 10.3.0 
 | 
			
		||||
* @author AIIT XUOS Lab
 | 
			
		||||
* @date 2022-08-04
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
#include <signal.h>
 | 
			
		||||
#include <aio.h>
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <debug.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
 | 
			
		||||
#include <nuttx/signal.h>
 | 
			
		||||
 | 
			
		||||
#include "libc-musl.h"
 | 
			
		||||
#include "aio/aio.h"
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_FS_AIO
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Private Types
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
struct lio_sighand_s
 | 
			
		||||
{
 | 
			
		||||
  FAR struct aiocb * const *list;  /* List of I/O operations */
 | 
			
		||||
  FAR struct sigevent sig;         /* Describes how to signal the caller */
 | 
			
		||||
  int nent;                        /* Number or elements in list[] */
 | 
			
		||||
  pid_t pid;                       /* ID of client */
 | 
			
		||||
  sigset_t oprocmask;              /* sigprocmask to restore */
 | 
			
		||||
  struct sigaction oact;           /* Signal handler to restore */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Private Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: lio_checkio
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *  Check if all I/O operations in the list are complete.
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   list - The list of I/O operations to be performed
 | 
			
		||||
 *   nent - The number of elements in the list
 | 
			
		||||
 *
 | 
			
		||||
 * Returned Value:
 | 
			
		||||
 *  Zero (OK) is returned if all I/O completed successfully.
 | 
			
		||||
 *  -EINPROGRESS is returned if one or more I/Os have not yet completed.
 | 
			
		||||
 *  The negated errno value if first error noted in the case where all I/O
 | 
			
		||||
 *  completed but one or more I/Os completed with an error.
 | 
			
		||||
 *
 | 
			
		||||
 * Assumptions:
 | 
			
		||||
 *  The scheduler is locked and no I/O can complete asynchronously with
 | 
			
		||||
 *  the logic in this function.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
static int lio_checkio(FAR struct aiocb * const *list, int nent)
 | 
			
		||||
{
 | 
			
		||||
  FAR struct aiocb *aiocbp;
 | 
			
		||||
  int ret;
 | 
			
		||||
  int i;
 | 
			
		||||
 | 
			
		||||
  ret = OK; /* Assume success */
 | 
			
		||||
 | 
			
		||||
  /* Check each entry in the list.  Break out of the loop if any entry
 | 
			
		||||
   * has not completed.
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  for (i = 0; i < nent; i++)
 | 
			
		||||
    {
 | 
			
		||||
      /* Skip over NULL entries */
 | 
			
		||||
 | 
			
		||||
      aiocbp = list[i];
 | 
			
		||||
      if (aiocbp)
 | 
			
		||||
        {
 | 
			
		||||
          /* Check if the I/O has completed */
 | 
			
		||||
 | 
			
		||||
          if (aiocbp->aio_result == -EINPROGRESS)
 | 
			
		||||
            {
 | 
			
		||||
              /* No.. return -EINPROGRESS */
 | 
			
		||||
 | 
			
		||||
              return -EINPROGRESS;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
          /* Check for an I/O error */
 | 
			
		||||
 | 
			
		||||
          else if (aiocbp->aio_result < 0 && ret == OK)
 | 
			
		||||
            {
 | 
			
		||||
              /* Some other error other than -EINPROGRESS */
 | 
			
		||||
 | 
			
		||||
              ret = aiocbp->aio_result;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* All of the I/Os have completed */
 | 
			
		||||
 | 
			
		||||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: lio_sighandler
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Handle the SIGPOLL signal.
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   signo   - The number of the signal that we caught (SIGPOLL)
 | 
			
		||||
 *   info    - Information accompanying the signal
 | 
			
		||||
 *   context - Not used in NuttX
 | 
			
		||||
 *
 | 
			
		||||
 * Returned Value:
 | 
			
		||||
 *  None
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
static void lio_sighandler(int signo, siginfo_t *info, void *ucontext)
 | 
			
		||||
{
 | 
			
		||||
  FAR struct aiocb *aiocbp;
 | 
			
		||||
  FAR struct lio_sighand_s *sighand;
 | 
			
		||||
  int ret;
 | 
			
		||||
 | 
			
		||||
  DEBUGASSERT(signo == SIGPOLL && info);
 | 
			
		||||
 | 
			
		||||
  /* The info structure should contain a pointer to the AIO control block */
 | 
			
		||||
 | 
			
		||||
  aiocbp = (FAR struct aiocb *)info->si_value.sival_ptr;
 | 
			
		||||
  DEBUGASSERT(aiocbp && aiocbp->aio_result != -EINPROGRESS);
 | 
			
		||||
 | 
			
		||||
  /* Recover our private data from the AIO control block */
 | 
			
		||||
 | 
			
		||||
  sighand = (FAR struct lio_sighand_s *)aiocbp->aio_priv;
 | 
			
		||||
  DEBUGASSERT(sighand && sighand->list);
 | 
			
		||||
  aiocbp->aio_priv = NULL;
 | 
			
		||||
 | 
			
		||||
  /* Prevent any asynchronous I/O completions while the signal handler runs */
 | 
			
		||||
 | 
			
		||||
  sched_lock();
 | 
			
		||||
 | 
			
		||||
  /* Check if all of the pending I/O has completed */
 | 
			
		||||
 | 
			
		||||
  ret = lio_checkio(sighand->list, sighand->nent);
 | 
			
		||||
  if (ret != -EINPROGRESS)
 | 
			
		||||
    {
 | 
			
		||||
      /* All pending I/O has completed */
 | 
			
		||||
 | 
			
		||||
      /* Restore the signal handler */
 | 
			
		||||
 | 
			
		||||
      sigaction(SIGPOLL, &sighand->oact, NULL);
 | 
			
		||||
 | 
			
		||||
      /* Restore the sigprocmask */
 | 
			
		||||
 | 
			
		||||
      sigprocmask(SIG_SETMASK, &sighand->oprocmask, NULL);
 | 
			
		||||
 | 
			
		||||
      /* Signal the client */
 | 
			
		||||
 | 
			
		||||
      DEBUGVERIFY(nxsig_notification(sighand->pid, &sighand->sig,
 | 
			
		||||
                                     SI_ASYNCIO, &aiocbp->aio_sigwork));
 | 
			
		||||
 | 
			
		||||
      /* And free the container */
 | 
			
		||||
 | 
			
		||||
      lib_free(sighand);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  sched_unlock();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: lio_sigsetup
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Setup a signal handler to detect when until all I/O completes.
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   list - The list of I/O operations to be performed
 | 
			
		||||
 *   nent - The number of elements in the list
 | 
			
		||||
 *
 | 
			
		||||
 * Returned Value:
 | 
			
		||||
 *  Zero (OK) is returned if all I/O completed successfully; Otherwise, a
 | 
			
		||||
 *  negated errno value is returned corresponding to the first error
 | 
			
		||||
 *  detected.
 | 
			
		||||
 *
 | 
			
		||||
 * Assumptions:
 | 
			
		||||
 *  The scheduler is locked and no I/O can complete asynchronously with
 | 
			
		||||
 *  the logic in this function.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
static int lio_sigsetup(FAR struct aiocb * const *list, int nent,
 | 
			
		||||
                        FAR struct sigevent *sig)
 | 
			
		||||
{
 | 
			
		||||
  FAR struct aiocb *aiocbp;
 | 
			
		||||
  FAR struct lio_sighand_s *sighand;
 | 
			
		||||
  sigset_t set;
 | 
			
		||||
  struct sigaction act;
 | 
			
		||||
  int status;
 | 
			
		||||
  int i;
 | 
			
		||||
 | 
			
		||||
  /* Allocate a structure to pass data to the signal handler */
 | 
			
		||||
 | 
			
		||||
  sighand = lib_zalloc(sizeof(struct lio_sighand_s));
 | 
			
		||||
  if (!sighand)
 | 
			
		||||
    {
 | 
			
		||||
      ferr("ERROR: lib_zalloc failed\n");
 | 
			
		||||
      return -ENOMEM;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* Initialize the allocated structure */
 | 
			
		||||
 | 
			
		||||
  sighand->list = list;
 | 
			
		||||
  sighand->sig  = *sig;
 | 
			
		||||
  sighand->nent = nent;
 | 
			
		||||
  sighand->pid  = getpid();
 | 
			
		||||
 | 
			
		||||
  /* Save this structure as the private data attached to each aiocb */
 | 
			
		||||
 | 
			
		||||
  for (i = 0; i < nent; i++)
 | 
			
		||||
    {
 | 
			
		||||
      /* Skip over NULL entries in the list */
 | 
			
		||||
 | 
			
		||||
      aiocbp = list[i];
 | 
			
		||||
      if (aiocbp)
 | 
			
		||||
        {
 | 
			
		||||
          FAR void *priv = NULL;
 | 
			
		||||
 | 
			
		||||
          /* Check if I/O is pending for  this entry */
 | 
			
		||||
 | 
			
		||||
          if (aiocbp->aio_result == -EINPROGRESS)
 | 
			
		||||
            {
 | 
			
		||||
              priv = (FAR void *)sighand;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
          aiocbp->aio_priv = priv;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* Make sure that SIGPOLL is not blocked */
 | 
			
		||||
 | 
			
		||||
  sigemptyset(&set);
 | 
			
		||||
  sigaddset(&set, SIGPOLL);
 | 
			
		||||
  status = sigprocmask(SIG_UNBLOCK, &set, &sighand->oprocmask);
 | 
			
		||||
  if (status != OK)
 | 
			
		||||
    {
 | 
			
		||||
      int errcode = get_errno();
 | 
			
		||||
      ferr("ERROR sigprocmask failed: %d\n", errcode);
 | 
			
		||||
      DEBUGASSERT(errcode > 0);
 | 
			
		||||
      return -errcode;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* Attach our signal handler */
 | 
			
		||||
 | 
			
		||||
  finfo("Registering signal handler\n");
 | 
			
		||||
 | 
			
		||||
  act.sa_sigaction = lio_sighandler;
 | 
			
		||||
  act.sa_flags = SA_SIGINFO;
 | 
			
		||||
 | 
			
		||||
  sigfillset(&act.sa_mask);
 | 
			
		||||
  sigdelset(&act.sa_mask, SIGPOLL);
 | 
			
		||||
 | 
			
		||||
  status = sigaction(SIGPOLL, &act, &sighand->oact);
 | 
			
		||||
  if (status != OK)
 | 
			
		||||
    {
 | 
			
		||||
      int errcode = get_errno();
 | 
			
		||||
 | 
			
		||||
      ferr("ERROR sigaction failed: %d\n", errcode);
 | 
			
		||||
 | 
			
		||||
      DEBUGASSERT(errcode > 0);
 | 
			
		||||
      return -errcode;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: lio_waitall
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *  Wait for all I/O operations in the list to be complete.
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   list - The list of I/O operations to be performed
 | 
			
		||||
 *   nent - The number of elements in the list
 | 
			
		||||
 *
 | 
			
		||||
 * Returned Value:
 | 
			
		||||
 *  Zero (OK) is returned if all I/O completed successfully; Otherwise, a
 | 
			
		||||
 *  negated errno value is returned corresponding to the first error
 | 
			
		||||
 *  detected.
 | 
			
		||||
 *
 | 
			
		||||
 * Assumptions:
 | 
			
		||||
 *  The scheduler is locked and no I/O can complete asynchronously with
 | 
			
		||||
 *  the logic in this function.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
static int lio_waitall(FAR struct aiocb * const *list, int nent)
 | 
			
		||||
{
 | 
			
		||||
  sigset_t set;
 | 
			
		||||
  int ret;
 | 
			
		||||
 | 
			
		||||
  /* Loop until all I/O completes */
 | 
			
		||||
 | 
			
		||||
  for (; ; )
 | 
			
		||||
    {
 | 
			
		||||
      /* Check if all I/O has completed */
 | 
			
		||||
 | 
			
		||||
      ret = lio_checkio(list, nent);
 | 
			
		||||
      if (ret != -EINPROGRESS)
 | 
			
		||||
        {
 | 
			
		||||
          /* All I/O has completed.. We are finished.  */
 | 
			
		||||
 | 
			
		||||
          return ret;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      /* Then wait for SIGPOLL -- indefinitely.
 | 
			
		||||
       *
 | 
			
		||||
       * NOTE: If completion of the I/O causes other signals to be generated
 | 
			
		||||
       * first, then this will wake up and return EINTR instead of success.
 | 
			
		||||
       */
 | 
			
		||||
 | 
			
		||||
      sigemptyset(&set);
 | 
			
		||||
      sigaddset(&set, SIGPOLL);
 | 
			
		||||
 | 
			
		||||
      ret = sigwaitinfo(&set, NULL);
 | 
			
		||||
      if (ret < 0)
 | 
			
		||||
        {
 | 
			
		||||
          int errcode = get_errno();
 | 
			
		||||
 | 
			
		||||
          /* The most likely reason that we would get here is because some
 | 
			
		||||
           * unrelated signal has been received.
 | 
			
		||||
           */
 | 
			
		||||
 | 
			
		||||
          ferr("ERROR: sigwaitinfo failed: %d\n", errcode);
 | 
			
		||||
          DEBUGASSERT(errcode > 0);
 | 
			
		||||
          return -errcode;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: lio_listio
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   The lio_listio() function initiates a list of I/O requests with a
 | 
			
		||||
 *   single function call.
 | 
			
		||||
 *
 | 
			
		||||
 *   The 'mode' argument takes one of the values LIO_WAIT or LIO_NOWAIT
 | 
			
		||||
 *   declared in <aio.h> and determines whether the function returns when
 | 
			
		||||
 *   the I/O operations have been completed, or as soon as the operations
 | 
			
		||||
 *   have been queued. If the 'mode' argument is LIO_WAIT, the function will
 | 
			
		||||
 *   wait until all I/O is complete and the 'sig' argument will be ignored.
 | 
			
		||||
 *
 | 
			
		||||
 *   If the 'mode' argument is LIO_NOWAIT, the function will return
 | 
			
		||||
 *   immediately, and asynchronous notification will occur, according to the
 | 
			
		||||
 *   'sig' argument, when all the I/O operations complete. If 'sig' is NULL,
 | 
			
		||||
 *   then no asynchronous notification will occur. If 'sig' is not NULL,
 | 
			
		||||
 *   asynchronous notification occurs when all the requests in 'list' have
 | 
			
		||||
 *   completed.
 | 
			
		||||
 *
 | 
			
		||||
 *   The I/O requests enumerated by 'list' are submitted in an unspecified
 | 
			
		||||
 *   order.
 | 
			
		||||
 *
 | 
			
		||||
 *   The 'list' argument is an array of pointers to aiocb structures. The
 | 
			
		||||
 *   array contains 'nent 'elements. The array may contain NULL elements,
 | 
			
		||||
 *   which will be ignored.
 | 
			
		||||
 *
 | 
			
		||||
 *   If the buffer pointed to by 'list' or the aiocb structures pointed to
 | 
			
		||||
 *   by the elements of the array 'list' become illegal addresses before all
 | 
			
		||||
 *   asynchronous I/O completed and, if necessary, the notification is
 | 
			
		||||
 *   sent, then the behavior is undefined. If the buffers pointed to by the
 | 
			
		||||
 *   aio_buf member of the aiocb structure pointed to by the elements of
 | 
			
		||||
 *   the array 'list' become illegal addresses prior to the asynchronous
 | 
			
		||||
 *   I/O associated with that aiocb structure being completed, the behavior
 | 
			
		||||
 *   is undefined.
 | 
			
		||||
 *
 | 
			
		||||
 *   The aio_lio_opcode field of each aiocb structure specifies the
 | 
			
		||||
 *   operation to be performed. The supported operations are LIO_READ,
 | 
			
		||||
 *   LIO_WRITE, and LIO_NOP; these symbols are defined in <aio.h>. The
 | 
			
		||||
 *   LIO_NOP operation causes the list entry to be ignored. If the
 | 
			
		||||
 *   aio_lio_opcode element is equal to LIO_READ, then an I/O operation is
 | 
			
		||||
 *   submitted as if by a call to aio_read() with the aiocbp equal to the
 | 
			
		||||
 *   address of the aiocb structure. If the aio_lio_opcode element is equal
 | 
			
		||||
 *   to LIO_WRITE, then an I/O operation is submitted as if by a call to
 | 
			
		||||
 *   aio_write() with the aiocbp equal to the address of the aiocb
 | 
			
		||||
 *   structure.
 | 
			
		||||
 *
 | 
			
		||||
 *   The aio_fildes member specifies the file descriptor on which the
 | 
			
		||||
 *   operation is to be performed.
 | 
			
		||||
 *
 | 
			
		||||
 *   The aio_buf member specifies the address of the buffer to or from which
 | 
			
		||||
 *   the data is transferred.
 | 
			
		||||
 *
 | 
			
		||||
 *   The aio_nbytes member specifies the number of bytes of data to be
 | 
			
		||||
 *   transferred.
 | 
			
		||||
 *
 | 
			
		||||
 *   The members of the aiocb structure further describe the I/O operation
 | 
			
		||||
 *   to be performed, in a manner identical to that of the corresponding
 | 
			
		||||
 *   aiocb structure when used by the aio_read() and aio_write() functions.
 | 
			
		||||
 *
 | 
			
		||||
 *   The 'nent' argument specifies how many elements are members of the list;
 | 
			
		||||
 *   that is, the length of the array.
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   mode - Either LIO_WAIT or LIO_NOWAIT
 | 
			
		||||
 *   list - The list of I/O operations to be performed
 | 
			
		||||
 *   nent - The number of elements in the list
 | 
			
		||||
 *   sig  - Used to notify the caller when the I/O is performed
 | 
			
		||||
 *          asynchronously.
 | 
			
		||||
 *
 | 
			
		||||
 * Returned Value:
 | 
			
		||||
 *   If the mode argument has the value LIO_NOWAIT, the lio_listio()
 | 
			
		||||
 *   function will return the value zero if the I/O operations are
 | 
			
		||||
 *   successfully queued; otherwise, the function will return the value
 | 
			
		||||
 *   -1 and set errno to indicate the error.
 | 
			
		||||
 *
 | 
			
		||||
 *   If the mode argument has the value LIO_WAIT, the lio_listio() function
 | 
			
		||||
 *   will return the value zero when all the indicated I/O has completed
 | 
			
		||||
 *   successfully. Otherwise, lio_listio() will return a value of -1 and
 | 
			
		||||
 *   set errno to indicate the error.
 | 
			
		||||
 *
 | 
			
		||||
 *   In either case, the return value only indicates the success or failure
 | 
			
		||||
 *   of the lio_listio() call itself, not the status of the individual I/O
 | 
			
		||||
 *   requests. In some cases one or more of the I/O requests contained in
 | 
			
		||||
 *   the list may fail. Failure of an individual request does not prevent
 | 
			
		||||
 *   completion of any other individual request. To determine the outcome
 | 
			
		||||
 *   of each I/O request, the application must examine the error status
 | 
			
		||||
 *   associated with each aiocb control block. The error statuses so
 | 
			
		||||
 *   returned are identical to those returned as the result of an aio_read()
 | 
			
		||||
 *   or aio_write() function.
 | 
			
		||||
 *
 | 
			
		||||
 *   The lio_listio() function will fail if:
 | 
			
		||||
 *
 | 
			
		||||
 *     EAGAIN - The resources necessary to queue all the I/O requests were
 | 
			
		||||
 *       not available. The application may check the error status for each
 | 
			
		||||
 *       aiocb to determine the individual request(s) that failed.
 | 
			
		||||
 *     EAGAIN - The number of entries indicated by 'nent' would cause the
 | 
			
		||||
 *       system-wide limit {AIO_MAX} to be exceeded.
 | 
			
		||||
 *     EINVAL - The mode argument is not a proper value, or the value of
 | 
			
		||||
 *       'nent' was greater than {AIO_LISTIO_MAX}.
 | 
			
		||||
 *     EINTR - A signal was delivered while waiting for all I/O requests to
 | 
			
		||||
 *       complete during an LIO_WAIT operation. Note that, since each I/O
 | 
			
		||||
 *       operation invoked by lio_listio() may possibly provoke a signal when
 | 
			
		||||
 *       it completes, this error return may be caused by the completion of
 | 
			
		||||
 *       one (or more) of the very I/O operations being awaited. Outstanding
 | 
			
		||||
 *       I/O requests are not cancelled, and the application will examine
 | 
			
		||||
 *       each list element to determine whether the request was initiated,
 | 
			
		||||
 *       cancelled, or completed.
 | 
			
		||||
 *     EIO - One or more of the individual I/O operations failed. The
 | 
			
		||||
 *       application may check the error status for each aiocb structure to
 | 
			
		||||
 *       determine the individual request(s) that failed.
 | 
			
		||||
 *
 | 
			
		||||
 *   In addition to the errors returned by the lio_listio() function, if the
 | 
			
		||||
 *   lio_listio() function succeeds or fails with errors of EAGAIN, EINTR, or
 | 
			
		||||
 *   EIO, then some of the I/O specified by the list may have been initiated.
 | 
			
		||||
 *   If the lio_listio() function fails with an error code other than EAGAIN,
 | 
			
		||||
 *   EINTR, or EIO, no operations from the list will have been initiated. The
 | 
			
		||||
 *   I/O operation indicated by each list element can encounter errors
 | 
			
		||||
 *   specific to the individual read or write function being performed. In
 | 
			
		||||
 *   this event, the error status for each aiocb control block contains the
 | 
			
		||||
 *   associated error code. The error codes that can be set are the same as
 | 
			
		||||
 *   would be set by a read() or write() function, with the following
 | 
			
		||||
 *   additional error codes possible:
 | 
			
		||||
 *
 | 
			
		||||
 *     EAGAIN - The requested I/O operation was not queued due to resource
 | 
			
		||||
 *       limitations.
 | 
			
		||||
 *     ECANCELED - The requested I/O was cancelled before the I/O completed
 | 
			
		||||
 *       due to an explicit aio_cancel() request.
 | 
			
		||||
 *     EFBIG - The aiocbp->aio_lio_opcode is LIO_WRITE, the file is a
 | 
			
		||||
 *       regular file, aiocbp->aio_nbytes is greater than 0, and the
 | 
			
		||||
 *       aiocbp->aio_offset is greater than or equal to the offset maximum
 | 
			
		||||
 *       in the open file description associated with aiocbp->aio_fildes.
 | 
			
		||||
 *     EINPROGRESS - The requested I/O is in progress.
 | 
			
		||||
 *     EOVERFLOW - The aiocbp->aio_lio_opcode is LIO_READ, the file is a
 | 
			
		||||
 *       regular file, aiocbp->aio_nbytes is greater than 0, and the
 | 
			
		||||
 *       aiocbp->aio_offset is before the end-of-file and is greater than
 | 
			
		||||
 *       or equal to the offset maximum in the open file description
 | 
			
		||||
 *       associated with aiocbp->aio_fildes.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
int lio_listio(int mode, FAR struct aiocb * const list[], int nent,
 | 
			
		||||
               FAR struct sigevent *sig)
 | 
			
		||||
{
 | 
			
		||||
  FAR struct aiocb *aiocbp = NULL;
 | 
			
		||||
  int nqueued;
 | 
			
		||||
  int errcode;
 | 
			
		||||
  int retcode;
 | 
			
		||||
  int status;
 | 
			
		||||
  int ret;
 | 
			
		||||
  int i;
 | 
			
		||||
 | 
			
		||||
  DEBUGASSERT(mode == LIO_WAIT || mode == LIO_NOWAIT);
 | 
			
		||||
  DEBUGASSERT(list);
 | 
			
		||||
 | 
			
		||||
  nqueued = 0;    /* No I/O operations yet queued */
 | 
			
		||||
  ret     = OK;   /* Assume success */
 | 
			
		||||
 | 
			
		||||
  /* Lock the scheduler so that no I/O events can complete on the worker
 | 
			
		||||
   * thread until we set our wait set up.  Pre-emption will, of course, be
 | 
			
		||||
   * re-enabled while we are waiting for the signal.
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  sched_lock();
 | 
			
		||||
 | 
			
		||||
  /* Submit each asynchronous I/O operation in the list, skipping over NULL
 | 
			
		||||
   * entries.
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  for (i = 0; i < nent; i++)
 | 
			
		||||
    {
 | 
			
		||||
      /* Skip over NULL entries */
 | 
			
		||||
 | 
			
		||||
      aiocbp = list[i];
 | 
			
		||||
      if (aiocbp)
 | 
			
		||||
        {
 | 
			
		||||
          /* Submit the operation according to its opcode */
 | 
			
		||||
 | 
			
		||||
          status = OK;
 | 
			
		||||
          switch (aiocbp->aio_lio_opcode)
 | 
			
		||||
            {
 | 
			
		||||
            case LIO_NOP:
 | 
			
		||||
              {
 | 
			
		||||
                /* Mark the do-nothing operation complete */
 | 
			
		||||
 | 
			
		||||
                aiocbp->aio_result = OK;
 | 
			
		||||
              }
 | 
			
		||||
              break;
 | 
			
		||||
 | 
			
		||||
            case LIO_READ:
 | 
			
		||||
            case LIO_WRITE:
 | 
			
		||||
              {
 | 
			
		||||
                if (aiocbp->aio_lio_opcode == LIO_READ)
 | 
			
		||||
                  {
 | 
			
		||||
                    /* Submit the asynchronous read operation */
 | 
			
		||||
 | 
			
		||||
                    status = aio_read(aiocbp);
 | 
			
		||||
                  }
 | 
			
		||||
                else
 | 
			
		||||
                  {
 | 
			
		||||
                    /* Submit the asynchronous write operation */
 | 
			
		||||
 | 
			
		||||
                    status = aio_write(aiocbp);
 | 
			
		||||
                  }
 | 
			
		||||
 | 
			
		||||
                if (status < 0)
 | 
			
		||||
                  {
 | 
			
		||||
                    /* Failed to queue the I/O.  Set up the error return. */
 | 
			
		||||
 | 
			
		||||
                    errcode = get_errno();
 | 
			
		||||
                    ferr("ERROR: aio_read/write failed: %d\n", errcode);
 | 
			
		||||
                    DEBUGASSERT(errcode > 0);
 | 
			
		||||
                    aiocbp->aio_result = -errcode;
 | 
			
		||||
                    ret = ERROR;
 | 
			
		||||
                  }
 | 
			
		||||
                else
 | 
			
		||||
                  {
 | 
			
		||||
                    /* Increment the count of successfully queue operations */
 | 
			
		||||
 | 
			
		||||
                    nqueued++;
 | 
			
		||||
                  }
 | 
			
		||||
              }
 | 
			
		||||
              break;
 | 
			
		||||
 | 
			
		||||
            default:
 | 
			
		||||
              {
 | 
			
		||||
                /* Make the invalid operation complete with an error */
 | 
			
		||||
 | 
			
		||||
                ferr("ERROR: Unrecognized opcode: %d\n",
 | 
			
		||||
                     aiocbp->aio_lio_opcode);
 | 
			
		||||
                aiocbp->aio_result = -EINVAL;
 | 
			
		||||
                ret = ERROR;
 | 
			
		||||
              }
 | 
			
		||||
              break;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* If there was any failure in queuing the I/O, EIO will be returned */
 | 
			
		||||
 | 
			
		||||
  retcode = EIO;
 | 
			
		||||
 | 
			
		||||
  /* Now what? Three possibilities:
 | 
			
		||||
   *
 | 
			
		||||
   * Case 1: mode == LIO_WAIT
 | 
			
		||||
   *
 | 
			
		||||
   *   Ignore the sig argument; Do no return until all I/O completes.
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  if (mode == LIO_WAIT)
 | 
			
		||||
    {
 | 
			
		||||
      /* Don't wait if all if no I/O was queue */
 | 
			
		||||
 | 
			
		||||
      if (nqueued > 0)
 | 
			
		||||
        {
 | 
			
		||||
          /* Wait until all I/O completes.  The scheduler will be unlocked
 | 
			
		||||
           * while we are waiting.
 | 
			
		||||
           */
 | 
			
		||||
 | 
			
		||||
          status = lio_waitall(list, nent);
 | 
			
		||||
          if (status < 0 && ret == OK)
 | 
			
		||||
            {
 | 
			
		||||
              /* Something bad happened while waiting and this is the first
 | 
			
		||||
               * error to be reported.
 | 
			
		||||
               */
 | 
			
		||||
 | 
			
		||||
              retcode = -status;
 | 
			
		||||
              ret     = ERROR;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* Case 2: mode == LIO_NOWAIT and sig != NULL
 | 
			
		||||
   *
 | 
			
		||||
   *   If any I/O was queued, then setup to signal the caller when all of
 | 
			
		||||
   *   the transfers complete.
 | 
			
		||||
   *
 | 
			
		||||
   *   If no I/O was queue, then we I suppose that we need to signal the
 | 
			
		||||
   *   caller ourself?
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  else if (sig != NULL)
 | 
			
		||||
    {
 | 
			
		||||
      if (nqueued > 0)
 | 
			
		||||
        {
 | 
			
		||||
          /* Setup a signal handler to detect when until all I/O completes. */
 | 
			
		||||
 | 
			
		||||
          status = lio_sigsetup(list, nent, sig);
 | 
			
		||||
          if (status < 0 && ret == OK)
 | 
			
		||||
            {
 | 
			
		||||
              /* Something bad happened while setting up the signal and this
 | 
			
		||||
               * is the first error to be reported.
 | 
			
		||||
               */
 | 
			
		||||
 | 
			
		||||
              retcode = -status;
 | 
			
		||||
              ret     = ERROR;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
      else
 | 
			
		||||
        {
 | 
			
		||||
          status = nxsig_notification(getpid(), sig,
 | 
			
		||||
                                      SI_ASYNCIO, &aiocbp->aio_sigwork);
 | 
			
		||||
          if (status < 0 && ret == OK)
 | 
			
		||||
            {
 | 
			
		||||
              /* Something bad happened while performing the notification
 | 
			
		||||
               * and this is the first error to be reported.
 | 
			
		||||
               */
 | 
			
		||||
 | 
			
		||||
               retcode = -status;
 | 
			
		||||
               ret     = ERROR;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* Case 3: mode == LIO_NOWAIT and sig == NULL
 | 
			
		||||
   *
 | 
			
		||||
   *   Just return now.
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  sched_unlock();
 | 
			
		||||
  if (ret < 0)
 | 
			
		||||
    {
 | 
			
		||||
      set_errno(retcode);
 | 
			
		||||
      return ERROR;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif /* CONFIG_FS_AIO */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,30 @@
 | 
			
		|||
############################################################################
 | 
			
		||||
# libs/libc-musl/assert/Make.defs
 | 
			
		||||
#
 | 
			
		||||
# 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.
 | 
			
		||||
#
 | 
			
		||||
############################################################################
 | 
			
		||||
 | 
			
		||||
CSRCS += lib_assert.c
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_STACK_CANARIES),y)
 | 
			
		||||
CSRCS += lib_stackchk.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
# Add the assert directory to the build
 | 
			
		||||
 | 
			
		||||
DEPPATH += --dep-path assert
 | 
			
		||||
VPATH += :assert
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,47 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * libs/libc-musl/assert/lib_assert.c
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed to the Apache Software Foundation (ASF) under one or more
 | 
			
		||||
 * contributor license agreements.  See the NOTICE file distributed with
 | 
			
		||||
 * this work for additional information regarding copyright ownership.  The
 | 
			
		||||
 * ASF licenses this file to you under the Apache License, Version 2.0 (the
 | 
			
		||||
 * "License"); you may not use this file except in compliance with the
 | 
			
		||||
 * License.  You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *   http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 | 
			
		||||
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
 | 
			
		||||
 * License for the specific language governing permissions and limitations
 | 
			
		||||
 * under the License.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
* @file lib_assert.c
 | 
			
		||||
* @brief nuttx source code
 | 
			
		||||
*        https://github.com/apache/incubator-nuttx.git
 | 
			
		||||
* @version 10.3.0 
 | 
			
		||||
* @author AIIT XUOS Lab
 | 
			
		||||
* @date 2022-08-04
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <nuttx/arch.h>
 | 
			
		||||
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
void _assert(FAR const char *filename, int linenum)
 | 
			
		||||
{
 | 
			
		||||
  up_assert(filename, linenum);
 | 
			
		||||
  exit(EXIT_FAILURE);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,69 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * libs/libc-musl/assert/lib_stackchk.c
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed to the Apache Software Foundation (ASF) under one or more
 | 
			
		||||
 * contributor license agreements.  See the NOTICE file distributed with
 | 
			
		||||
 * this work for additional information regarding copyright ownership.  The
 | 
			
		||||
 * ASF licenses this file to you under the Apache License, Version 2.0 (the
 | 
			
		||||
 * "License"); you may not use this file except in compliance with the
 | 
			
		||||
 * License.  You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *   http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 | 
			
		||||
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
 | 
			
		||||
 * License for the specific language governing permissions and limitations
 | 
			
		||||
 * under the License.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
* @file lib_stackchk.c
 | 
			
		||||
* @brief nuttx source code
 | 
			
		||||
*        https://github.com/apache/incubator-nuttx.git
 | 
			
		||||
* @version 10.3.0 
 | 
			
		||||
* @author AIIT XUOS Lab
 | 
			
		||||
* @date 2022-08-04
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_STACK_CANARIES
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Data
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
FAR const void *const __stack_chk_guard = &__stack_chk_guard;
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: __stack_chk_fail
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   The interface __stack_chk_fail() shall abort the function that called
 | 
			
		||||
 *   it with a message that a stack overflow has been detected. The program
 | 
			
		||||
 *   that called the function shall then exit.
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   None
 | 
			
		||||
 *
 | 
			
		||||
 * Returned Value:
 | 
			
		||||
 *   None.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
void __stack_chk_fail(void)
 | 
			
		||||
{
 | 
			
		||||
  PANIC();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif /* CONFIG_STACK_CANARIES */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,30 @@
 | 
			
		|||
############################################################################
 | 
			
		||||
# libs/libc-musl/audio/Make.defs
 | 
			
		||||
#
 | 
			
		||||
# 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.
 | 
			
		||||
#
 | 
			
		||||
############################################################################
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_AUDIO),y)
 | 
			
		||||
CSRCS += lib_buffer.c
 | 
			
		||||
 | 
			
		||||
include audio/libsrc/Make.defs
 | 
			
		||||
 | 
			
		||||
# Add the audio/ directory to the build
 | 
			
		||||
 | 
			
		||||
DEPPATH += --dep-path audio
 | 
			
		||||
VPATH += :audio
 | 
			
		||||
endif
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,180 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * libs/libc-musl/audio/lib_buffer.c
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed to the Apache Software Foundation (ASF) under one or more
 | 
			
		||||
 * contributor license agreements.  See the NOTICE file distributed with
 | 
			
		||||
 * this work for additional information regarding copyright ownership.  The
 | 
			
		||||
 * ASF licenses this file to you under the Apache License, Version 2.0 (the
 | 
			
		||||
 * "License"); you may not use this file except in compliance with the
 | 
			
		||||
 * License.  You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *   http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 | 
			
		||||
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
 | 
			
		||||
 * License for the specific language governing permissions and limitations
 | 
			
		||||
 * under the License.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
* @file lib_buffer.c
 | 
			
		||||
* @brief nuttx source code
 | 
			
		||||
*        https://github.com/apache/incubator-nuttx.git
 | 
			
		||||
* @version 10.3.0 
 | 
			
		||||
* @author AIIT XUOS Lab
 | 
			
		||||
* @date 2022-08-04
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
#include <debug.h>
 | 
			
		||||
 | 
			
		||||
#include <nuttx/audio/audio.h>
 | 
			
		||||
#include <nuttx/usb/audio.h>
 | 
			
		||||
 | 
			
		||||
#include "libc-musl.h"
 | 
			
		||||
 | 
			
		||||
#if defined(CONFIG_AUDIO)
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Private Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: apb_semtake
 | 
			
		||||
 *
 | 
			
		||||
 *       Take an Audio Pipeline Buffer.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
static void apb_semtake(FAR struct ap_buffer_s *apb)
 | 
			
		||||
{
 | 
			
		||||
  int ret;
 | 
			
		||||
 | 
			
		||||
  /* Take the semaphore (perhaps waiting) */
 | 
			
		||||
 | 
			
		||||
  while (_SEM_WAIT(&apb->sem) < 0)
 | 
			
		||||
    {
 | 
			
		||||
      /* The only case that an error should occr here is if
 | 
			
		||||
       * the wait was awakened by a signal.
 | 
			
		||||
       */
 | 
			
		||||
 | 
			
		||||
      DEBUGASSERT(_SEM_ERRNO(ret) == EINTR || _SEM_ERRNO(ret) == ECANCELED);
 | 
			
		||||
      UNUSED(ret);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: apb_semgive
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#define apb_semgive(b) _SEM_POST(&b->sem)
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: apb_alloc
 | 
			
		||||
 *
 | 
			
		||||
 * Allocate an Audio Pipeline Buffer for use in the Audio sub-system.  This
 | 
			
		||||
 * will perform the actual allocate based on buffer data format, number of
 | 
			
		||||
 * channels, etc. and prepare the buffer for consumption.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
int apb_alloc(FAR struct audio_buf_desc_s *bufdesc)
 | 
			
		||||
{
 | 
			
		||||
  uint32_t            bufsize;
 | 
			
		||||
  int                 ret;
 | 
			
		||||
  struct ap_buffer_s  *apb;
 | 
			
		||||
 | 
			
		||||
  DEBUGASSERT(bufdesc->u.pbuffer != NULL);
 | 
			
		||||
 | 
			
		||||
  /* Perform a user mode allocation */
 | 
			
		||||
 | 
			
		||||
  bufsize = sizeof(struct ap_buffer_s) + bufdesc->numbytes;
 | 
			
		||||
  apb = lib_umalloc(bufsize);
 | 
			
		||||
  *bufdesc->u.pbuffer = apb;
 | 
			
		||||
 | 
			
		||||
  /* Test if the allocation was successful or not */
 | 
			
		||||
 | 
			
		||||
  if (*bufdesc->u.pbuffer == NULL)
 | 
			
		||||
    {
 | 
			
		||||
      ret = -ENOMEM;
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    {
 | 
			
		||||
      /* Populate the buffer contents */
 | 
			
		||||
 | 
			
		||||
      memset(apb, 0, bufsize);
 | 
			
		||||
      apb->i.channels = 1;
 | 
			
		||||
      apb->crefs      = 1;
 | 
			
		||||
      apb->nmaxbytes  = bufdesc->numbytes;
 | 
			
		||||
      apb->nbytes     = 0;
 | 
			
		||||
      apb->flags      = 0;
 | 
			
		||||
      apb->samp       = (FAR uint8_t *)(apb + 1);
 | 
			
		||||
#ifdef CONFIG_AUDIO_MULTI_SESSION
 | 
			
		||||
      apb->session    = bufdesc->session;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
      _SEM_INIT(&apb->sem, 0, 1);
 | 
			
		||||
      ret = sizeof(struct audio_buf_desc_s);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: apb_free
 | 
			
		||||
 *
 | 
			
		||||
 * Free's a previously allocated or referenced Audio Pipeline Buffer
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
void apb_free(FAR struct ap_buffer_s *apb)
 | 
			
		||||
{
 | 
			
		||||
  int refcount;
 | 
			
		||||
 | 
			
		||||
  /* Perform a reference count decrement and possibly release the memory */
 | 
			
		||||
 | 
			
		||||
  apb_semtake(apb);
 | 
			
		||||
  refcount = apb->crefs--;
 | 
			
		||||
  apb_semgive(apb);
 | 
			
		||||
 | 
			
		||||
  if (refcount <= 1)
 | 
			
		||||
    {
 | 
			
		||||
      audinfo("Freeing %p\n", apb);
 | 
			
		||||
      _SEM_DESTROY(&apb->sem);
 | 
			
		||||
      lib_ufree(apb);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: apb_reference
 | 
			
		||||
 *
 | 
			
		||||
 * Claim a reference to an Audio Pipeline Buffer.  Each call to apb_reference
 | 
			
		||||
 * will increment the reference count and must have a matching apb_free
 | 
			
		||||
 * call.  When the refcount decrements to zero, the buffer will be freed.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
void apb_reference(FAR struct ap_buffer_s *apb)
 | 
			
		||||
{
 | 
			
		||||
  /* Do we need any thread protection here?  Almost certaily... */
 | 
			
		||||
 | 
			
		||||
  apb_semtake(apb);
 | 
			
		||||
  apb->crefs++;
 | 
			
		||||
  apb_semgive(apb);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif /* CONFIG_AUDIO */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,64 @@
 | 
			
		|||
############################################################################
 | 
			
		||||
# libs/libc-musl/audio/libsrc/Make.defs
 | 
			
		||||
#
 | 
			
		||||
# 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.
 | 
			
		||||
#
 | 
			
		||||
############################################################################
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_AUDIO_SRC),y)
 | 
			
		||||
 | 
			
		||||
PACKAGE=libsamplerate
 | 
			
		||||
VERSION=0.1.9
 | 
			
		||||
 | 
			
		||||
libsamplerate:
 | 
			
		||||
	$(Q) curl -L https://codeload.github.com/libsndfile/libsamplerate/zip/master -o libsamplerate.zip
 | 
			
		||||
	$(Q) unzip -o libsamplerate.zip
 | 
			
		||||
	$(Q) mv libsamplerate-master libsamplerate
 | 
			
		||||
	$(Q) cp -rf libsamplerate/include/samplerate.h $(TOPDIR)$(DELIM)include$(DELIM)nuttx$(DELIM)audio$(DELIM)
 | 
			
		||||
 | 
			
		||||
context:: libsamplerate
 | 
			
		||||
 | 
			
		||||
CSRCS += samplerate.c
 | 
			
		||||
CSRCS += src_sinc.c
 | 
			
		||||
CSRCS += src_linear.c
 | 
			
		||||
CSRCS += src_zoh.c
 | 
			
		||||
 | 
			
		||||
CFLAGS += -DPACKAGE=\"$(PACKAGE)\" -DVERSION=\"$(VERSION)\"
 | 
			
		||||
 | 
			
		||||
CFLAGS += ${shell $(INCDIR) "$(CC)" $(TOPDIR)$(DELIM)include$(DELIM)nuttx$(DELIM)audio}
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_SINC_FAST_CONVERTER),y)
 | 
			
		||||
CFLAGS += -DENABLE_SINC_FAST_CONVERTER
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_SINC_MEDIUM_CONVERTER),y)
 | 
			
		||||
CFLAGS += -DENABLE_SINC_MEDIUM_CONVERTER
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_SINC_BEST_CONVERTER),y)
 | 
			
		||||
CFLAGS += -DENABLE_SINC_BEST_CONVERTER
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
VPATH += libsamplerate/src
 | 
			
		||||
SUBDIRS += libsamplerate/src
 | 
			
		||||
DEPPATH += --dep-path libsamplerate/src
 | 
			
		||||
 | 
			
		||||
distclean::
 | 
			
		||||
	$(call DELDIR, $(TOPDIR)$(DELIM)include$(DELIM)nuttx$(DELIM)audio$(DELIM)samplerate.h)
 | 
			
		||||
	$(call DELDIR, libsamplerate)
 | 
			
		||||
	$(call DELFILE, libsamplerate.zip)
 | 
			
		||||
 | 
			
		||||
endif
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,33 @@
 | 
			
		|||
############################################################################
 | 
			
		||||
# libs/libc-musl/bin/Makefile
 | 
			
		||||
#
 | 
			
		||||
# 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 $(TOPDIR)/Make.defs
 | 
			
		||||
 | 
			
		||||
all:
 | 
			
		||||
.PHONY: clean distclean
 | 
			
		||||
 | 
			
		||||
# Clean Targets:
 | 
			
		||||
 | 
			
		||||
clean:
 | 
			
		||||
	$(call CLEAN)
 | 
			
		||||
 | 
			
		||||
# Deep clean -- removes all traces of the configuration
 | 
			
		||||
 | 
			
		||||
distclean: clean
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,36 @@
 | 
			
		|||
############################################################################
 | 
			
		||||
# libs/libc-musl/builtin/Make.defs
 | 
			
		||||
#
 | 
			
		||||
# 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.
 | 
			
		||||
#
 | 
			
		||||
############################################################################
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_BUILTIN),y)
 | 
			
		||||
 | 
			
		||||
# Builtin library files
 | 
			
		||||
 | 
			
		||||
CSRCS += lib_builtin_getname.c lib_builtin_isavail.c lib_builtin_forindex.c
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_BUILD_PROTECTED),y)
 | 
			
		||||
CSRCS += lib_builtin_setlist.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
# Hook the builtin subdirectory into the build
 | 
			
		||||
 | 
			
		||||
DEPPATH += --dep-path builtin
 | 
			
		||||
VPATH += builtin
 | 
			
		||||
 | 
			
		||||
endif
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,69 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * libs/libc-musl/builtin/lib_builtin_forindex.c
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed to the Apache Software Foundation (ASF) under one or more
 | 
			
		||||
 * contributor license agreements.  See the NOTICE file distributed with
 | 
			
		||||
 * this work for additional information regarding copyright ownership.  The
 | 
			
		||||
 * ASF licenses this file to you under the Apache License, Version 2.0 (the
 | 
			
		||||
 * "License"); you may not use this file except in compliance with the
 | 
			
		||||
 * License.  You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *   http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 | 
			
		||||
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
 | 
			
		||||
 * License for the specific language governing permissions and limitations
 | 
			
		||||
 * under the License.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
* @file lib_builtin_forindex.c
 | 
			
		||||
* @brief nuttx source code
 | 
			
		||||
*        https://github.com/apache/incubator-nuttx.git
 | 
			
		||||
* @version 10.3.0 
 | 
			
		||||
* @author AIIT XUOS Lab
 | 
			
		||||
* @date 2022-08-04
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <nuttx/lib/builtin.h>
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: builtin_for_index
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Returns the builtin_s structure for the selected built-in.
 | 
			
		||||
 *   If support for built-in functions is enabled in the NuttX
 | 
			
		||||
 *   configuration, then this function must be provided by the application
 | 
			
		||||
 *   code.
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   index, from 0 and on...
 | 
			
		||||
 *
 | 
			
		||||
 * Returned Value:
 | 
			
		||||
 *   Returns valid pointer pointing to the builtin_s structure if index is
 | 
			
		||||
 *   valid.
 | 
			
		||||
 *   Otherwise, NULL is returned.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
FAR const struct builtin_s *builtin_for_index(int index)
 | 
			
		||||
{
 | 
			
		||||
  if (index < g_builtin_count)
 | 
			
		||||
    {
 | 
			
		||||
      return &g_builtins[index];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return NULL;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,70 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * libs/libc-musl/builtin/lib_builtin_getname.c
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed to the Apache Software Foundation (ASF) under one or more
 | 
			
		||||
 * contributor license agreements.  See the NOTICE file distributed with
 | 
			
		||||
 * this work for additional information regarding copyright ownership.  The
 | 
			
		||||
 * ASF licenses this file to you under the Apache License, Version 2.0 (the
 | 
			
		||||
 * "License"); you may not use this file except in compliance with the
 | 
			
		||||
 * License.  You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *   http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 | 
			
		||||
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
 | 
			
		||||
 * License for the specific language governing permissions and limitations
 | 
			
		||||
 * under the License.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
* @file lib_builtin_getname.c
 | 
			
		||||
* @brief nuttx source code
 | 
			
		||||
*        https://github.com/apache/incubator-nuttx.git
 | 
			
		||||
* @version 10.3.0 
 | 
			
		||||
* @author AIIT XUOS Lab
 | 
			
		||||
* @date 2022-08-04
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <nuttx/lib/builtin.h>
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: builtin_getname
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Returns pointer the a name of the application at 'index' in the table
 | 
			
		||||
 *   of built-in applications.
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   index - From 0 and on ...
 | 
			
		||||
 *
 | 
			
		||||
 * Returned Value:
 | 
			
		||||
 *   Returns valid pointer pointing to the app name if index is valid.
 | 
			
		||||
 *   Otherwise NULL is returned.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
FAR const char *builtin_getname(int index)
 | 
			
		||||
{
 | 
			
		||||
  FAR const struct builtin_s *builtin;
 | 
			
		||||
 | 
			
		||||
  builtin = builtin_for_index(index);
 | 
			
		||||
 | 
			
		||||
  if (builtin != NULL)
 | 
			
		||||
    {
 | 
			
		||||
      return builtin->name;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return NULL;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,79 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * libs/libc-musl/builtin/lib_builtin_isavail.c
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed to the Apache Software Foundation (ASF) under one or more
 | 
			
		||||
 * contributor license agreements.  See the NOTICE file distributed with
 | 
			
		||||
 * this work for additional information regarding copyright ownership.  The
 | 
			
		||||
 * ASF licenses this file to you under the Apache License, Version 2.0 (the
 | 
			
		||||
 * "License"); you may not use this file except in compliance with the
 | 
			
		||||
 * License.  You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *   http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 | 
			
		||||
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
 | 
			
		||||
 * License for the specific language governing permissions and limitations
 | 
			
		||||
 * under the License.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
* @file lib_builtin_isavail.c
 | 
			
		||||
* @brief nuttx source code
 | 
			
		||||
*        https://github.com/apache/incubator-nuttx.git
 | 
			
		||||
* @version 10.3.0 
 | 
			
		||||
* @author AIIT XUOS Lab
 | 
			
		||||
* @date 2022-08-04
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <limits.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
 | 
			
		||||
#include <nuttx/lib/builtin.h>
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: builtin_isavail
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Checks for availability of an application named 'appname' registered
 | 
			
		||||
 *   during compile time and, if available, returns the index into the table
 | 
			
		||||
 *   of built-in applications.
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   filename - Name of the linked-in binary to be started.
 | 
			
		||||
 *
 | 
			
		||||
 * Returned Value:
 | 
			
		||||
 *   This is an internal function, used by by the NuttX binfmt logic and
 | 
			
		||||
 *   by the application built-in logic.  It returns a non-negative index to
 | 
			
		||||
 *   the application entry in the table of built-in applications on success
 | 
			
		||||
 *   or a negated errno value in the event of a failure.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
int builtin_isavail(FAR const char *appname)
 | 
			
		||||
{
 | 
			
		||||
  FAR const char *name;
 | 
			
		||||
  int i;
 | 
			
		||||
 | 
			
		||||
  for (i = 0; (name = builtin_getname(i)) != NULL; i++)
 | 
			
		||||
    {
 | 
			
		||||
      if (strcmp(name, appname) == 0)
 | 
			
		||||
        {
 | 
			
		||||
          return i;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return -ENOENT;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,82 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * libs/libc-musl/builtin/lib_builtin_setlist.c
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed to the Apache Software Foundation (ASF) under one or more
 | 
			
		||||
 * contributor license agreements.  See the NOTICE file distributed with
 | 
			
		||||
 * this work for additional information regarding copyright ownership.  The
 | 
			
		||||
 * ASF licenses this file to you under the Apache License, Version 2.0 (the
 | 
			
		||||
 * "License"); you may not use this file except in compliance with the
 | 
			
		||||
 * License.  You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *   http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 | 
			
		||||
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
 | 
			
		||||
 * License for the specific language governing permissions and limitations
 | 
			
		||||
 * under the License.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
* @file lib_builtin_setlist.c
 | 
			
		||||
* @brief nuttx source code
 | 
			
		||||
*        https://github.com/apache/incubator-nuttx.git
 | 
			
		||||
* @version 10.3.0 
 | 
			
		||||
* @author AIIT XUOS Lab
 | 
			
		||||
* @date 2022-08-04
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <nuttx/lib/builtin.h>
 | 
			
		||||
 | 
			
		||||
#if defined(CONFIG_BUILD_PROTECTED) && defined(__KERNEL__)
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
FAR const struct builtin_s *g_builtins;
 | 
			
		||||
int g_builtin_count;
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: builtin_setlist
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Saves the user-space list of built-in applications for use by BINFS in
 | 
			
		||||
 *   protected mode.  Normally this is small set of globals provided by
 | 
			
		||||
 *   user-space logic.  It provides name-value pairs for associating
 | 
			
		||||
 *   built-in application names with user-space entry point addresses.
 | 
			
		||||
 *   These globals are only needed for use by BINFS which executes built-in
 | 
			
		||||
 *   applications from kernel-space in PROTECTED mode.  In the FLAT build,
 | 
			
		||||
 *   the user space globals are readily available.  (BINFS is not
 | 
			
		||||
 *   supportable in KERNEL mode since user-space address have no general
 | 
			
		||||
 *   meaning that configuration).
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   builtins - The list of built-in functions.  Each entry is a name-value
 | 
			
		||||
 *              pair that maps a built-in function name to its user-space
 | 
			
		||||
 *              entry point address.
 | 
			
		||||
 *   count    - The number of name-value pairs in the built-in list.
 | 
			
		||||
 *
 | 
			
		||||
 * Returned Value:
 | 
			
		||||
 *   None
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
void builtin_setlist(FAR const struct builtin_s *builtins, int count)
 | 
			
		||||
{
 | 
			
		||||
  g_builtins      = builtins;
 | 
			
		||||
  g_builtin_count = count;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif /* CONFIG_BUILD_PROTECTED && __KERNEL__ */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,29 @@
 | 
			
		|||
############################################################################
 | 
			
		||||
# libs/libc/libc-musl/ctype/Make.defs
 | 
			
		||||
#
 | 
			
		||||
# 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.
 | 
			
		||||
#
 | 
			
		||||
############################################################################
 | 
			
		||||
 | 
			
		||||
# Add the ctype C files to the build
 | 
			
		||||
 | 
			
		||||
CSRCS += isalnum.c isalpha.c isascii.c isblank.c
 | 
			
		||||
CSRCS += iscntrl.c isdigit.c isgraph.c islower.c
 | 
			
		||||
CSRCS += isprint.c ispunct.c isspace.c isupper.c
 | 
			
		||||
CSRCS += isxdigit.c tolower.c toupper.c
 | 
			
		||||
 | 
			
		||||
DEPPATH += --dep-path ctype
 | 
			
		||||
VPATH += :ctype
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,15 @@
 | 
			
		|||
/**
 | 
			
		||||
 * @file isalnum.c
 | 
			
		||||
 * @brief musl source code
 | 
			
		||||
 *        https://github.com/bminor/musl.git
 | 
			
		||||
 * @version 1.0
 | 
			
		||||
 * @author AIIT XUOS Lab
 | 
			
		||||
 * @date 2022-08-04
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <ctype.h>
 | 
			
		||||
 | 
			
		||||
int isalnum(int c)
 | 
			
		||||
{
 | 
			
		||||
	return isalpha(c) || isdigit(c);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,16 @@
 | 
			
		|||
/**
 | 
			
		||||
 * @file isalpha.c
 | 
			
		||||
 * @brief musl source code
 | 
			
		||||
 *        https://github.com/bminor/musl.git
 | 
			
		||||
 * @version 1.0
 | 
			
		||||
 * @author AIIT XUOS Lab
 | 
			
		||||
 * @date 2022-08-04
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <ctype.h>
 | 
			
		||||
#undef isalpha
 | 
			
		||||
 | 
			
		||||
int isalpha(int c)
 | 
			
		||||
{
 | 
			
		||||
	return ((unsigned)c|32)-'a' < 26;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,16 @@
 | 
			
		|||
/**
 | 
			
		||||
 * @file isascii.c
 | 
			
		||||
 * @brief musl source code
 | 
			
		||||
 *        https://github.com/bminor/musl.git
 | 
			
		||||
 * @version 1.0
 | 
			
		||||
 * @author AIIT XUOS Lab
 | 
			
		||||
 * @date 2022-08-04
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <ctype.h>
 | 
			
		||||
#undef isascii
 | 
			
		||||
 | 
			
		||||
int isascii(int c)
 | 
			
		||||
{
 | 
			
		||||
	return !(c&~0x7f);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,15 @@
 | 
			
		|||
/**
 | 
			
		||||
 * @file isblank.c
 | 
			
		||||
 * @brief musl source code
 | 
			
		||||
 *        https://github.com/bminor/musl.git
 | 
			
		||||
 * @version 1.0
 | 
			
		||||
 * @author AIIT XUOS Lab
 | 
			
		||||
 * @date 2022-08-04
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <ctype.h>
 | 
			
		||||
 | 
			
		||||
int isblank(int c)
 | 
			
		||||
{
 | 
			
		||||
	return (c == ' ' || c == '\t');
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,15 @@
 | 
			
		|||
/**
 | 
			
		||||
 * @file iscntrl.c
 | 
			
		||||
 * @brief musl source code
 | 
			
		||||
 *        https://github.com/bminor/musl.git
 | 
			
		||||
 * @version 1.0
 | 
			
		||||
 * @author AIIT XUOS Lab
 | 
			
		||||
 * @date 2022-08-04
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <ctype.h>
 | 
			
		||||
 | 
			
		||||
int iscntrl(int c)
 | 
			
		||||
{
 | 
			
		||||
	return (unsigned)c < 0x20 || c == 0x7f;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,16 @@
 | 
			
		|||
/**
 | 
			
		||||
 * @file isdigit.c
 | 
			
		||||
 * @brief musl source code
 | 
			
		||||
 *        https://github.com/bminor/musl.git
 | 
			
		||||
 * @version 1.0
 | 
			
		||||
 * @author AIIT XUOS Lab
 | 
			
		||||
 * @date 2022-08-04
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <ctype.h>
 | 
			
		||||
#undef isdigit
 | 
			
		||||
 | 
			
		||||
int isdigit(int c)
 | 
			
		||||
{
 | 
			
		||||
	return (unsigned)c-'0' < 10;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,16 @@
 | 
			
		|||
/**
 | 
			
		||||
 * @file isgraph.c
 | 
			
		||||
 * @brief musl source code
 | 
			
		||||
 *        https://github.com/bminor/musl.git
 | 
			
		||||
 * @version 1.0
 | 
			
		||||
 * @author AIIT XUOS Lab
 | 
			
		||||
 * @date 2022-08-04
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <ctype.h>
 | 
			
		||||
#undef isgraph
 | 
			
		||||
 | 
			
		||||
int isgraph(int c)
 | 
			
		||||
{
 | 
			
		||||
	return (unsigned)c-0x21 < 0x5e;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,16 @@
 | 
			
		|||
/**
 | 
			
		||||
 * @file islower.c
 | 
			
		||||
 * @brief musl source code
 | 
			
		||||
 *        https://github.com/bminor/musl.git
 | 
			
		||||
 * @version 1.0
 | 
			
		||||
 * @author AIIT XUOS Lab
 | 
			
		||||
 * @date 2022-08-04
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <ctype.h>
 | 
			
		||||
#undef islower
 | 
			
		||||
 | 
			
		||||
int islower(int c)
 | 
			
		||||
{
 | 
			
		||||
	return (unsigned)c-'a' < 26;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,16 @@
 | 
			
		|||
/**
 | 
			
		||||
 * @file isprint.c
 | 
			
		||||
 * @brief musl source code
 | 
			
		||||
 *        https://github.com/bminor/musl.git
 | 
			
		||||
 * @version 1.0
 | 
			
		||||
 * @author AIIT XUOS Lab
 | 
			
		||||
 * @date 2022-08-04
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <ctype.h>
 | 
			
		||||
#undef isprint
 | 
			
		||||
 | 
			
		||||
int isprint(int c)
 | 
			
		||||
{
 | 
			
		||||
	return (unsigned)c-0x20 < 0x5f;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,15 @@
 | 
			
		|||
/**
 | 
			
		||||
 * @file ispunct.c
 | 
			
		||||
 * @brief musl source code
 | 
			
		||||
 *        https://github.com/bminor/musl.git
 | 
			
		||||
 * @version 1.0
 | 
			
		||||
 * @author AIIT XUOS Lab
 | 
			
		||||
 * @date 2022-08-04
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <ctype.h>
 | 
			
		||||
 | 
			
		||||
int ispunct(int c)
 | 
			
		||||
{
 | 
			
		||||
	return isgraph(c) && !isalnum(c);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,16 @@
 | 
			
		|||
/**
 | 
			
		||||
 * @file isspace.c
 | 
			
		||||
 * @brief musl source code
 | 
			
		||||
 *        https://github.com/bminor/musl.git
 | 
			
		||||
 * @version 1.0
 | 
			
		||||
 * @author AIIT XUOS Lab
 | 
			
		||||
 * @date 2022-08-04
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <ctype.h>
 | 
			
		||||
#undef isspace
 | 
			
		||||
 | 
			
		||||
int isspace(int c)
 | 
			
		||||
{
 | 
			
		||||
	return c == ' ' || (unsigned)c-'\t' < 5;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,16 @@
 | 
			
		|||
/**
 | 
			
		||||
 * @file isupper.c
 | 
			
		||||
 * @brief musl source code
 | 
			
		||||
 *        https://github.com/bminor/musl.git
 | 
			
		||||
 * @version 1.0
 | 
			
		||||
 * @author AIIT XUOS Lab
 | 
			
		||||
 * @date 2022-08-04
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <ctype.h>
 | 
			
		||||
#undef isupper
 | 
			
		||||
 | 
			
		||||
int isupper(int c)
 | 
			
		||||
{
 | 
			
		||||
	return (unsigned)c-'A' < 26;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,15 @@
 | 
			
		|||
/**
 | 
			
		||||
 * @file isxdigit.c
 | 
			
		||||
 * @brief musl source code
 | 
			
		||||
 *        https://github.com/bminor/musl.git
 | 
			
		||||
 * @version 1.0
 | 
			
		||||
 * @author AIIT XUOS Lab
 | 
			
		||||
 * @date 2022-08-04
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <ctype.h>
 | 
			
		||||
 | 
			
		||||
int isxdigit(int c)
 | 
			
		||||
{
 | 
			
		||||
	return isdigit(c) || ((unsigned)c|32)-'a' < 6;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,16 @@
 | 
			
		|||
/**
 | 
			
		||||
 * @file tolower.c
 | 
			
		||||
 * @brief musl source code
 | 
			
		||||
 *        https://github.com/bminor/musl.git
 | 
			
		||||
 * @version 1.0
 | 
			
		||||
 * @author AIIT XUOS Lab
 | 
			
		||||
 * @date 2022-08-04
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <ctype.h>
 | 
			
		||||
 | 
			
		||||
int tolower(int c)
 | 
			
		||||
{
 | 
			
		||||
	if (isupper(c)) return c | 32;
 | 
			
		||||
	return c;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,16 @@
 | 
			
		|||
/**
 | 
			
		||||
 * @file toupper.c
 | 
			
		||||
 * @brief musl source code
 | 
			
		||||
 *        https://github.com/bminor/musl.git
 | 
			
		||||
 * @version 1.0
 | 
			
		||||
 * @author AIIT XUOS Lab
 | 
			
		||||
 * @date 2022-08-04
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <ctype.h>
 | 
			
		||||
 | 
			
		||||
int toupper(int c)
 | 
			
		||||
{
 | 
			
		||||
	if (islower(c)) return c & 0x5f;
 | 
			
		||||
	return c;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,29 @@
 | 
			
		|||
############################################################################
 | 
			
		||||
# libs/libc-musl/dirent/Make.defs
 | 
			
		||||
#
 | 
			
		||||
# 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.
 | 
			
		||||
#
 | 
			
		||||
############################################################################
 | 
			
		||||
 | 
			
		||||
# Add the dirent C files to the build
 | 
			
		||||
 | 
			
		||||
CSRCS += lib_readdirr.c lib_telldir.c lib_alphasort.c lib_scandir.c
 | 
			
		||||
CSRCS += lib_ftw.c lib_nftw.c
 | 
			
		||||
 | 
			
		||||
# Add the dirent directory to the build
 | 
			
		||||
 | 
			
		||||
DEPPATH += --dep-path dirent
 | 
			
		||||
VPATH += :dirent
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,69 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * libs/libc-musl/dirent/lib_alphasort.c
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed to the Apache Software Foundation (ASF) under one or more
 | 
			
		||||
 * contributor license agreements.  See the NOTICE file distributed with
 | 
			
		||||
 * this work for additional information regarding copyright ownership.  The
 | 
			
		||||
 * ASF licenses this file to you under the Apache License, Version 2.0 (the
 | 
			
		||||
 * "License"); you may not use this file except in compliance with the
 | 
			
		||||
 * License.  You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *   http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 | 
			
		||||
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
 | 
			
		||||
 * License for the specific language governing permissions and limitations
 | 
			
		||||
 * under the License.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
* @file lib_alphasort.c
 | 
			
		||||
* @brief nuttx source code
 | 
			
		||||
*        https://github.com/apache/incubator-nuttx.git
 | 
			
		||||
* @version 10.3.0 
 | 
			
		||||
* @author AIIT XUOS Lab
 | 
			
		||||
* @date 2022-08-04
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <dirent.h>
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: alphasort
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   The  alphasort() function can be used as the comparison function
 | 
			
		||||
 *   compar() for scandir().  It sorts directory entries using strcoll on the
 | 
			
		||||
 *   strings (*a)->d_name and (*b)->d_name.
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   a - The first direntry to compare
 | 
			
		||||
 *   b - The second direntry to compare
 | 
			
		||||
 *
 | 
			
		||||
 * Returned Value:
 | 
			
		||||
 *   An integer less than, equal to, or greater than zero if the first
 | 
			
		||||
 *   argument is considered to be respectively less than, equal to, or
 | 
			
		||||
 *   greater than the second.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
int alphasort(FAR const struct dirent **a, FAR const struct dirent **b)
 | 
			
		||||
{
 | 
			
		||||
#ifdef CONFIG_LIBC_LOCALE
 | 
			
		||||
  return strcoll((*a)->d_name, (*b)->d_name);
 | 
			
		||||
#else
 | 
			
		||||
  return strcmp((*a)->d_name, (*b)->d_name);
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,54 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * libs/musl/dirent/lib_ftw.c
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed to the Apache Software Foundation (ASF) under one or more
 | 
			
		||||
 * contributor license agreements.  See the NOTICE file distributed with
 | 
			
		||||
 * this work for additional information regarding copyright ownership.  The
 | 
			
		||||
 * ASF licenses this file to you under the Apache License, Version 2.0 (the
 | 
			
		||||
 * "License"); you may not use this file except in compliance with the
 | 
			
		||||
 * License.  You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *   http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 | 
			
		||||
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
 | 
			
		||||
 * License for the specific language governing permissions and limitations
 | 
			
		||||
 * under the License.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
* @file lib_ftw.c
 | 
			
		||||
* @brief nuttx source code
 | 
			
		||||
*        https://github.com/apache/incubator-nuttx.git
 | 
			
		||||
* @version 10.3.0 
 | 
			
		||||
* @author AIIT XUOS Lab
 | 
			
		||||
* @date 2022-08-04
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <ftw.h>
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
int ftw(FAR const char *path, ftw_cb_t fn, int fdlimit)
 | 
			
		||||
{
 | 
			
		||||
  /* The following cast assumes that calling a function with one
 | 
			
		||||
   * argument more than it needs behaves as expected. This is
 | 
			
		||||
   * actually undefined, but works on all real-world machines.
 | 
			
		||||
   */
 | 
			
		||||
    union
 | 
			
		||||
  {
 | 
			
		||||
    ftw_cb_t  ftw;
 | 
			
		||||
    nftw_cb_t nftw;
 | 
			
		||||
  } u;
 | 
			
		||||
 | 
			
		||||
  u.ftw = fn;
 | 
			
		||||
  return nftw(path, u.nftw, fdlimit, FTW_PHYS);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,250 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * libs/libc-musl/dirent/lib_nftw.c
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed to the Apache Software Foundation (ASF) under one or more
 | 
			
		||||
 * contributor license agreements.  See the NOTICE file distributed with
 | 
			
		||||
 * this work for additional information regarding copyright ownership.  The
 | 
			
		||||
 * ASF licenses this file to you under the Apache License, Version 2.0 (the
 | 
			
		||||
 * "License"); you may not use this file except in compliance with the
 | 
			
		||||
 * License.  You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *   http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 | 
			
		||||
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
 | 
			
		||||
 * License for the specific language governing permissions and limitations
 | 
			
		||||
 * under the License.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
* @file lib_nftw.c
 | 
			
		||||
* @brief nuttx source code
 | 
			
		||||
*        https://github.com/apache/incubator-nuttx.git
 | 
			
		||||
* @version 10.3.0 
 | 
			
		||||
* @author AIIT XUOS Lab
 | 
			
		||||
* @date 2022-08-04
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <ftw.h>
 | 
			
		||||
#include <dirent.h>
 | 
			
		||||
#include <sys/stat.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <limits.h>
 | 
			
		||||
 | 
			
		||||
#include "libc-musl.h"
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Private Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
static int
 | 
			
		||||
call_nftw(FAR char *path, nftw_cb_t fn, int flags, int base,
 | 
			
		||||
          int level, FAR const struct stat *buf, int info)
 | 
			
		||||
{
 | 
			
		||||
  struct FTW ftw =
 | 
			
		||||
  {
 | 
			
		||||
    base, level
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  int r;
 | 
			
		||||
 | 
			
		||||
#ifndef CONFIG_DISABLE_ENVIRON
 | 
			
		||||
  if (flags & FTW_CHDIR)
 | 
			
		||||
    {
 | 
			
		||||
      if (base > 1)
 | 
			
		||||
        {
 | 
			
		||||
          path[base - 1] = '\0';
 | 
			
		||||
          r = chdir(path);
 | 
			
		||||
          path[base - 1] = '/';
 | 
			
		||||
        }
 | 
			
		||||
      else
 | 
			
		||||
        {
 | 
			
		||||
          r = chdir("/");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      if (r < 0)
 | 
			
		||||
        {
 | 
			
		||||
          return r;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  r = fn(path, buf, info, &ftw);
 | 
			
		||||
 | 
			
		||||
#ifndef CONFIG_DISABLE_ENVIRON
 | 
			
		||||
  if (flags & FTW_CHDIR)
 | 
			
		||||
    {
 | 
			
		||||
      lib_restoredir();
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  return r;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int
 | 
			
		||||
do_nftw(FAR char *path, nftw_cb_t fn, int fdlimit, int flags, int level)
 | 
			
		||||
{
 | 
			
		||||
  FAR DIR *dir = NULL;
 | 
			
		||||
  struct stat buf;
 | 
			
		||||
  size_t base;
 | 
			
		||||
  size_t j;
 | 
			
		||||
  int info;
 | 
			
		||||
  int r;
 | 
			
		||||
 | 
			
		||||
  j = strlen(path);
 | 
			
		||||
  while (j > 1 && path[j - 1] == '/')
 | 
			
		||||
    {
 | 
			
		||||
      path[--j] = '\0';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  base = j - 1;
 | 
			
		||||
  while (base > 0 && path[base - 1] != '/')
 | 
			
		||||
    {
 | 
			
		||||
      --base;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  r = flags & FTW_PHYS ? lstat(path, &buf) : stat(path, &buf);
 | 
			
		||||
  if (r < 0)
 | 
			
		||||
    {
 | 
			
		||||
      if (!(flags & FTW_PHYS) &&
 | 
			
		||||
          get_errno() == ENOENT && !lstat(path, &buf))
 | 
			
		||||
        {
 | 
			
		||||
          info = FTW_SLN;
 | 
			
		||||
        }
 | 
			
		||||
      else if (get_errno() == EACCES)
 | 
			
		||||
        {
 | 
			
		||||
          info = FTW_NS;
 | 
			
		||||
        }
 | 
			
		||||
      else
 | 
			
		||||
        {
 | 
			
		||||
          return -1;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
  else if (S_ISDIR(buf.st_mode))
 | 
			
		||||
    {
 | 
			
		||||
      if (flags & FTW_DEPTH)
 | 
			
		||||
        {
 | 
			
		||||
          info = FTW_DP;
 | 
			
		||||
        }
 | 
			
		||||
      else
 | 
			
		||||
        {
 | 
			
		||||
          info = FTW_D;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
  else if (S_ISLNK(buf.st_mode))
 | 
			
		||||
    {
 | 
			
		||||
      if (flags & FTW_PHYS)
 | 
			
		||||
        {
 | 
			
		||||
          info = FTW_SL;
 | 
			
		||||
        }
 | 
			
		||||
      else
 | 
			
		||||
        {
 | 
			
		||||
          info = FTW_SLN;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    {
 | 
			
		||||
      info = FTW_F;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (info == FTW_D || info == FTW_DP)
 | 
			
		||||
    {
 | 
			
		||||
      dir = opendir(path);
 | 
			
		||||
      if (dir)
 | 
			
		||||
        {
 | 
			
		||||
          if (fdlimit <= 0)
 | 
			
		||||
            {
 | 
			
		||||
              closedir(dir);
 | 
			
		||||
              dir = NULL;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
      else if (get_errno() == EACCES)
 | 
			
		||||
        {
 | 
			
		||||
          info = FTW_DNR;
 | 
			
		||||
        }
 | 
			
		||||
      else
 | 
			
		||||
        {
 | 
			
		||||
          return -1;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (!(flags & FTW_DEPTH))
 | 
			
		||||
    {
 | 
			
		||||
      r = call_nftw(path, fn, flags, base, level, &buf, info);
 | 
			
		||||
      if (r)
 | 
			
		||||
        {
 | 
			
		||||
          return r;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (dir)
 | 
			
		||||
    {
 | 
			
		||||
      FAR struct dirent *de;
 | 
			
		||||
      size_t l = j;
 | 
			
		||||
 | 
			
		||||
      if (path[j - 1] != '/')
 | 
			
		||||
        {
 | 
			
		||||
          path[j++] = '/';
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      while ((de = readdir(dir)))
 | 
			
		||||
        {
 | 
			
		||||
          if (de->d_name[0] == '.' && (!de->d_name[1] ||
 | 
			
		||||
              (de->d_name[1] == '.' && !de->d_name[2])))
 | 
			
		||||
            {
 | 
			
		||||
              continue;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
          if (strlen(de->d_name) > PATH_MAX - j)
 | 
			
		||||
            {
 | 
			
		||||
              set_errno(ENAMETOOLONG);
 | 
			
		||||
              closedir(dir);
 | 
			
		||||
              return -1;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
          strcpy(path + j, de->d_name);
 | 
			
		||||
          r = do_nftw(path, fn, fdlimit - 1, flags, level + 1);
 | 
			
		||||
          if (r)
 | 
			
		||||
            {
 | 
			
		||||
              closedir(dir);
 | 
			
		||||
              return r;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      path[l] = '\0';
 | 
			
		||||
      closedir(dir);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (flags & FTW_DEPTH)
 | 
			
		||||
    {
 | 
			
		||||
      r = call_nftw(path, fn, flags, base, level, &buf, info);
 | 
			
		||||
      if (r)
 | 
			
		||||
        {
 | 
			
		||||
          return r;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
int nftw(FAR const char *path, nftw_cb_t fn, int fdlimit, int flags)
 | 
			
		||||
{
 | 
			
		||||
  char pathbuf[PATH_MAX + 1];
 | 
			
		||||
 | 
			
		||||
  strncpy(pathbuf, path, PATH_MAX);
 | 
			
		||||
  pathbuf[PATH_MAX] = '\0';
 | 
			
		||||
 | 
			
		||||
  return do_nftw(pathbuf, fn, fdlimit, flags, 0);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,117 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * libs/libc-musl/dirent/lib_readdirr.c
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed to the Apache Software Foundation (ASF) under one or more
 | 
			
		||||
 * contributor license agreements.  See the NOTICE file distributed with
 | 
			
		||||
 * this work for additional information regarding copyright ownership.  The
 | 
			
		||||
 * ASF licenses this file to you under the Apache License, Version 2.0 (the
 | 
			
		||||
 * "License"); you may not use this file except in compliance with the
 | 
			
		||||
 * License.  You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *   http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 | 
			
		||||
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
 | 
			
		||||
 * License for the specific language governing permissions and limitations
 | 
			
		||||
 * under the License.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
* @file lib_readdirr.c
 | 
			
		||||
* @brief nuttx source code
 | 
			
		||||
*        https://github.com/apache/incubator-nuttx.git
 | 
			
		||||
* @version 10.3.0 
 | 
			
		||||
* @author AIIT XUOS Lab
 | 
			
		||||
* @date 2022-08-04
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <dirent.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
 | 
			
		||||
#include <nuttx/fs/fs.h>
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Private Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: readdir_r
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   The readdir() function returns a pointer to a dirent
 | 
			
		||||
 *   structure representing the next directory entry in the
 | 
			
		||||
 *   directory stream pointed to by dir.  It returns NULL on
 | 
			
		||||
 *   reaching the end-of-file or if an error occurred.
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   dirp -- An instance of type DIR created by a previous
 | 
			
		||||
 *     call to opendir();
 | 
			
		||||
 *   entry -- The  storage  pointed to by entry must be large
 | 
			
		||||
 *     enough for a dirent with an array of char d_name
 | 
			
		||||
 *     members containing at least {NAME_MAX}+1 elements.
 | 
			
		||||
 *   result -- Upon successful return, the pointer returned
 | 
			
		||||
 *     at *result shall have the  same  value  as  the
 | 
			
		||||
 *     argument entry. Upon reaching the end of the directory
 | 
			
		||||
 *     stream, this pointer shall have the value NULL.
 | 
			
		||||
 *
 | 
			
		||||
 * Returned Value:
 | 
			
		||||
 *   If successful, the readdir_r() function return s zero;
 | 
			
		||||
 *   otherwise, an error number is returned to indicate the
 | 
			
		||||
 *   error.
 | 
			
		||||
 *
 | 
			
		||||
 *   EBADF   - Invalid directory stream descriptor dir
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
int readdir_r(FAR DIR *dirp, FAR struct dirent *entry,
 | 
			
		||||
              FAR struct dirent **result)
 | 
			
		||||
{
 | 
			
		||||
  struct dirent *tmp;
 | 
			
		||||
 | 
			
		||||
  /* NOTE: The following use or errno is *not* thread-safe */
 | 
			
		||||
 | 
			
		||||
  set_errno(0);
 | 
			
		||||
  tmp = readdir(dirp);
 | 
			
		||||
  if (!tmp)
 | 
			
		||||
    {
 | 
			
		||||
      int error = get_errno();
 | 
			
		||||
      if (!error)
 | 
			
		||||
        {
 | 
			
		||||
          if (result)
 | 
			
		||||
            {
 | 
			
		||||
              *result = NULL;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
          return 0;
 | 
			
		||||
        }
 | 
			
		||||
      else
 | 
			
		||||
        {
 | 
			
		||||
          return error;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (entry)
 | 
			
		||||
    {
 | 
			
		||||
      memcpy(entry, tmp, sizeof(struct dirent));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (result)
 | 
			
		||||
    {
 | 
			
		||||
      *result = entry;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,237 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * libs/libc-musl/dirent/lib_scandir.c
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed to the Apache Software Foundation (ASF) under one or more
 | 
			
		||||
 * contributor license agreements.  See the NOTICE file distributed with
 | 
			
		||||
 * this work for additional information regarding copyright ownership.  The
 | 
			
		||||
 * ASF licenses this file to you under the Apache License, Version 2.0 (the
 | 
			
		||||
 * "License"); you may not use this file except in compliance with the
 | 
			
		||||
 * License.  You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *   http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 | 
			
		||||
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
 | 
			
		||||
 * License for the specific language governing permissions and limitations
 | 
			
		||||
 * under the License.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
* @file lib_scandir.c
 | 
			
		||||
* @brief nuttx source code
 | 
			
		||||
*        https://github.com/apache/incubator-nuttx.git
 | 
			
		||||
* @version 10.3.0 
 | 
			
		||||
* @author AIIT XUOS Lab
 | 
			
		||||
* @date 2022-08-04
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <dirent.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
 | 
			
		||||
#include "libc-musl.h"
 | 
			
		||||
 | 
			
		||||
/* The scandir() function is not appropriate for use within the kernel in its
 | 
			
		||||
 * current form because it uses user space memory allocators and modifies
 | 
			
		||||
 * the errno value.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __KERNEL__
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: scandir
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   The scandir() function scans the directory dirp, calling filter() on
 | 
			
		||||
 *   each directory entry.  Entries for which filter() returns nonzero are
 | 
			
		||||
 *   stored in strings allocated via malloc(), sorted using qsort() with
 | 
			
		||||
 *   comparison function compar(), and collected in array namelist which is
 | 
			
		||||
 *   allocated via malloc().  If filter is NULL, all entries are selected.
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   path     - Pathname of the directory to scan
 | 
			
		||||
 *   namelist - An array of pointers to directory entries, which is allocated
 | 
			
		||||
 *              by scandir via malloc.  Each directory entry is allocated via
 | 
			
		||||
 *              malloc as well.  The caller is responsible to free said
 | 
			
		||||
 *              objects.
 | 
			
		||||
 *   filter   - Directory entries for which filter returns zero are not
 | 
			
		||||
 *              included in the namelist.  If filter is NULL, all entries are
 | 
			
		||||
 *              included.
 | 
			
		||||
 *   compar   - Comparison function used with qsort() to sort the namelist.
 | 
			
		||||
 *
 | 
			
		||||
 * Returned Value:
 | 
			
		||||
 *   If successful, the scandir() function returns the number of entries in
 | 
			
		||||
 *   the namelist.  Otherwise, it returns -1 and errno is set to indicate the
 | 
			
		||||
 *   error.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
int scandir(FAR const char *path, FAR struct dirent ***namelist,
 | 
			
		||||
            CODE int (*filter)(FAR const struct dirent *),
 | 
			
		||||
            CODE int (*compar)(FAR const struct dirent **,
 | 
			
		||||
                               FAR const struct dirent **))
 | 
			
		||||
{
 | 
			
		||||
  FAR struct dirent *d;
 | 
			
		||||
  FAR struct dirent *dnew;
 | 
			
		||||
  FAR struct dirent **list = NULL;
 | 
			
		||||
  size_t listsize = 0;
 | 
			
		||||
  size_t cnt = 0;
 | 
			
		||||
  int errsv;
 | 
			
		||||
  int result;
 | 
			
		||||
  FAR DIR *dirp;
 | 
			
		||||
 | 
			
		||||
  /* This scandir implementation relies on errno being set by other service
 | 
			
		||||
   * functions that it is calling to figure if it was successful.  We save
 | 
			
		||||
   * the original errno value to be able to restore it in case of success.
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  errsv = get_errno();
 | 
			
		||||
 | 
			
		||||
  dirp = opendir(path);
 | 
			
		||||
 | 
			
		||||
  if (!dirp)
 | 
			
		||||
    {
 | 
			
		||||
      return -1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* opendir might have set errno.  Reset to zero. */
 | 
			
		||||
 | 
			
		||||
  set_errno(0);
 | 
			
		||||
 | 
			
		||||
  for (d = readdir(dirp); d != NULL; d = readdir(dirp))
 | 
			
		||||
    {
 | 
			
		||||
      size_t dsize;
 | 
			
		||||
 | 
			
		||||
      /* If the caller provided a filter function which tells scandir to skip
 | 
			
		||||
       * the current directory entry, do so.
 | 
			
		||||
       */
 | 
			
		||||
 | 
			
		||||
      if (filter && !filter(d))
 | 
			
		||||
        {
 | 
			
		||||
          continue;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      /* The caller provided filter function might have set errno.  Reset to
 | 
			
		||||
       * zero.
 | 
			
		||||
       */
 | 
			
		||||
 | 
			
		||||
      set_errno(0);
 | 
			
		||||
 | 
			
		||||
      /* Grow the directory entry list, if required. */
 | 
			
		||||
 | 
			
		||||
      if (cnt == listsize)
 | 
			
		||||
        {
 | 
			
		||||
          struct dirent **newlist;
 | 
			
		||||
 | 
			
		||||
          if (!listsize)
 | 
			
		||||
            {
 | 
			
		||||
              listsize = 4;
 | 
			
		||||
            }
 | 
			
		||||
          else
 | 
			
		||||
            {
 | 
			
		||||
              listsize *= 2;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
          newlist = lib_realloc(list, listsize * sizeof(*list));
 | 
			
		||||
 | 
			
		||||
          if (!newlist)
 | 
			
		||||
            {
 | 
			
		||||
              /* realloc failed and set errno.  This will tell follow up code
 | 
			
		||||
               * that we failed.
 | 
			
		||||
               */
 | 
			
		||||
 | 
			
		||||
              break;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
          list = newlist;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      /* Allocate a new directory entry, but restrict its heap size to what
 | 
			
		||||
       * is really required given the directories' path name.
 | 
			
		||||
       */
 | 
			
		||||
 | 
			
		||||
      dsize = (size_t)(&d->d_name[strlen(d->d_name) + 1] - (char *)d);
 | 
			
		||||
      dnew = lib_malloc(dsize);
 | 
			
		||||
      if (!dnew)
 | 
			
		||||
        {
 | 
			
		||||
          /* malloc failed and set errno.  This will tell follow up code that
 | 
			
		||||
           * we failed.
 | 
			
		||||
           */
 | 
			
		||||
 | 
			
		||||
          break;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      /* Copy directory entry to newly allocated one and update the list
 | 
			
		||||
       * accordingly.
 | 
			
		||||
       */
 | 
			
		||||
 | 
			
		||||
      memcpy(dnew, d, dsize);
 | 
			
		||||
      list[cnt] = dnew;
 | 
			
		||||
      cnt++;
 | 
			
		||||
 | 
			
		||||
      /* Some service function might have set errno as a side effect.  Reset
 | 
			
		||||
       * to zero.
 | 
			
		||||
       */
 | 
			
		||||
 | 
			
		||||
      set_errno(0);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (get_errno() == 0)
 | 
			
		||||
    {
 | 
			
		||||
      /* If the caller provided a comparison function, use it to sort the
 | 
			
		||||
       * list of directory entries.
 | 
			
		||||
       */
 | 
			
		||||
 | 
			
		||||
      if (compar)
 | 
			
		||||
        {
 | 
			
		||||
          typedef int (*compar_fn_t)(FAR const void *, FAR const void *);
 | 
			
		||||
          qsort(list, cnt, sizeof(*list), (compar_fn_t)compar);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      /* Set the output parameters. */
 | 
			
		||||
 | 
			
		||||
      *namelist = list;
 | 
			
		||||
      result = (int)cnt;
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    {
 | 
			
		||||
      size_t i;
 | 
			
		||||
 | 
			
		||||
      /* Something failed along the way.  Clean up. */
 | 
			
		||||
 | 
			
		||||
      for (i = 0; i < cnt; i++)
 | 
			
		||||
        {
 | 
			
		||||
          lib_free(list[i]);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      lib_free(list);
 | 
			
		||||
 | 
			
		||||
      result = -1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  closedir(dirp);
 | 
			
		||||
 | 
			
		||||
  if (result >= 0)
 | 
			
		||||
    {
 | 
			
		||||
      /* Restore original errno value in case of success. */
 | 
			
		||||
 | 
			
		||||
      set_errno(errsv);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif /* __KERNEL__ */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,84 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * libs/libc-musl/dirent/lib_telldir.c
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed to the Apache Software Foundation (ASF) under one or more
 | 
			
		||||
 * contributor license agreements.  See the NOTICE file distributed with
 | 
			
		||||
 * this work for additional information regarding copyright ownership.  The
 | 
			
		||||
 * ASF licenses this file to you under the Apache License, Version 2.0 (the
 | 
			
		||||
 * "License"); you may not use this file except in compliance with the
 | 
			
		||||
 * License.  You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *   http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 | 
			
		||||
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
 | 
			
		||||
 * License for the specific language governing permissions and limitations
 | 
			
		||||
 * under the License.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
* @file lib_telldir.c
 | 
			
		||||
* @brief nuttx source code
 | 
			
		||||
*        https://github.com/apache/incubator-nuttx.git
 | 
			
		||||
* @version 10.3.0 
 | 
			
		||||
* @author AIIT XUOS Lab
 | 
			
		||||
* @date 2022-08-04
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
#include <dirent.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
 | 
			
		||||
#include <nuttx/fs/fs.h>
 | 
			
		||||
#include <nuttx/fs/dirent.h>
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Private Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: telldir
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   The telldir() function returns the current location
 | 
			
		||||
 *   associated with the directory stream dirp.
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   dirp -- An instance of type DIR created by a previous
 | 
			
		||||
 *     call to opendir();
 | 
			
		||||
 *
 | 
			
		||||
 * Returned Value:
 | 
			
		||||
 *   On success, the telldir() function returns the current
 | 
			
		||||
 *   location in the directory stream.  On error, -1 is
 | 
			
		||||
 *   returned, and errno is set appropriately.
 | 
			
		||||
 *
 | 
			
		||||
 *   EBADF - Invalid directory stream descriptor dir
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
off_t telldir(FAR DIR *dirp)
 | 
			
		||||
{
 | 
			
		||||
  struct fs_dirent_s *idir = (struct fs_dirent_s *)dirp;
 | 
			
		||||
 | 
			
		||||
  if (!idir || !idir->fd_root)
 | 
			
		||||
    {
 | 
			
		||||
      set_errno(EBADF);
 | 
			
		||||
      return (off_t)-1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* Just return the current position */
 | 
			
		||||
 | 
			
		||||
  return idir->fd_position;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,32 @@
 | 
			
		|||
############################################################################
 | 
			
		||||
# libs/libc-musl/dlfcn/Make.defs
 | 
			
		||||
#
 | 
			
		||||
# 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.
 | 
			
		||||
#
 | 
			
		||||
############################################################################
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_LIBC_DLFCN),y)
 | 
			
		||||
 | 
			
		||||
# Add the dlfcn.h files to the build
 | 
			
		||||
 | 
			
		||||
CSRCS += lib_dlopen.c lib_dlclose.c lib_dlsym.c lib_dlerror.c lib_dlsymtab.c
 | 
			
		||||
 | 
			
		||||
# Add the dlfcn.h directory to the build
 | 
			
		||||
 | 
			
		||||
DEPPATH += --dep-path dlfcn
 | 
			
		||||
VPATH += :dlfcn
 | 
			
		||||
 | 
			
		||||
endif
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,261 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * libs/libc-musl/dlfcn/lib_dlclose.c
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed to the Apache Software Foundation (ASF) under one or more
 | 
			
		||||
 * contributor license agreements.  See the NOTICE file distributed with
 | 
			
		||||
 * this work for additional information regarding copyright ownership.  The
 | 
			
		||||
 * ASF licenses this file to you under the Apache License, Version 2.0 (the
 | 
			
		||||
 * "License"); you may not use this file except in compliance with the
 | 
			
		||||
 * License.  You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *   http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 | 
			
		||||
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
 | 
			
		||||
 * License for the specific language governing permissions and limitations
 | 
			
		||||
 * under the License.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
* @file lib_dlclose.c
 | 
			
		||||
* @brief nuttx source code
 | 
			
		||||
*        https://github.com/apache/incubator-nuttx.git
 | 
			
		||||
* @version 10.3.0 
 | 
			
		||||
* @author AIIT XUOS Lab
 | 
			
		||||
* @date 2022-08-04
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <dlfcn.h>
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <debug.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
 | 
			
		||||
#include <nuttx/module.h>
 | 
			
		||||
#include <nuttx/lib/modlib.h>
 | 
			
		||||
 | 
			
		||||
#include "libc-musl.h"
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Private Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: dlremove
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Remove a previously installed shared library from memory.
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   handle - The shared library handle previously returned by dlopen().
 | 
			
		||||
 *
 | 
			
		||||
 * Returned Value:
 | 
			
		||||
 *   Zero (OK) on success.  On any failure, -1 (ERROR) is returned the
 | 
			
		||||
 *   errno value is set appropriately.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_BUILD_PROTECTED
 | 
			
		||||
static inline int dlremove(FAR void *handle)
 | 
			
		||||
{
 | 
			
		||||
  FAR struct module_s *modp = (FAR struct module_s *)handle;
 | 
			
		||||
  int ret;
 | 
			
		||||
 | 
			
		||||
  DEBUGASSERT(modp != NULL);
 | 
			
		||||
 | 
			
		||||
  /* Get exclusive access to the module registry */
 | 
			
		||||
 | 
			
		||||
  modlib_registry_lock();
 | 
			
		||||
 | 
			
		||||
  /* Verify that the module is in the registry */
 | 
			
		||||
 | 
			
		||||
  ret = modlib_registry_verify(modp);
 | 
			
		||||
  if (ret < 0)
 | 
			
		||||
    {
 | 
			
		||||
      serr("ERROR: Failed to verify module: %d\n", ret);
 | 
			
		||||
      goto errout_with_lock;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if CONFIG_MODLIB_MAXDEPEND > 0
 | 
			
		||||
  /* Refuse to remove any module that other modules may depend upon. */
 | 
			
		||||
 | 
			
		||||
  if (modp->dependents > 0)
 | 
			
		||||
    {
 | 
			
		||||
      serr("ERROR: Module has dependents: %d\n", modp->dependents);
 | 
			
		||||
      ret = -EBUSY;
 | 
			
		||||
      goto errout_with_lock;
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  /* Is there an uninitializer? */
 | 
			
		||||
 | 
			
		||||
  if (modp->modinfo.uninitializer != NULL)
 | 
			
		||||
    {
 | 
			
		||||
      /* Try to uninitialize the module */
 | 
			
		||||
 | 
			
		||||
      ret = modp->modinfo.uninitializer(modp->modinfo.arg);
 | 
			
		||||
 | 
			
		||||
      /* Did the module successfully uninitialize? */
 | 
			
		||||
 | 
			
		||||
      if (ret < 0)
 | 
			
		||||
        {
 | 
			
		||||
          serr("ERROR: Failed to uninitialize the module: %d\n", ret);
 | 
			
		||||
          goto errout_with_lock;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      /* Nullify so that the uninitializer cannot be called again */
 | 
			
		||||
 | 
			
		||||
      modp->modinfo.uninitializer = NULL;
 | 
			
		||||
#if defined(CONFIG_FS_PROCFS) && !defined(CONFIG_FS_PROCFS_EXCLUDE_MODULE)
 | 
			
		||||
      modp->initializer           = NULL;
 | 
			
		||||
      modp->modinfo.arg           = NULL;
 | 
			
		||||
      modp->modinfo.exports       = NULL;
 | 
			
		||||
      modp->modinfo.nexports      = 0;
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* Release resources held by the module */
 | 
			
		||||
 | 
			
		||||
  if (modp->textalloc != NULL)
 | 
			
		||||
    {
 | 
			
		||||
      /* Free the module memory */
 | 
			
		||||
 | 
			
		||||
      lib_free((FAR void *)modp->textalloc);
 | 
			
		||||
 | 
			
		||||
      /* Nullify so that the memory cannot be freed again */
 | 
			
		||||
 | 
			
		||||
      modp->textalloc = NULL;
 | 
			
		||||
#if defined(CONFIG_FS_PROCFS) && !defined(CONFIG_FS_PROCFS_EXCLUDE_MODULE)
 | 
			
		||||
      modp->textsize  = 0;
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (modp->dataalloc != NULL)
 | 
			
		||||
    {
 | 
			
		||||
      /* Free the module memory */
 | 
			
		||||
 | 
			
		||||
      lib_free((FAR void *)modp->dataalloc);
 | 
			
		||||
 | 
			
		||||
      /* Nullify so that the memory cannot be freed again */
 | 
			
		||||
 | 
			
		||||
      modp->dataalloc = NULL;
 | 
			
		||||
#if defined(CONFIG_FS_PROCFS) && !defined(CONFIG_FS_PROCFS_EXCLUDE_MODULE)
 | 
			
		||||
      modp->datasize  = 0;
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* Remove the module from the registry */
 | 
			
		||||
 | 
			
		||||
  ret = modlib_registry_del(modp);
 | 
			
		||||
  if (ret < 0)
 | 
			
		||||
    {
 | 
			
		||||
      serr("ERROR: Failed to remove the module from the registry: %d\n",
 | 
			
		||||
           ret);
 | 
			
		||||
      goto errout_with_lock;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if CONFIG_MODLIB_MAXDEPEND > 0
 | 
			
		||||
  /* Eliminate any dependencies that this module has on other modules */
 | 
			
		||||
 | 
			
		||||
  modlib_undepend(modp);
 | 
			
		||||
#endif
 | 
			
		||||
  modlib_registry_unlock();
 | 
			
		||||
 | 
			
		||||
  /* And free the registry entry */
 | 
			
		||||
 | 
			
		||||
  lib_free(modp);
 | 
			
		||||
  return OK;
 | 
			
		||||
 | 
			
		||||
errout_with_lock:
 | 
			
		||||
  modlib_registry_unlock();
 | 
			
		||||
  set_errno(-ret);
 | 
			
		||||
  return ERROR;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: dlclose
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   dlclose() is used to inform the system that the object referenced by a
 | 
			
		||||
 *   handle returned from a previous dlopen() invocation is no longer needed
 | 
			
		||||
 *   by the application.
 | 
			
		||||
 *
 | 
			
		||||
 *   The use of dlclose() reflects a statement of intent on the part of the
 | 
			
		||||
 *   process, but does not create any requirement upon the implementation,
 | 
			
		||||
 *   such as removal of the code or symbols referenced by handle. Once an
 | 
			
		||||
 *   object has been closed using dlclose() an application should assume
 | 
			
		||||
 *   that its symbols are no longer available to dlsym(). All objects loaded
 | 
			
		||||
 *   automatically as a result of invoking dlopen() on the referenced object
 | 
			
		||||
 *   are also closed.
 | 
			
		||||
 *
 | 
			
		||||
 *   Although a dlclose() operation is not required to remove structures
 | 
			
		||||
 *   from an address space, neither is an implementation prohibited from
 | 
			
		||||
 *   doing so. The only restriction on such a removal is that no object will
 | 
			
		||||
 *   be removed to which references have been relocated, until or unless all
 | 
			
		||||
 *   such references are removed. For instance, an object that had been
 | 
			
		||||
 *   loaded with a dlopen() operation specifying the RTLD_GLOBAL flag might
 | 
			
		||||
 *   provide a target for dynamic relocations performed in the processing of
 | 
			
		||||
 *   other objects - in such environments, an application may assume that no
 | 
			
		||||
 *   relocation, once made, will be undone or remade unless the object
 | 
			
		||||
 *   requiring the relocation has itself been removed.
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   handle - The opaque, non-NULL value returned by a previous successful
 | 
			
		||||
 *            call to dlopen().
 | 
			
		||||
 *
 | 
			
		||||
 * Returned Value:
 | 
			
		||||
 *   If the referenced object was successfully closed, dlclose() returns 0.
 | 
			
		||||
 *   If the object could not be closed, or if handle does not refer to an
 | 
			
		||||
 *   open object, dlclose() returns a non-zero value. More detailed
 | 
			
		||||
 *   diagnostic information will be available through dlerror().
 | 
			
		||||
 *
 | 
			
		||||
 * Reference: OpenGroup.org
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
int dlclose(FAR void *handle)
 | 
			
		||||
{
 | 
			
		||||
#if defined(CONFIG_BUILD_FLAT)
 | 
			
		||||
  /* In the FLAT build, a shared library is essentially the same as a kernel
 | 
			
		||||
   * module.
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  return rmmod(handle);
 | 
			
		||||
 | 
			
		||||
#elif defined(CONFIG_BUILD_PROTECTED)
 | 
			
		||||
  /* The PROTECTED build is equivalent to the FLAT build EXCEPT that there
 | 
			
		||||
   * must be two copies of the module logic:  One residing in kernel
 | 
			
		||||
   * space and using the kernel symbol table and one residing in user space
 | 
			
		||||
   * using the user space symbol table.
 | 
			
		||||
   *
 | 
			
		||||
   * dlremove() is essentially a clone of rmmod().
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  return dlremove(handle);
 | 
			
		||||
 | 
			
		||||
#else /* if defined(CONFIG_BUILD_KERNEL) */
 | 
			
		||||
  /* The KERNEL build is considerably more complex:  In order to be shared,
 | 
			
		||||
   * the .text portion of the module must be (1) build for PIC/PID operation
 | 
			
		||||
   * and (2) must like in a shared memory region accessible from all
 | 
			
		||||
   * processes.  The .data/.bss portion of the module must be allocated in
 | 
			
		||||
   * the user space of each process, but must lie at the same virtual address
 | 
			
		||||
   * so that it can be referenced from the one copy of the text in the shared
 | 
			
		||||
   * memory region.
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
#warning Missing logic
 | 
			
		||||
  return -ENOSYS;
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,68 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * libs/libc-musl/dlfcn/lib_dlerror.c
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed to the Apache Software Foundation (ASF) under one or more
 | 
			
		||||
 * contributor license agreements.  See the NOTICE file distributed with
 | 
			
		||||
 * this work for additional information regarding copyright ownership.  The
 | 
			
		||||
 * ASF licenses this file to you under the Apache License, Version 2.0 (the
 | 
			
		||||
 * "License"); you may not use this file except in compliance with the
 | 
			
		||||
 * License.  You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *   http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 | 
			
		||||
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
 | 
			
		||||
 * License for the specific language governing permissions and limitations
 | 
			
		||||
 * under the License.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
* @file lib_dlerror.c
 | 
			
		||||
* @brief nuttx source code
 | 
			
		||||
*        https://github.com/apache/incubator-nuttx.git
 | 
			
		||||
* @version 10.3.0 
 | 
			
		||||
* @author AIIT XUOS Lab
 | 
			
		||||
* @date 2022-08-04
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
#include <dlfcn.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: dlerror
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   dlerror() returns a null-terminated character string (with no trailing
 | 
			
		||||
 *   newline) that describes the last error that occurred during dynamic
 | 
			
		||||
 *   linking processing. If no dynamic linking errors have occurred since
 | 
			
		||||
 *   the last invocation of dlerror(), dlerror() returns NULL. Thus,
 | 
			
		||||
 *   invoking dlerror() a second time, immediately following a prior
 | 
			
		||||
 *   invocation, will result in NULL being returned.
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   If successful, dlerror() returns a null-terminated character string.
 | 
			
		||||
 *   Otherwise, NULL is returned.
 | 
			
		||||
 *
 | 
			
		||||
 * Returned Value:
 | 
			
		||||
 *
 | 
			
		||||
 * Reference: OpenGroup.org
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
FAR char *dlerror(void)
 | 
			
		||||
{
 | 
			
		||||
  return (FAR char *)strerror(get_errno());
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,474 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * libs/libc-musl/dlfcn/lib_dlopen.c
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed to the Apache Software Foundation (ASF) under one or more
 | 
			
		||||
 * contributor license agreements.  See the NOTICE file distributed with
 | 
			
		||||
 * this work for additional information regarding copyright ownership.  The
 | 
			
		||||
 * ASF licenses this file to you under the Apache License, Version 2.0 (the
 | 
			
		||||
 * "License"); you may not use this file except in compliance with the
 | 
			
		||||
 * License.  You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *   http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 | 
			
		||||
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
 | 
			
		||||
 * License for the specific language governing permissions and limitations
 | 
			
		||||
 * under the License.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
* @file lib_dlopen.c
 | 
			
		||||
* @brief nuttx source code
 | 
			
		||||
*        https://github.com/apache/incubator-nuttx.git
 | 
			
		||||
* @version 10.3.0 
 | 
			
		||||
* @author AIIT XUOS Lab
 | 
			
		||||
* @date 2022-08-04
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <libgen.h>
 | 
			
		||||
#include <dlfcn.h>
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <debug.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
 | 
			
		||||
#include <nuttx/envpath.h>
 | 
			
		||||
#include <nuttx/module.h>
 | 
			
		||||
#include <nuttx/lib/modlib.h>
 | 
			
		||||
 | 
			
		||||
#include "libc-musl.h"
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Private Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: dldump_loadinfo
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_BUILD_PROTECTED
 | 
			
		||||
#if defined(CONFIG_DEBUG_INFO) && defined(CONFIG_DEBUG_BINFMT)
 | 
			
		||||
static void dldump_loadinfo(FAR struct mod_loadinfo_s *loadinfo)
 | 
			
		||||
{
 | 
			
		||||
  int i;
 | 
			
		||||
 | 
			
		||||
  binfo("LOAD_INFO:\n");
 | 
			
		||||
  binfo("  textalloc:    %08lx\n", (long)loadinfo->textalloc);
 | 
			
		||||
  binfo("  datastart:    %08lx\n", (long)loadinfo->datastart);
 | 
			
		||||
  binfo("  textsize:     %ld\n",   (long)loadinfo->textsize);
 | 
			
		||||
  binfo("  datasize:     %ld\n",   (long)loadinfo->datasize);
 | 
			
		||||
  binfo("  filelen:      %ld\n",   (long)loadinfo->filelen);
 | 
			
		||||
  binfo("  filfd:        %d\n",    loadinfo->filfd);
 | 
			
		||||
  binfo("  symtabidx:    %d\n",    loadinfo->symtabidx);
 | 
			
		||||
  binfo("  strtabidx:    %d\n",    loadinfo->strtabidx);
 | 
			
		||||
 | 
			
		||||
  binfo("ELF Header:\n");
 | 
			
		||||
  binfo("  e_ident:      %02x %02x %02x %02x\n",
 | 
			
		||||
    loadinfo->ehdr.e_ident[0], loadinfo->ehdr.e_ident[1],
 | 
			
		||||
    loadinfo->ehdr.e_ident[2], loadinfo->ehdr.e_ident[3]);
 | 
			
		||||
  binfo("  e_type:       %04x\n",  loadinfo->ehdr.e_type);
 | 
			
		||||
  binfo("  e_machine:    %04x\n",  loadinfo->ehdr.e_machine);
 | 
			
		||||
  binfo("  e_version:    %08x\n",  loadinfo->ehdr.e_version);
 | 
			
		||||
  binfo("  e_entry:      %08lx\n", (long)loadinfo->ehdr.e_entry);
 | 
			
		||||
  binfo("  e_phoff:      %d\n",    loadinfo->ehdr.e_phoff);
 | 
			
		||||
  binfo("  e_shoff:      %d\n",    loadinfo->ehdr.e_shoff);
 | 
			
		||||
  binfo("  e_flags:      %08x\n" , loadinfo->ehdr.e_flags);
 | 
			
		||||
  binfo("  e_ehsize:     %d\n",    loadinfo->ehdr.e_ehsize);
 | 
			
		||||
  binfo("  e_phentsize:  %d\n",    loadinfo->ehdr.e_phentsize);
 | 
			
		||||
  binfo("  e_phnum:      %d\n",    loadinfo->ehdr.e_phnum);
 | 
			
		||||
  binfo("  e_shentsize:  %d\n",    loadinfo->ehdr.e_shentsize);
 | 
			
		||||
  binfo("  e_shnum:      %d\n",    loadinfo->ehdr.e_shnum);
 | 
			
		||||
  binfo("  e_shstrndx:   %d\n",    loadinfo->ehdr.e_shstrndx);
 | 
			
		||||
 | 
			
		||||
  if (loadinfo->shdr && loadinfo->ehdr.e_shnum > 0)
 | 
			
		||||
    {
 | 
			
		||||
      for (i = 0; i < loadinfo->ehdr.e_shnum; i++)
 | 
			
		||||
        {
 | 
			
		||||
          FAR Elf_Shdr *shdr = &loadinfo->shdr[i];
 | 
			
		||||
          binfo("Sections %d:\n", i);
 | 
			
		||||
          binfo("  sh_name:      %08x\n", shdr->sh_name);
 | 
			
		||||
          binfo("  sh_type:      %08x\n", shdr->sh_type);
 | 
			
		||||
          binfo("  sh_flags:     %08x\n", shdr->sh_flags);
 | 
			
		||||
          binfo("  sh_addr:      %08x\n", shdr->sh_addr);
 | 
			
		||||
          binfo("  sh_offset:    %d\n",   shdr->sh_offset);
 | 
			
		||||
          binfo("  sh_size:      %d\n",   shdr->sh_size);
 | 
			
		||||
          binfo("  sh_link:      %d\n",   shdr->sh_link);
 | 
			
		||||
          binfo("  sh_info:      %d\n",   shdr->sh_info);
 | 
			
		||||
          binfo("  sh_addralign: %d\n",   shdr->sh_addralign);
 | 
			
		||||
          binfo("  sh_entsize:   %d\n",   shdr->sh_entsize);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
#else
 | 
			
		||||
# define dldump_loadinfo(i)
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: dldump_initializer
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_BUILD_PROTECTED
 | 
			
		||||
#ifdef CONFIG_MODLIB_DUMPBUFFER
 | 
			
		||||
static void dldump_initializer(mod_initializer_t initializer,
 | 
			
		||||
                               FAR struct mod_loadinfo_s *loadinfo)
 | 
			
		||||
{
 | 
			
		||||
  modlib_dumpbuffer("Initializer code", (FAR const uint8_t *)initializer,
 | 
			
		||||
                    MIN(loadinfo->textsize - loadinfo->ehdr.e_entry, 512));
 | 
			
		||||
}
 | 
			
		||||
#else
 | 
			
		||||
# define dldump_initializer(b,l)
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: dlinsert
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Verify that the file is an ELF module binary and, if so, load the
 | 
			
		||||
 *   shared library into user memory and initialize it for use.
 | 
			
		||||
 *
 | 
			
		||||
 *   NOTE: modlib_setsymtab() had to have been called by application logic
 | 
			
		||||
 *   logic prior to calling this.  Otherwise, dlinsert will be unable to
 | 
			
		||||
 *   resolve symbols in the OS module.
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   filename - Full path to the shared library file to be loaded
 | 
			
		||||
 *
 | 
			
		||||
 * Returned Value:
 | 
			
		||||
 *   A non-NULL module handle that can be used on subsequent calls to other
 | 
			
		||||
 *   shared library interfaces is returned on success.  If insmod() was
 | 
			
		||||
 *   unable to load the module insmod() will return a NULL handle and the
 | 
			
		||||
 *   errno variable will be set appropriately.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_BUILD_PROTECTED
 | 
			
		||||
/* The PROTECTED build is equivalent to the FLAT build EXCEPT that there
 | 
			
		||||
 * must be two copies of the module logic:  One residing in kernel
 | 
			
		||||
 * space and using the kernel symbol table and one residing in user space
 | 
			
		||||
 * using the user space symbol table.
 | 
			
		||||
 *
 | 
			
		||||
 * dlinsert() is essentially a clone of insmod().
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
static inline FAR void *dlinsert(FAR const char *filename)
 | 
			
		||||
{
 | 
			
		||||
  struct mod_loadinfo_s loadinfo;
 | 
			
		||||
  FAR struct module_s *modp;
 | 
			
		||||
  mod_initializer_t initializer;
 | 
			
		||||
  int ret;
 | 
			
		||||
 | 
			
		||||
  binfo("Loading file: %s\n", filename);
 | 
			
		||||
 | 
			
		||||
  /* Get exclusive access to the module registry */
 | 
			
		||||
 | 
			
		||||
  modlib_registry_lock();
 | 
			
		||||
 | 
			
		||||
  /* Initialize the ELF library to load the program binary. */
 | 
			
		||||
 | 
			
		||||
  ret = modlib_initialize(filename, &loadinfo);
 | 
			
		||||
  dldump_loadinfo(&loadinfo);
 | 
			
		||||
  if (ret != 0)
 | 
			
		||||
    {
 | 
			
		||||
      serr("ERROR: Failed to initialize to load module: %d\n", ret);
 | 
			
		||||
      goto errout_with_lock;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* Allocate a module registry entry to hold the module data */
 | 
			
		||||
 | 
			
		||||
  modp = (FAR struct module_s *)lib_zalloc(sizeof(struct module_s));
 | 
			
		||||
  if (ret != 0)
 | 
			
		||||
    {
 | 
			
		||||
      binfo("Failed to initialize for load of ELF program: %d\n", ret);
 | 
			
		||||
      goto errout_with_loadinfo;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* Load the program binary */
 | 
			
		||||
 | 
			
		||||
  ret = modlib_load(&loadinfo);
 | 
			
		||||
  dldump_loadinfo(&loadinfo);
 | 
			
		||||
  if (ret != 0)
 | 
			
		||||
    {
 | 
			
		||||
      binfo("Failed to load ELF program binary: %d\n", ret);
 | 
			
		||||
      goto errout_with_registry_entry;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* Bind the program to the kernel symbol table */
 | 
			
		||||
 | 
			
		||||
  ret = modlib_bind(modp, &loadinfo);
 | 
			
		||||
  if (ret != 0)
 | 
			
		||||
    {
 | 
			
		||||
      binfo("Failed to bind symbols program binary: %d\n", ret);
 | 
			
		||||
      goto errout_with_load;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* Save the load information */
 | 
			
		||||
 | 
			
		||||
  modp->textalloc       = (FAR void *)loadinfo.textalloc;
 | 
			
		||||
  modp->dataalloc       = (FAR void *)loadinfo.datastart;
 | 
			
		||||
#if defined(CONFIG_FS_PROCFS) && !defined(CONFIG_FS_PROCFS_EXCLUDE_MODULE)
 | 
			
		||||
  modp->textsize    = loadinfo.textsize;
 | 
			
		||||
  modp->datasize    = loadinfo.datasize;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  /* Get the module initializer entry point */
 | 
			
		||||
 | 
			
		||||
  initializer = (mod_initializer_t)(loadinfo.textalloc +
 | 
			
		||||
                                    loadinfo.ehdr.e_entry);
 | 
			
		||||
#if defined(CONFIG_FS_PROCFS) && !defined(CONFIG_FS_PROCFS_EXCLUDE_MODULE)
 | 
			
		||||
  modp->initializer = initializer;
 | 
			
		||||
#endif
 | 
			
		||||
  dldump_initializer(initializer, &loadinfo);
 | 
			
		||||
 | 
			
		||||
  /* Call the module initializer */
 | 
			
		||||
 | 
			
		||||
  ret = initializer(&modp->modinfo);
 | 
			
		||||
  if (ret < 0)
 | 
			
		||||
    {
 | 
			
		||||
      binfo("Failed to initialize the module: %d\n", ret);
 | 
			
		||||
      goto errout_with_load;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* Add the new module entry to the registry */
 | 
			
		||||
 | 
			
		||||
  modlib_registry_add(modp);
 | 
			
		||||
 | 
			
		||||
  modlib_uninitialize(&loadinfo);
 | 
			
		||||
  modlib_registry_unlock();
 | 
			
		||||
  return (FAR void *)modp;
 | 
			
		||||
 | 
			
		||||
errout_with_load:
 | 
			
		||||
  modlib_unload(&loadinfo);
 | 
			
		||||
  modlib_undepend(modp);
 | 
			
		||||
errout_with_registry_entry:
 | 
			
		||||
  lib_free(modp);
 | 
			
		||||
errout_with_loadinfo:
 | 
			
		||||
  modlib_uninitialize(&loadinfo);
 | 
			
		||||
errout_with_lock:
 | 
			
		||||
  modlib_registry_unlock();
 | 
			
		||||
  set_errno(-ret);
 | 
			
		||||
  return NULL;
 | 
			
		||||
}
 | 
			
		||||
#elif defined(CONFIG_BUILD_FLAT)
 | 
			
		||||
/* In the FLAT build, a shared library is essentially the same as a kernel
 | 
			
		||||
 * module.
 | 
			
		||||
 *
 | 
			
		||||
 * REVISIT:  Missing functionality:
 | 
			
		||||
 * - No automatic binding of symbols
 | 
			
		||||
 * - No dependencies
 | 
			
		||||
 * - mode is ignored.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
static inline FAR void *dlinsert(FAR const char *filename)
 | 
			
		||||
{
 | 
			
		||||
  FAR void *handle;
 | 
			
		||||
  FAR char *name;
 | 
			
		||||
 | 
			
		||||
  DEBUGASSERT(filename != NULL);
 | 
			
		||||
 | 
			
		||||
  name = strdup(filename);
 | 
			
		||||
  if (name == NULL)
 | 
			
		||||
    {
 | 
			
		||||
      return NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* Then install the file using the basename of the file as the module
 | 
			
		||||
   * name.
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  handle = insmod(filename, basename(name));
 | 
			
		||||
  lib_free(name);
 | 
			
		||||
  return handle;
 | 
			
		||||
}
 | 
			
		||||
#else /* if defined(CONFIG_BUILD_KERNEL) */
 | 
			
		||||
/* The KERNEL build is considerably more complex:  In order to be shared,
 | 
			
		||||
 * the .text portion of the module must be (1) build for PIC/PID operation
 | 
			
		||||
 * and (2) must like in a shared memory region accessible from all
 | 
			
		||||
 * processes.  The .data/.bss portion of the module must be allocated in
 | 
			
		||||
 * the user space of each process, but must lie at the same virtual address
 | 
			
		||||
 * so that it can be referenced from the one copy of the text in the shared
 | 
			
		||||
 * memory region.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
static inline FAR void *dlinsert(FAR const char *filename)
 | 
			
		||||
{
 | 
			
		||||
#warning Missing logic
 | 
			
		||||
  return NULL;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: dlopen
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   dlopen() makes an executable object file specified by file available to
 | 
			
		||||
 *   the calling program.  The class of files eligible for this operation and
 | 
			
		||||
 *   the manner of their construction are specified by the implementation,
 | 
			
		||||
 *   though typically such files are executable objects such as shared
 | 
			
		||||
 *   libraries, relocatable files or programs. Note that some implementations
 | 
			
		||||
 *   permit the construction of dependencies between such objects that are
 | 
			
		||||
 *   embedded within files. In such cases, a dlopen() operation will load
 | 
			
		||||
 *   such dependencies in addition to the object referenced by file.
 | 
			
		||||
 *   Implementations may also impose specific constraints on the construction
 | 
			
		||||
 *   of programs that can employ dlopen() and its related services.
 | 
			
		||||
 *
 | 
			
		||||
 *   If a file is specified in multiple dlopen() invocations, mode is
 | 
			
		||||
 *   interpreted at each invocation. Note, however, that once RTLD_NOW has
 | 
			
		||||
 *   been specified all relocations will have been completed rendering
 | 
			
		||||
 *   further RTLD_NOW operations redundant and any further RTLD_LAZY
 | 
			
		||||
 *   operations irrelevant.  Similarly note that once RTLD_GLOBAL has been
 | 
			
		||||
 *   specified the object will maintain the RTLD_GLOBAL status regardless
 | 
			
		||||
 *   of any previous or future specification of RTLD_LOCAL, so long as the
 | 
			
		||||
 *   object remains in the address space (see dlclose()).
 | 
			
		||||
 *
 | 
			
		||||
 *   Symbols introduced into a program through calls to dlopen() may be
 | 
			
		||||
 *   used in relocation activities. Symbols so introduced may duplicate
 | 
			
		||||
 *   symbols already defined by the program or previous dlopen()
 | 
			
		||||
 *   operations. To resolve the ambiguities such a situation might
 | 
			
		||||
 *   present, the resolution of a symbol reference to symbol definition is
 | 
			
		||||
 *   based on a symbol resolution order. Two such resolution orders are
 | 
			
		||||
 *   defined: load or dependency ordering. Load order establishes an
 | 
			
		||||
 *   ordering among symbol definitions, such that the definition first
 | 
			
		||||
 *   loaded (including definitions from the image file and any dependent
 | 
			
		||||
 *   objects loaded with it) has priority over objects added later (via
 | 
			
		||||
 *   dlopen()). Load ordering is used in relocation processing. Dependency
 | 
			
		||||
 *   ordering uses a breadth-first order starting with a given object,
 | 
			
		||||
 *   then all of its dependencies, then any dependents of those, iterating
 | 
			
		||||
 *   until all dependencies are satisfied. With the exception of the global
 | 
			
		||||
 *   symbol object obtained via a dlopen() operation on a file of 0,
 | 
			
		||||
 *   dependency ordering is used by the dlsym() function. Load ordering is
 | 
			
		||||
 *   used in dlsym() operations upon the global symbol object.
 | 
			
		||||
 *
 | 
			
		||||
 *   When an object is first made accessible via dlopen() it and its
 | 
			
		||||
 *   dependent objects are added in dependency order. Once all the objects
 | 
			
		||||
 *   are added, relocations are performed using load order. Note that if an
 | 
			
		||||
 *   object or its dependencies had been previously loaded, the load and
 | 
			
		||||
 *   dependency orders may yield different resolutions.
 | 
			
		||||
 *
 | 
			
		||||
 *   The symbols introduced by dlopen() operations, and available through
 | 
			
		||||
 *   dlsym() are at a minimum those which are exported as symbols of global
 | 
			
		||||
 *   scope by the object. Typically such symbols will be those that were
 | 
			
		||||
 *   specified in (for example) C source code as having extern linkage. The
 | 
			
		||||
 *   precise manner in which an implementation constructs the set of
 | 
			
		||||
 *   exported symbols for a dlopen() object is specified by that
 | 
			
		||||
 *   implementation.
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   file - Used to construct a pathname to the object file. If file
 | 
			
		||||
 *          contains a slash character, the file argument is used as the
 | 
			
		||||
 *          pathname for the file. Otherwise, file is used in an
 | 
			
		||||
 *          implementation-dependent manner to yield a pathname.
 | 
			
		||||
 *
 | 
			
		||||
 *          If the value of file is 0, dlopen() provides a handle on a
 | 
			
		||||
 *          global symbol object. This object provides access to the symbols
 | 
			
		||||
 *          from an ordered set of objects consisting of the original
 | 
			
		||||
 *          program image file, together with any objects loaded at program
 | 
			
		||||
 *          startup as specified by that process image file (for example,
 | 
			
		||||
 *          shared libraries), and the set of objects loaded using a
 | 
			
		||||
 *          dlopen() operation together with the RTLD_GLOBAL flag. As the
 | 
			
		||||
 *          latter set of objects can change during execution, the set
 | 
			
		||||
 *          identified by handle can also change dynamically.
 | 
			
		||||
 *
 | 
			
		||||
 *          Only a single copy of an object file is brought into the address
 | 
			
		||||
 *          space, even if dlopen() is invoked multiple times in reference
 | 
			
		||||
 *          to the file, and even if different pathnames are used to
 | 
			
		||||
 *          reference the file.
 | 
			
		||||
 *  mode  - Describes how dlopen() will operate upon file with respect to
 | 
			
		||||
 *          the processing of relocations and the scope of visibility of the
 | 
			
		||||
 *          symbols provided within file. When an object is brought into the
 | 
			
		||||
 *          address space of a process, it may contain references to symbols
 | 
			
		||||
 *          whose addresses are not known until the object is loaded. These
 | 
			
		||||
 *          references must be relocated before the symbols can be accessed.
 | 
			
		||||
 *          The mode parameter governs when these relocations take place.
 | 
			
		||||
 *          See definitions above for values of the mode parameter:.
 | 
			
		||||
 *
 | 
			
		||||
 * Returned Value:
 | 
			
		||||
 *   A successful dlopen() returns a handle which the caller may use on
 | 
			
		||||
 *   subsequent calls to dlsym() and dlclose(). The value of this handle
 | 
			
		||||
 *   should not be interpreted in any way by the caller.
 | 
			
		||||
 *
 | 
			
		||||
 *   If file cannot be found, cannot be opened for reading, is not of an
 | 
			
		||||
 *   appropriate object format for processing by dlopen(), or if an error
 | 
			
		||||
 *   occurs during the process of loading file or relocating its symbolic
 | 
			
		||||
 *   references, dlopen() will return NULL. More detailed diagnostic
 | 
			
		||||
 *   information will be available through dlerror().
 | 
			
		||||
 *
 | 
			
		||||
 * Reference: OpenGroup.org
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
FAR void *dlopen(FAR const char *file, int mode)
 | 
			
		||||
{
 | 
			
		||||
  FAR void *handle = NULL;
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_LIBC_ENVPATH
 | 
			
		||||
  if (file[0] != '/')
 | 
			
		||||
    {
 | 
			
		||||
      FAR const char *relpath;
 | 
			
		||||
      FAR char *fullpath;
 | 
			
		||||
      ENVPATH_HANDLE env;
 | 
			
		||||
 | 
			
		||||
      /* Set aside the relative path */
 | 
			
		||||
 | 
			
		||||
      relpath = file;
 | 
			
		||||
 | 
			
		||||
      /* Initialize to traverse the LD_LIBRARY_PATH variable */
 | 
			
		||||
 | 
			
		||||
      env = envpath_init("LD_LIBRARY_PATH");
 | 
			
		||||
      if (env)
 | 
			
		||||
        {
 | 
			
		||||
          /* Get the next absolute file path */
 | 
			
		||||
 | 
			
		||||
          while ((fullpath = envpath_next(env, relpath)) != NULL)
 | 
			
		||||
            {
 | 
			
		||||
              /* Try to load the file at this path */
 | 
			
		||||
 | 
			
		||||
              handle = dlinsert(fullpath);
 | 
			
		||||
 | 
			
		||||
              /* Free the allocated fullpath */
 | 
			
		||||
 | 
			
		||||
              lib_free(fullpath);
 | 
			
		||||
 | 
			
		||||
              /* Break out of the loop with handle != NULL on success */
 | 
			
		||||
 | 
			
		||||
              if (handle != NULL)
 | 
			
		||||
                {
 | 
			
		||||
                  break;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
          /* Release the traversal handle */
 | 
			
		||||
 | 
			
		||||
          envpath_release(env);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
#endif
 | 
			
		||||
    {
 | 
			
		||||
      /* We already have the one and only absolute path to the file to
 | 
			
		||||
       * be loaded.
 | 
			
		||||
       */
 | 
			
		||||
 | 
			
		||||
       handle = dlinsert(file);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return handle;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,186 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * libs/libc-musl/dlfcn/lib_dlsym.c
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed to the Apache Software Foundation (ASF) under one or more
 | 
			
		||||
 * contributor license agreements.  See the NOTICE file distributed with
 | 
			
		||||
 * this work for additional information regarding copyright ownership.  The
 | 
			
		||||
 * ASF licenses this file to you under the Apache License, Version 2.0 (the
 | 
			
		||||
 * "License"); you may not use this file except in compliance with the
 | 
			
		||||
 * License.  You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *   http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 | 
			
		||||
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
 | 
			
		||||
 * License for the specific language governing permissions and limitations
 | 
			
		||||
 * under the License.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
* @file lib_dlsym.c
 | 
			
		||||
* @brief nuttx source code
 | 
			
		||||
*        https://github.com/apache/incubator-nuttx.git
 | 
			
		||||
* @version 10.3.0 
 | 
			
		||||
* @author AIIT XUOS Lab
 | 
			
		||||
* @date 2022-08-04
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <dlfcn.h>
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <debug.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
 | 
			
		||||
#include <nuttx/module.h>
 | 
			
		||||
#include <nuttx/symtab.h>
 | 
			
		||||
#include <nuttx/lib/modlib.h>
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Private Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: dlgetsym
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   dlgetsym() implements dlsym() for the PROTECTED build.
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   handle - The opaque, non-NULL value returned by a previous successful
 | 
			
		||||
 *            call to insmod().
 | 
			
		||||
 *   name   - A pointer to the symbol name string.
 | 
			
		||||
 *
 | 
			
		||||
 * Returned Value:
 | 
			
		||||
 *   See dlsym().
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_BUILD_PROTECTED
 | 
			
		||||
static inline FAR const void *dlgetsym(FAR void *handle,
 | 
			
		||||
                                       FAR const char *name)
 | 
			
		||||
{
 | 
			
		||||
  FAR struct module_s *modp = (FAR struct module_s *)handle;
 | 
			
		||||
  FAR const struct symtab_s *symbol;
 | 
			
		||||
  int err;
 | 
			
		||||
  int ret;
 | 
			
		||||
 | 
			
		||||
  /* Verify that the module is in the registry */
 | 
			
		||||
 | 
			
		||||
  modlib_registry_lock();
 | 
			
		||||
  ret = modlib_registry_verify(modp);
 | 
			
		||||
  if (ret < 0)
 | 
			
		||||
    {
 | 
			
		||||
      serr("ERROR: Failed to verify module: %d\n", ret);
 | 
			
		||||
      err = -ret;
 | 
			
		||||
      goto errout_with_lock;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* Does the module have a symbol table? */
 | 
			
		||||
 | 
			
		||||
  if (modp->modinfo.exports == NULL || modp->modinfo.nexports == 0)
 | 
			
		||||
    {
 | 
			
		||||
      serr("ERROR: Module has no symbol table\n");
 | 
			
		||||
      err = ENOENT;
 | 
			
		||||
      goto errout_with_lock;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* Search the symbol table for the matching symbol */
 | 
			
		||||
 | 
			
		||||
  symbol = symtab_findbyname(modp->modinfo.exports, name,
 | 
			
		||||
                             modp->modinfo.nexports);
 | 
			
		||||
  if (symbol == NULL)
 | 
			
		||||
    {
 | 
			
		||||
      serr("ERROR: Failed to find symbol in symbol \"%s\" in table\n", name);
 | 
			
		||||
      err = ENOENT;
 | 
			
		||||
      goto errout_with_lock;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* Return the address within the module associated with the symbol */
 | 
			
		||||
 | 
			
		||||
  modlib_registry_unlock();
 | 
			
		||||
  DEBUGASSERT(symbol->sym_value != NULL);
 | 
			
		||||
  return symbol->sym_value;
 | 
			
		||||
 | 
			
		||||
errout_with_lock:
 | 
			
		||||
  modlib_registry_unlock();
 | 
			
		||||
  set_errno(err);
 | 
			
		||||
  return NULL;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: dlsym
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   dlsym() allows a process to obtain the address of a symbol defined
 | 
			
		||||
 *   within an object made accessible through a dlopen() call. handle is the
 | 
			
		||||
 *   value returned from a call to dlopen() (and which has not since been
 | 
			
		||||
 *   released via a call to dlclose()), name is the symbol's name as a
 | 
			
		||||
 *   character string.
 | 
			
		||||
 *
 | 
			
		||||
 *   dlsym() will search for the named symbol in all objects loaded
 | 
			
		||||
 *   automatically as a result of loading the object referenced by handle
 | 
			
		||||
 *   (see dlopen()). Load ordering is used in dlsym() operations upon the
 | 
			
		||||
 *   global symbol object. The symbol resolution algorithm used will be
 | 
			
		||||
 *   dependency order as described in dlopen().
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   handle - The opaque, non-NULL value returned by a previous successful
 | 
			
		||||
 *            call to dlopen().
 | 
			
		||||
 *   name   - A pointer to the symbol name string.
 | 
			
		||||
 *
 | 
			
		||||
 * Returned Value:
 | 
			
		||||
 *   If handle does not refer to a valid object opened by dlopen(), or if
 | 
			
		||||
 *   the named symbol cannot be found within any of the objects associated
 | 
			
		||||
 *   with handle, dlsym() will return NULL. More detailed diagnostic
 | 
			
		||||
 *   information will be available through dlerror().
 | 
			
		||||
 *
 | 
			
		||||
 * Reference: OpenGroup.org
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
FAR void *dlsym(FAR void *handle, FAR const char *name)
 | 
			
		||||
{
 | 
			
		||||
#if defined(CONFIG_BUILD_FLAT)
 | 
			
		||||
  /* In the FLAT build, a shared library is essentially the same as a kernel
 | 
			
		||||
   * module.
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  return (FAR void *)modsym(handle, name);
 | 
			
		||||
 | 
			
		||||
#elif defined(CONFIG_BUILD_PROTECTED)
 | 
			
		||||
  /* The PROTECTED build is equivalent to the FLAT build EXCEPT that there
 | 
			
		||||
   * must be two copies of the module logic:  One residing in kernel
 | 
			
		||||
   * space and using the kernel symbol table and one residing in user space
 | 
			
		||||
   * using the user space symbol table.
 | 
			
		||||
   *
 | 
			
		||||
   * dlgetsem() is essentially a clone of modsym().
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  return (FAR void *)dlgetsym(handle, name);
 | 
			
		||||
 | 
			
		||||
#else /* if defined(CONFIG_BUILD_KERNEL) */
 | 
			
		||||
  /* The KERNEL build is considerably more complex:  In order to be shared,
 | 
			
		||||
   * the .text portion of the module must be (1) build for PIC/PID operation
 | 
			
		||||
   * and (2) must like in a shared memory region accessible from all
 | 
			
		||||
   * processes.  The .data/.bss portion of the module must be allocated in
 | 
			
		||||
   * the user space of each process, but must lie at the same virtual address
 | 
			
		||||
   * so that it can be referenced from the one copy of the text in the shared
 | 
			
		||||
   * memory region.
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
#warning Missing logic
 | 
			
		||||
  return NULL;
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,86 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * libs/libc-musl/dlfcn/lib_dlsymtab.c
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed to the Apache Software Foundation (ASF) under one or more
 | 
			
		||||
 * contributor license agreements.  See the NOTICE file distributed with
 | 
			
		||||
 * this work for additional information regarding copyright ownership.  The
 | 
			
		||||
 * ASF licenses this file to you under the Apache License, Version 2.0 (the
 | 
			
		||||
 * "License"); you may not use this file except in compliance with the
 | 
			
		||||
 * License.  You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *   http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 | 
			
		||||
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
 | 
			
		||||
 * License for the specific language governing permissions and limitations
 | 
			
		||||
 * under the License.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
* @file lib_dlsymtab.c
 | 
			
		||||
* @brief nuttx source code
 | 
			
		||||
*        https://github.com/apache/incubator-nuttx.git
 | 
			
		||||
* @version 10.3.0 
 | 
			
		||||
* @author AIIT XUOS Lab
 | 
			
		||||
* @date 2022-08-04
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <dlfcn.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
 | 
			
		||||
#include <nuttx/module.h>
 | 
			
		||||
#include <nuttx/lib/modlib.h>
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: dlsymtab
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   dlsymtab() is a non-standard shared library interface.  It selects the
 | 
			
		||||
 *   symbol table to use when binding a shared library to the base firmware
 | 
			
		||||
 *   which may be in FLASH memory.
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   symtab   - The new symbol table.
 | 
			
		||||
 *   nsymbols - The number of symbols in the symbol table.
 | 
			
		||||
 *
 | 
			
		||||
 * Returned Value:
 | 
			
		||||
 *   Always returns OK.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
int dlsymtab(FAR const struct symtab_s *symtab, int nsymbols)
 | 
			
		||||
{
 | 
			
		||||
#ifdef CONFIG_BUILD_KERNEL
 | 
			
		||||
  /* The KERNEL build is considerably more complex:  In order to be shared,
 | 
			
		||||
   * the .text portion of the module must be (1) build for PIC/PID operation
 | 
			
		||||
   * and (2) must like in a shared memory region accessible from all
 | 
			
		||||
   * processes.  The .data/.bss portion of the module must be allocated in
 | 
			
		||||
   * the user space of each process, but must lie at the same virtual address
 | 
			
		||||
   * so that it can be referenced from the one copy of the text in the shared
 | 
			
		||||
   * memory region.
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
#warning Missing logic
 | 
			
		||||
  return -ENOSYS;
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
  /* Set the symbol take information that will be used by this instance of
 | 
			
		||||
   * the module library.
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  modlib_setsymtab(symtab, nsymbols);
 | 
			
		||||
  return OK;
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,28 @@
 | 
			
		|||
############################################################################
 | 
			
		||||
# libs/libc-musl/endian/Make.defs
 | 
			
		||||
#
 | 
			
		||||
# 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.
 | 
			
		||||
#
 | 
			
		||||
############################################################################
 | 
			
		||||
 | 
			
		||||
# Add the endian.h C files to the build
 | 
			
		||||
 | 
			
		||||
CSRCS += swap16.c swap32.c swap64.c
 | 
			
		||||
 | 
			
		||||
# Add the endian directory to the build
 | 
			
		||||
 | 
			
		||||
DEPPATH += --dep-path endian
 | 
			
		||||
VPATH += :endian
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,22 @@
 | 
			
		|||
/**
 | 
			
		||||
 * @file swap16.c
 | 
			
		||||
 * @brief musl source code
 | 
			
		||||
 *        https://github.com/bminor/musl.git
 | 
			
		||||
 * @version 1.0
 | 
			
		||||
 * @author AIIT XUOS Lab
 | 
			
		||||
 * @date 2022-08-04
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include <endian.h>
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifndef __SWAP_UINT16_ISMACRO
 | 
			
		||||
uint16_t __swap_uint16(uint16_t n)
 | 
			
		||||
{
 | 
			
		||||
  return n<<8 | n>>8;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,22 @@
 | 
			
		|||
/**
 | 
			
		||||
 * @file swap32.c
 | 
			
		||||
 * @brief musl source code
 | 
			
		||||
 *        https://github.com/bminor/musl.git
 | 
			
		||||
 * @version 1.0
 | 
			
		||||
 * @author AIIT XUOS Lab
 | 
			
		||||
 * @date 2022-08-04
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include <endian.h>
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifndef __SWAP_UINT32_ISMACRO
 | 
			
		||||
uint32_t __swap_uint32(uint32_t n)
 | 
			
		||||
{
 | 
			
		||||
	return (n>>24) | (n>>8&0xff00) | (n<<8&0xff0000) | (n<<24);
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,24 @@
 | 
			
		|||
/**
 | 
			
		||||
 * @file swap64.c
 | 
			
		||||
 * @brief musl source code
 | 
			
		||||
 *        https://github.com/bminor/musl.git
 | 
			
		||||
 * @version 1.0
 | 
			
		||||
 * @author AIIT XUOS Lab
 | 
			
		||||
 * @date 2022-08-04
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <nuttx/compiler.h>
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include <endian.h>
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_HAVE_LONG_LONG
 | 
			
		||||
uint64_t __swap_uint64(uint64_t n)
 | 
			
		||||
{
 | 
			
		||||
	return (__swap_uint32(n)+ (0ULL<<32)) | __swap_uint32(n>>32);
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,26 @@
 | 
			
		|||
############################################################################
 | 
			
		||||
# libs/libc-musl/errno/Make.defs
 | 
			
		||||
#
 | 
			
		||||
# 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.
 | 
			
		||||
#
 | 
			
		||||
############################################################################
 | 
			
		||||
 | 
			
		||||
CSRCS += lib_errno.c
 | 
			
		||||
 | 
			
		||||
# Include errno build support
 | 
			
		||||
 | 
			
		||||
DEPPATH += --dep-path errno
 | 
			
		||||
VPATH += :errno
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,74 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * libs/libc-musl/errno/lib_errno.c
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed to the Apache Software Foundation (ASF) under one or more
 | 
			
		||||
 * contributor license agreements.  See the NOTICE file distributed with
 | 
			
		||||
 * this work for additional information regarding copyright ownership.  The
 | 
			
		||||
 * ASF licenses this file to you under the Apache License, Version 2.0 (the
 | 
			
		||||
 * "License"); you may not use this file except in compliance with the
 | 
			
		||||
 * License.  You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *   http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 | 
			
		||||
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
 | 
			
		||||
 * License for the specific language governing permissions and limitations
 | 
			
		||||
 * under the License.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
* @file lib_errno.c
 | 
			
		||||
* @brief nuttx source code
 | 
			
		||||
*        https://github.com/apache/incubator-nuttx.git
 | 
			
		||||
* @version 10.3.0 
 | 
			
		||||
* @author AIIT XUOS Lab
 | 
			
		||||
* @date 2022-08-04
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <nuttx/arch.h>
 | 
			
		||||
#include <nuttx/tls.h>
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Private Data
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
static int g_errno;
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: __errno
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Return a pointer to the thread specific errno.
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   None
 | 
			
		||||
 *
 | 
			
		||||
 * Returned Value:
 | 
			
		||||
 *   A pointer to the per-thread errno variable.
 | 
			
		||||
 *
 | 
			
		||||
 * Assumptions:
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
FAR int *__errno(void)
 | 
			
		||||
{
 | 
			
		||||
  /* Get the TLS tls_info_s structure instance for this thread */
 | 
			
		||||
 | 
			
		||||
  FAR struct tls_info_s *tlsinfo = up_tls_info();
 | 
			
		||||
 | 
			
		||||
  /* And return the return refernce to the error number */
 | 
			
		||||
 | 
			
		||||
  return tlsinfo ? &tlsinfo->tl_errno : &g_errno;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,27 @@
 | 
			
		|||
############################################################################
 | 
			
		||||
# libs/libc-musl/eventfd/Make.defs
 | 
			
		||||
#
 | 
			
		||||
# 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.
 | 
			
		||||
#
 | 
			
		||||
############################################################################
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_EVENT_FD),y)
 | 
			
		||||
CSRCS += lib_eventfd.c
 | 
			
		||||
 | 
			
		||||
DEPPATH += --dep-path eventfd
 | 
			
		||||
VPATH += :eventfd
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,51 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * libs/libc-musl/eventfd/lib_eventfd.c
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed to the Apache Software Foundation (ASF) under one or more
 | 
			
		||||
 * contributor license agreements.  See the NOTICE file distributed with
 | 
			
		||||
 * this work for additional information regarding copyright ownership.  The
 | 
			
		||||
 * ASF licenses this file to you under the Apache License, Version 2.0 (the
 | 
			
		||||
 * "License"); you may not use this file except in compliance with the
 | 
			
		||||
 * License.  You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *   http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 | 
			
		||||
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
 | 
			
		||||
 * License for the specific language governing permissions and limitations
 | 
			
		||||
 * under the License.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
* @file lib_eventfd.c
 | 
			
		||||
* @brief nuttx source code
 | 
			
		||||
*        https://github.com/apache/incubator-nuttx.git
 | 
			
		||||
* @version 10.3.0 
 | 
			
		||||
* @author AIIT XUOS Lab
 | 
			
		||||
* @date 2022-08-04
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <sys/eventfd.h>
 | 
			
		||||
#include <sys/ioctl.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
int eventfd_read(int fd, FAR eventfd_t *value)
 | 
			
		||||
{
 | 
			
		||||
  return read(fd, value, sizeof (eventfd_t)) != sizeof (eventfd_t) ? -1 : 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int eventfd_write(int fd, eventfd_t value)
 | 
			
		||||
{
 | 
			
		||||
  return write(fd, &value,
 | 
			
		||||
      sizeof (eventfd_t)) != sizeof (eventfd_t) ? -1 : 0;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,29 @@
 | 
			
		|||
############################################################################
 | 
			
		||||
# libs/libc-musl/fixedmath/Make.defs
 | 
			
		||||
#
 | 
			
		||||
# 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.
 | 
			
		||||
#
 | 
			
		||||
############################################################################
 | 
			
		||||
 | 
			
		||||
# Add the fixed precision math C files to the build
 | 
			
		||||
 | 
			
		||||
CSRCS += lib_fixedmath.c lib_b16sin.c lib_b16cos.c lib_b16atan2.c
 | 
			
		||||
CSRCS += lib_ubsqrt.c
 | 
			
		||||
 | 
			
		||||
# Add the fixed precision math directory to the build
 | 
			
		||||
 | 
			
		||||
DEPPATH += --dep-path fixedmath
 | 
			
		||||
VPATH += :fixedmath
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,102 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * libs/libc-musl/fixedmath/lib_b16atan2.c
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed to the Apache Software Foundation (ASF) under one or more
 | 
			
		||||
 * contributor license agreements.  See the NOTICE file distributed with
 | 
			
		||||
 * this work for additional information regarding copyright ownership.  The
 | 
			
		||||
 * ASF licenses this file to you under the Apache License, Version 2.0 (the
 | 
			
		||||
 * "License"); you may not use this file except in compliance with the
 | 
			
		||||
 * License.  You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *   http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 | 
			
		||||
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
 | 
			
		||||
 * License for the specific language governing permissions and limitations
 | 
			
		||||
 * under the License.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
* @file lib_b16atan2.c
 | 
			
		||||
* @brief nuttx source code
 | 
			
		||||
*        https://github.com/apache/incubator-nuttx.git
 | 
			
		||||
* @version 10.3.0 
 | 
			
		||||
* @author AIIT XUOS Lab
 | 
			
		||||
* @date 2022-08-04
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <fixedmath.h>
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Pre-processor Definitions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#define B16_C1     0x00000373 /* 0.013480470 */
 | 
			
		||||
#define B16_C2     0x00000eb7 /* 0.057477314 */
 | 
			
		||||
#define B16_C3     0x00001f0a /* 0.121239071 */
 | 
			
		||||
#define B16_C4     0x00003215 /* 0.195635925 */
 | 
			
		||||
#define B16_C5     0x0000553f /* 0.332994597 */
 | 
			
		||||
#define B16_C6     0x00010000 /* 0.999995630 */
 | 
			
		||||
#define B16_HALFPI 0x00019220 /* 1.570796327 */
 | 
			
		||||
#define B16_PI     0x00032440 /* 3.141592654 */
 | 
			
		||||
 | 
			
		||||
#ifndef MAX
 | 
			
		||||
#  define MAX(a,b) (a > b ? a : b)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef MIN
 | 
			
		||||
#  define MIN(a,b) (a < b ? a : b)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef ABS
 | 
			
		||||
#  define ABS(a)   (a < 0 ? -a : a)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: b16atan2
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   atan2 calculates the arctangent of y/x.  (Based on a algorithm I saw
 | 
			
		||||
 *   posted on the internet... now I have lost the link -- sorry).
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
b16_t b16atan2(b16_t y, b16_t x)
 | 
			
		||||
{
 | 
			
		||||
  b16_t t0;
 | 
			
		||||
  b16_t t1;
 | 
			
		||||
  b16_t t2;
 | 
			
		||||
  b16_t t3;
 | 
			
		||||
 | 
			
		||||
  t2 = ABS(x);
 | 
			
		||||
  t1 = ABS(y);
 | 
			
		||||
  t0 = MAX(t2, t1);
 | 
			
		||||
  t1 = MIN(t2, t1);
 | 
			
		||||
  t2 = ub16inv(t0);
 | 
			
		||||
  t2 = b16mulb16(t1, t2);
 | 
			
		||||
 | 
			
		||||
  t3 = b16mulb16(t2, t2);
 | 
			
		||||
  t0 =                   - B16_C1;
 | 
			
		||||
  t0 = b16mulb16(t0, t3) + B16_C2;
 | 
			
		||||
  t0 = b16mulb16(t0, t3) - B16_C3;
 | 
			
		||||
  t0 = b16mulb16(t0, t3) + B16_C4;
 | 
			
		||||
  t0 = b16mulb16(t0, t3) - B16_C5;
 | 
			
		||||
  t0 = b16mulb16(t0, t3) + B16_C6;
 | 
			
		||||
  t2 = b16mulb16(t0, t2);
 | 
			
		||||
 | 
			
		||||
  t2 = (ABS(y) > ABS(x)) ? B16_HALFPI - t2 : t2;
 | 
			
		||||
  t2 = (x < 0) ?  B16_PI - t2 : t2;
 | 
			
		||||
  t2 = (y < 0) ? -t2 : t2;
 | 
			
		||||
 | 
			
		||||
  return t2;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,59 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * libs/libc-musl/fixedmath/lib_b16cos.c
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed to the Apache Software Foundation (ASF) under one or more
 | 
			
		||||
 * contributor license agreements.  See the NOTICE file distributed with
 | 
			
		||||
 * this work for additional information regarding copyright ownership.  The
 | 
			
		||||
 * ASF licenses this file to you under the Apache License, Version 2.0 (the
 | 
			
		||||
 * "License"); you may not use this file except in compliance with the
 | 
			
		||||
 * License.  You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *   http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 | 
			
		||||
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
 | 
			
		||||
 * License for the specific language governing permissions and limitations
 | 
			
		||||
 * under the License.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
* @file lib_b16cos.c
 | 
			
		||||
* @brief nuttx source code
 | 
			
		||||
*        https://github.com/apache/incubator-nuttx.git
 | 
			
		||||
* @version 10.3.0 
 | 
			
		||||
* @author AIIT XUOS Lab
 | 
			
		||||
* @date 2022-08-04
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <fixedmath.h>
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Pre-processor Definitions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: b16cos
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
b16_t b16cos(b16_t rad)
 | 
			
		||||
{
 | 
			
		||||
  /* Compute cosine: sin(rad + PI/2) = cos(rad) */
 | 
			
		||||
 | 
			
		||||
  rad += b16HALFPI;
 | 
			
		||||
  if (rad > b16PI)
 | 
			
		||||
    {
 | 
			
		||||
      rad -= b16TWOPI;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return b16sin(rad);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,104 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * libs/libc-musl/fixedmath/lib_b16sin.c
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed to the Apache Software Foundation (ASF) under one or more
 | 
			
		||||
 * contributor license agreements.  See the NOTICE file distributed with
 | 
			
		||||
 * this work for additional information regarding copyright ownership.  The
 | 
			
		||||
 * ASF licenses this file to you under the Apache License, Version 2.0 (the
 | 
			
		||||
 * "License"); you may not use this file except in compliance with the
 | 
			
		||||
 * License.  You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *   http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 | 
			
		||||
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
 | 
			
		||||
 * License for the specific language governing permissions and limitations
 | 
			
		||||
 * under the License.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
* @file lib_b16sin.c
 | 
			
		||||
* @brief nuttx source code
 | 
			
		||||
*        https://github.com/apache/incubator-nuttx.git
 | 
			
		||||
* @version 10.3.0 
 | 
			
		||||
* @author AIIT XUOS Lab
 | 
			
		||||
* @date 2022-08-04
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <fixedmath.h>
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Pre-processor Definitions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#define b16_P225       0x0000399a
 | 
			
		||||
#define b16_P405284735 0x000067c1
 | 
			
		||||
#define b16_1P27323954 0x000145f3
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: b16sin
 | 
			
		||||
 * Ref:
 | 
			
		||||
 * lab.polygonal.de/2007/07/18/fast-and-accurate-sinecosine-approximation/
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
b16_t b16sin(b16_t rad)
 | 
			
		||||
{
 | 
			
		||||
  b16_t tmp1;
 | 
			
		||||
  b16_t tmp2;
 | 
			
		||||
  b16_t tmp3;
 | 
			
		||||
 | 
			
		||||
  /* Force angle into the good range */
 | 
			
		||||
 | 
			
		||||
  if (rad < -b16PI)
 | 
			
		||||
    {
 | 
			
		||||
      rad += b16TWOPI;
 | 
			
		||||
    }
 | 
			
		||||
  else if (rad > b16PI)
 | 
			
		||||
    {
 | 
			
		||||
      rad -= b16TWOPI;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* tmp1 = 1.27323954 * rad
 | 
			
		||||
   * tmp2 = .405284735 * rad * rad
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  tmp1 = b16mulb16(b16_1P27323954, rad);
 | 
			
		||||
  tmp2 = b16mulb16(b16_P405284735, b16sqr(rad));
 | 
			
		||||
 | 
			
		||||
  if (rad < 0)
 | 
			
		||||
    {
 | 
			
		||||
      /* tmp3 = 1.27323954 * rad + .405284735 * rad * rad */
 | 
			
		||||
 | 
			
		||||
      tmp3 = tmp1 + tmp2;
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    {
 | 
			
		||||
      /* tmp3 = 1.27323954 * rad - 0.405284735 * rad * rad */
 | 
			
		||||
 | 
			
		||||
      tmp3 = tmp1 - tmp2;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* tmp1 = tmp3*tmp3 */
 | 
			
		||||
 | 
			
		||||
  tmp1 = b16sqr(tmp3);
 | 
			
		||||
  if (tmp3 < 0)
 | 
			
		||||
    {
 | 
			
		||||
      /* tmp1 = tmp3 * -tmp3 */
 | 
			
		||||
 | 
			
		||||
      tmp1 = -tmp1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* Return sin = .225 * (tmp3 * (+/-tmp3) - tmp3) + tmp3 */
 | 
			
		||||
 | 
			
		||||
  return b16mulb16(b16_P225, (tmp1 - tmp3)) + tmp3;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,268 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * libs/libc-musl/fixedmath/lib_fixedmath.c
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed to the Apache Software Foundation (ASF) under one or more
 | 
			
		||||
 * contributor license agreements.  See the NOTICE file distributed with
 | 
			
		||||
 * this work for additional information regarding copyright ownership.  The
 | 
			
		||||
 * ASF licenses this file to you under the Apache License, Version 2.0 (the
 | 
			
		||||
 * "License"); you may not use this file except in compliance with the
 | 
			
		||||
 * License.  You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *   http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 | 
			
		||||
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
 | 
			
		||||
 * License for the specific language governing permissions and limitations
 | 
			
		||||
 * under the License.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
* @file lib_fixedmath.c
 | 
			
		||||
* @brief nuttx source code
 | 
			
		||||
*        https://github.com/apache/incubator-nuttx.git
 | 
			
		||||
* @version 10.3.0 
 | 
			
		||||
* @author AIIT XUOS Lab
 | 
			
		||||
* @date 2022-08-04
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
#include <fixedmath.h>
 | 
			
		||||
 | 
			
		||||
#ifndef CONFIG_HAVE_LONG_LONG
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Pre-processor Definitions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Private Type Declarations
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Private Function Prototypes
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Data
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Private Data
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: fixsign
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
static void fixsign(b16_t *parg1, b16_t *parg2, bool *pnegate)
 | 
			
		||||
{
 | 
			
		||||
  bool negate = false;
 | 
			
		||||
  b16_t arg;
 | 
			
		||||
 | 
			
		||||
  arg = *parg1;
 | 
			
		||||
  if (arg < 0)
 | 
			
		||||
    {
 | 
			
		||||
      *parg1 = -arg;
 | 
			
		||||
      negate = true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  arg = *parg2;
 | 
			
		||||
  if (arg < 0)
 | 
			
		||||
    {
 | 
			
		||||
      *parg2 = -arg;
 | 
			
		||||
      negate ^= true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  *pnegate = negate;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: adjustsign
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
static b16_t adjustsign(b16_t result, bool negate)
 | 
			
		||||
{
 | 
			
		||||
  /* If the product is negative, then we overflowed */
 | 
			
		||||
 | 
			
		||||
  if (result < 0)
 | 
			
		||||
    {
 | 
			
		||||
      if (result)
 | 
			
		||||
        {
 | 
			
		||||
          return b16MIN;
 | 
			
		||||
        }
 | 
			
		||||
      else
 | 
			
		||||
        {
 | 
			
		||||
          return b16MAX;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* correct the sign of the result */
 | 
			
		||||
 | 
			
		||||
  if (negate)
 | 
			
		||||
    {
 | 
			
		||||
      return -result;
 | 
			
		||||
    }
 | 
			
		||||
  return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: b16mulb16
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
b16_t b16mulb16(b16_t m1, b16_t m2)
 | 
			
		||||
{
 | 
			
		||||
  bool negate;
 | 
			
		||||
  b16_t product;
 | 
			
		||||
 | 
			
		||||
  fixsign(&m1, &m2, &negate);
 | 
			
		||||
  product = (b16_t)ub16mulub16((ub16_t)m1, (ub16_t)m2);
 | 
			
		||||
  return adjustsign(product, negate);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: ub16mulub16
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
ub16_t ub16mulub16(ub16_t m1, ub16_t m2)
 | 
			
		||||
{
 | 
			
		||||
  /* Let:
 | 
			
		||||
   *
 | 
			
		||||
   *   m1 = m1i*2**16 + m1f                                            (b16)
 | 
			
		||||
   *   m2 = m2i*2**16 + m2f                                            (b16)
 | 
			
		||||
   *
 | 
			
		||||
   * Then:
 | 
			
		||||
   *
 | 
			
		||||
   *  m1*m2 = (m1i*m2i)*2**32 + (m1i*m2f + m2i*m1f)*2**16 + m1f*m2f    (b32)
 | 
			
		||||
   *        = (m1i*m2i)*2**16 + (m1i*m2f + m2i*m1f) + m1f*m2f*2**-16   (b16)
 | 
			
		||||
   *        = a*2**16 + b + c*2**-16
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  uint32_t m1i = ((uint32_t)m1 >> 16);
 | 
			
		||||
  uint32_t m2i = ((uint32_t)m1 >> 16);
 | 
			
		||||
  uint32_t m1f = ((uint32_t)m1 & 0x0000ffff);
 | 
			
		||||
  uint32_t m2f = ((uint32_t)m2 & 0x0000ffff);
 | 
			
		||||
 | 
			
		||||
  return (m1i*m2i << 16) + m1i*m2f + m2i*m1f + (((m1f*m2f) + b16HALF) >> 16);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: b16sqr
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
b16_t b16sqr(b16_t a)
 | 
			
		||||
{
 | 
			
		||||
  b16_t sq;
 | 
			
		||||
 | 
			
		||||
  /* The result is always positive.  Just take the absolute value */
 | 
			
		||||
 | 
			
		||||
  if (a < 0)
 | 
			
		||||
    {
 | 
			
		||||
      a = -a;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* Overflow occurred if the result is negative */
 | 
			
		||||
 | 
			
		||||
  sq = (b16_t)ub16sqr(a);
 | 
			
		||||
  if (sq < 0)
 | 
			
		||||
    {
 | 
			
		||||
      sq = b16MAX;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return sq;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: b16divb16
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
ub16_t ub16sqr(ub16_t a)
 | 
			
		||||
{
 | 
			
		||||
  /* Let:
 | 
			
		||||
   *
 | 
			
		||||
   *   m = mi*2**16 + mf                                               (b16)
 | 
			
		||||
   *
 | 
			
		||||
   * Then:
 | 
			
		||||
   *
 | 
			
		||||
   *  m*m = (mi*mi)*2**32 + 2*(m1*m2)*2**16 + mf*mf                    (b32)
 | 
			
		||||
   *      = (mi*mi)*2**16 + 2*(mi*mf)       + mf*mf*2**-16             (b16)
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  uint32_t mi = ((uint32_t)a >> 16);
 | 
			
		||||
  uint32_t mf = ((uint32_t)a & 0x0000ffff);
 | 
			
		||||
 | 
			
		||||
  return (mi*mi << 16) + (mi*mf << 1) + ((mf*mf + b16HALF) >> 16);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: b16divb16
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
b16_t b16divb16(b16_t num, b16_t denom)
 | 
			
		||||
{
 | 
			
		||||
  bool  negate;
 | 
			
		||||
  b16_t quotient;
 | 
			
		||||
 | 
			
		||||
  fixsign(&num, &denom, &negate);
 | 
			
		||||
  quotient = (b16_t)ub16divub16((ub16_t)num, (ub16_t)denom);
 | 
			
		||||
  return adjustsign(quotient, negate);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: ub16divub16
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
ub16_t ub16divub16(ub16_t num, ub16_t denom)
 | 
			
		||||
{
 | 
			
		||||
  uint32_t term1;
 | 
			
		||||
  uint32_t numf;
 | 
			
		||||
  uint32_t product;
 | 
			
		||||
 | 
			
		||||
  /* Let:
 | 
			
		||||
   *
 | 
			
		||||
   *   num = numi*2**16 + numf                                         (b16)
 | 
			
		||||
   *   den = deni*2**16 + denf                                         (b16)
 | 
			
		||||
   *
 | 
			
		||||
   * Then:
 | 
			
		||||
   *
 | 
			
		||||
   *  num/den = numi*2**16 / den + numf / den                          (b0)
 | 
			
		||||
   *          = numi*2**32 / den + numf*2**16 /den                     (b16)
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  /* Check for overflow in the first part of the quotient */
 | 
			
		||||
 | 
			
		||||
  term1 = ((uint32_t)num & 0xffff0000) / denom;
 | 
			
		||||
  if (term1 >= 0x00010000)
 | 
			
		||||
    {
 | 
			
		||||
      return ub16MAX; /* Will overflow */
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* Finish the division */
 | 
			
		||||
 | 
			
		||||
  numf    = num - term1 * denom;
 | 
			
		||||
  term1 <<= 16;
 | 
			
		||||
  product = term1 + (numf + (denom >> 1)) / denom;
 | 
			
		||||
 | 
			
		||||
  /* Check for overflow */
 | 
			
		||||
 | 
			
		||||
  if (product < term1)
 | 
			
		||||
    {
 | 
			
		||||
      return ub16MAX; /* Overflowed */
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return product;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,131 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * libs/libc-musl/fixedmath/lib_ubsqrt.c
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed to the Apache Software Foundation (ASF) under one or more
 | 
			
		||||
 * contributor license agreements.  See the NOTICE file distributed with
 | 
			
		||||
 * this work for additional information regarding copyright ownership.  The
 | 
			
		||||
 * ASF licenses this file to you under the Apache License, Version 2.0 (the
 | 
			
		||||
 * "License"); you may not use this file except in compliance with the
 | 
			
		||||
 * License.  You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *   http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 | 
			
		||||
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
 | 
			
		||||
 * License for the specific language governing permissions and limitations
 | 
			
		||||
 * under the License.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
* @file lib_ubsqrt.c
 | 
			
		||||
* @brief nuttx source code
 | 
			
		||||
*        https://github.com/apache/incubator-nuttx.git
 | 
			
		||||
* @version 10.3.0 
 | 
			
		||||
* @author AIIT XUOS Lab
 | 
			
		||||
* @date 2022-08-04
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <nuttx/config.h>
 | 
			
		||||
#include <fixedmath.h>
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_HAVE_LONG_LONG
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: ub32sqrtub16
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   ub32sqrtub16 calculates square root for 'a'
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
ub16_t ub32sqrtub16(ub32_t a)
 | 
			
		||||
{
 | 
			
		||||
  uint64_t n = a;
 | 
			
		||||
  uint64_t xk = n;
 | 
			
		||||
 | 
			
		||||
  /* Direct conversion of ub32_t to uint64_t is same operation as multiplying
 | 
			
		||||
   * 'a' by 2^32, therefore n = a * 2^32.
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  if (xk == UINT64_MAX)
 | 
			
		||||
    {
 | 
			
		||||
      /* Avoid 'xk + n / xk' overflow on first iteration. */
 | 
			
		||||
 | 
			
		||||
      xk = (uint64_t)1 << 63;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  do
 | 
			
		||||
    {
 | 
			
		||||
      uint64_t xk1 = (xk + n / xk) >> 1;
 | 
			
		||||
 | 
			
		||||
      if (xk1 >= xk)
 | 
			
		||||
        {
 | 
			
		||||
          break;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      xk = xk1;
 | 
			
		||||
    }
 | 
			
		||||
  while (1);
 | 
			
		||||
 | 
			
		||||
  /* 'xk' now holds 'sqrt(n)' => 'sqrt(a * 2^32)' => 'sqrt(a) * 2^16', thus
 | 
			
		||||
   * 'xk' holds square root of 'a' in ub16_t format.
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  return (ub16_t)xk;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: ub16sqrtub8
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   ub16sqrtub8 calculates square root for 'a'
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
ub8_t ub16sqrtub8(ub16_t a)
 | 
			
		||||
{
 | 
			
		||||
  uint32_t n = a;
 | 
			
		||||
  uint32_t xk = n;
 | 
			
		||||
 | 
			
		||||
  /* Direct conversion of ub16_t to uint32_t is same operation as multiplying
 | 
			
		||||
   * 'a' by 2^16, therefore n = a * 2^16.
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  if (xk == UINT32_MAX)
 | 
			
		||||
    {
 | 
			
		||||
      /* Avoid 'xk + n / xk' overflow on first iteration. */
 | 
			
		||||
 | 
			
		||||
      xk = (uint32_t)1 << 31;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  do
 | 
			
		||||
    {
 | 
			
		||||
      uint32_t xk1 = (xk + n / xk) >> 1;
 | 
			
		||||
 | 
			
		||||
      if (xk1 >= xk)
 | 
			
		||||
        {
 | 
			
		||||
          break;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      xk = xk1;
 | 
			
		||||
    }
 | 
			
		||||
  while (1);
 | 
			
		||||
 | 
			
		||||
  /* 'xk' now holds 'sqrt(n)' => 'sqrt(a * 2^16)' => 'sqrt(a) * 2^8', thus
 | 
			
		||||
   * 'xk' holds square root of 'a' in ub8_t format.
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  return (ub8_t)xk;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,35 @@
 | 
			
		|||
############################################################################
 | 
			
		||||
# libs/libc-musl/grp/Make.defs
 | 
			
		||||
#
 | 
			
		||||
# 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.
 | 
			
		||||
#
 | 
			
		||||
############################################################################
 | 
			
		||||
 | 
			
		||||
# Add the grp C files to the build
 | 
			
		||||
 | 
			
		||||
CSRCS += lib_getgrgid.c lib_getgrgidr.c lib_getgrnam.c lib_getgrnamr.c
 | 
			
		||||
CSRCS += lib_initgroups.c
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_LIBC_GROUP_FILE),y)
 | 
			
		||||
CSRCS += lib_find_grpfile.c lib_grp_globals.c
 | 
			
		||||
else
 | 
			
		||||
CSRCS += lib_getgrbuf.c lib_getgrbufr.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
# Add the grp directory to the build
 | 
			
		||||
 | 
			
		||||
DEPPATH += --dep-path grp
 | 
			
		||||
VPATH += :grp
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,346 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * libs/libc-musl/grp/lib_find_grpfile.c
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed to the Apache Software Foundation (ASF) under one or more
 | 
			
		||||
 * contributor license agreements.  See the NOTICE file distributed with
 | 
			
		||||
 * this work for additional information regarding copyright ownership.  The
 | 
			
		||||
 * ASF licenses this file to you under the Apache License, Version 2.0 (the
 | 
			
		||||
 * "License"); you may not use this file except in compliance with the
 | 
			
		||||
 * License.  You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *   http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 | 
			
		||||
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
 | 
			
		||||
 * License for the specific language governing permissions and limitations
 | 
			
		||||
 * under the License.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
* @file lib_find_grpfile.c
 | 
			
		||||
* @brief nuttx source code
 | 
			
		||||
*        https://github.com/apache/incubator-nuttx.git
 | 
			
		||||
* @version 10.3.0 
 | 
			
		||||
* @author AIIT XUOS Lab
 | 
			
		||||
* @date 2022-08-04
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <grp.h>
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
 | 
			
		||||
#include "grp/lib_grp.h"
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Private Types
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
typedef CODE int (grp_foreach_match_t)(FAR const struct group *entry,
 | 
			
		||||
                                       uintptr_t arg);
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Private Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: grp_match_name
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Called for each record in the group file.  Returns "1" if the record
 | 
			
		||||
 *   matches the group name (passed as arg)
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   entry  - The parsed group file record
 | 
			
		||||
 *   arg    - A pointer to the group name to match
 | 
			
		||||
 *
 | 
			
		||||
 * Returned Value:
 | 
			
		||||
 *   < 0 :  An error has occurred.
 | 
			
		||||
 *   = 0 :  No entry name does not match.
 | 
			
		||||
 *   = 1 :  The entry name matches
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
static int grp_match_name(FAR const struct group *entry, uintptr_t arg)
 | 
			
		||||
{
 | 
			
		||||
  FAR const char *gname = (FAR const char *)arg;
 | 
			
		||||
  return strcmp(entry->gr_name, gname) == 0 ? 1 : 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: grp_match_gid
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Called for each record in the group file.  Returns "1" if the record
 | 
			
		||||
 *   matches the group ID (passed as arg)
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   entry  - The parsed group file record
 | 
			
		||||
 *   arg    - The group ID to match
 | 
			
		||||
 *
 | 
			
		||||
 * Returned Value:
 | 
			
		||||
 *   < 0 :  An error has occurred.
 | 
			
		||||
 *   = 0 :  No entry name does not match.
 | 
			
		||||
 *   = 1 :  The entry name matches
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
static int grp_match_gid(FAR const struct group *entry, uintptr_t arg)
 | 
			
		||||
{
 | 
			
		||||
  int match_gid = (int)arg;
 | 
			
		||||
  return match_gid == entry->gr_gid ? 1 : 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: grp_foreach
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Visit each record in group file.
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   match  - The match function to call on each record
 | 
			
		||||
 *   arg    - Argument passed to the match function
 | 
			
		||||
 *   entry  - Location to return the parsed group file entry
 | 
			
		||||
 *   buffer - I/O buffer used to access the group file
 | 
			
		||||
 *   buflen - The size of the I/O buffer in bytes
 | 
			
		||||
 *
 | 
			
		||||
 * Returned Value:
 | 
			
		||||
 *   < 0 :  An error has occurred.
 | 
			
		||||
 *   = 0 :  No entry with this name was found.
 | 
			
		||||
 *   = 1 :  The entry with this name was found.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
static int grp_foreach(grp_foreach_match_t match, uintptr_t arg,
 | 
			
		||||
                       FAR struct group *entry, FAR char *buffer,
 | 
			
		||||
                       size_t buflen)
 | 
			
		||||
{
 | 
			
		||||
  FAR FILE *stream;
 | 
			
		||||
  FAR char *ptr;
 | 
			
		||||
  FAR char *line;
 | 
			
		||||
  FAR char *save;
 | 
			
		||||
  size_t linelen;
 | 
			
		||||
  unsigned int nmembers;
 | 
			
		||||
  int ret;
 | 
			
		||||
 | 
			
		||||
  stream = fopen(CONFIG_LIBC_GROUP_FILEPATH, "r");
 | 
			
		||||
  if (stream == NULL)
 | 
			
		||||
    {
 | 
			
		||||
      int errcode = get_errno();
 | 
			
		||||
      DEBUGASSERT(errcode > 0);
 | 
			
		||||
      return -errcode;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* Read the password file line by line until the record with the matching
 | 
			
		||||
   * username is found, or until the end of the file is reached.
 | 
			
		||||
   *
 | 
			
		||||
   * The format of the password file is:
 | 
			
		||||
   *
 | 
			
		||||
   *   user:x:uid:gid:home
 | 
			
		||||
   *
 | 
			
		||||
   * Where:
 | 
			
		||||
   *   user:  User name
 | 
			
		||||
   *   x:     Encrypted password
 | 
			
		||||
   *   uid:   User ID
 | 
			
		||||
   *   gid:   Group ID
 | 
			
		||||
   *   home:  Login directory
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  DEBUGASSERT(buflen > MEMBER_SIZE);  /* Buffer must also be aligned */
 | 
			
		||||
  line    = buffer + MEMBER_SIZE;
 | 
			
		||||
  linelen = buflen - MEMBER_SIZE;
 | 
			
		||||
 | 
			
		||||
  while (fgets(line, linelen, stream) != NULL)
 | 
			
		||||
    {
 | 
			
		||||
      ptr            = line;
 | 
			
		||||
      entry->gr_name = ptr;
 | 
			
		||||
 | 
			
		||||
      /* Skip to the end of the name and properly terminate it.  The name
 | 
			
		||||
       * must be terminated with the field delimiter ':'.
 | 
			
		||||
       */
 | 
			
		||||
 | 
			
		||||
      for (; *ptr != '\n' && *ptr != '\0' && *ptr != ':'; ptr++)
 | 
			
		||||
        {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      if (*ptr == '\n' || *ptr == '\0')
 | 
			
		||||
        {
 | 
			
		||||
          /* Bad line format? */
 | 
			
		||||
 | 
			
		||||
          continue;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      *ptr++           = '\0';
 | 
			
		||||
      entry->gr_passwd = ptr;
 | 
			
		||||
 | 
			
		||||
      /* Skip to the end of the password and properly terminate it.  The
 | 
			
		||||
       * password must be terminated with the field delimiter ':'.
 | 
			
		||||
       */
 | 
			
		||||
 | 
			
		||||
      for (; *ptr != '\n' && *ptr != '\0' && *ptr != ':'; ptr++)
 | 
			
		||||
        {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      if (*ptr == '\n' || *ptr == '\0')
 | 
			
		||||
        {
 | 
			
		||||
          /* Bad line format? */
 | 
			
		||||
 | 
			
		||||
          continue;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      *ptr++  = '\0';
 | 
			
		||||
      save    = ptr;
 | 
			
		||||
 | 
			
		||||
      /* Skip to the end of the group ID and properly terminate it.  The
 | 
			
		||||
       * group ID must be terminated with the field delimiter ':'.
 | 
			
		||||
       */
 | 
			
		||||
 | 
			
		||||
      for (; *ptr != '\n' && *ptr != '\0' && *ptr != ':'; ptr++)
 | 
			
		||||
        {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      if (*ptr == '\n' || *ptr == '\0')
 | 
			
		||||
        {
 | 
			
		||||
          /* Bad line format? */
 | 
			
		||||
 | 
			
		||||
          continue;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      *ptr++ = '\0';
 | 
			
		||||
      entry->gr_gid = (gid_t)atoi(save);
 | 
			
		||||
 | 
			
		||||
      /* This is followed by a variable number of user names.  The ':'
 | 
			
		||||
       * delimited will be followed by '\n' or '\0' if there are no users
 | 
			
		||||
       * in the group
 | 
			
		||||
       */
 | 
			
		||||
 | 
			
		||||
      nmembers      = 0;
 | 
			
		||||
      entry->gr_mem = (FAR char **)buffer;
 | 
			
		||||
 | 
			
		||||
      if (*ptr != '\n' && *ptr != '\0')
 | 
			
		||||
        {
 | 
			
		||||
          for (; ; )
 | 
			
		||||
            {
 | 
			
		||||
              /* Add the next user name */
 | 
			
		||||
 | 
			
		||||
              entry->gr_mem[nmembers] = ptr;
 | 
			
		||||
              nmembers++;
 | 
			
		||||
              if (nmembers >= CONFIG_LIBC_GROUP_NUSERS)
 | 
			
		||||
                {
 | 
			
		||||
                  break;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
              /* Skip to the end of the user name and properly terminate it.
 | 
			
		||||
               * The user name must be terminated with either (1) ','
 | 
			
		||||
               * meaning that another user name is present, or (2) '\n' or
 | 
			
		||||
               * '\0' meaning that we have reached the end of the line and
 | 
			
		||||
               * there are no further user names.
 | 
			
		||||
               */
 | 
			
		||||
 | 
			
		||||
              for (; *ptr != '\n' && *ptr != '\0' && *ptr != ','; ptr++)
 | 
			
		||||
                {
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
              if (*ptr == '\n' || *ptr == '\0')
 | 
			
		||||
                {
 | 
			
		||||
                  *ptr = '\0';
 | 
			
		||||
                  break;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
              *ptr++ = '\0';
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      /* The list terminates with a NULL pointer */
 | 
			
		||||
 | 
			
		||||
      entry->gr_mem[nmembers] = NULL;
 | 
			
		||||
 | 
			
		||||
      /* Check for a match */
 | 
			
		||||
 | 
			
		||||
      ret = match(entry, arg);
 | 
			
		||||
      if (ret != 0)
 | 
			
		||||
        {
 | 
			
		||||
          /* We either have the match or an error occurred. */
 | 
			
		||||
 | 
			
		||||
          fclose(stream);
 | 
			
		||||
          return ret;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  fclose(stream);
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: grp_findby_name
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Find group file entry using the group name.
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   gname  - The group name
 | 
			
		||||
 *   entry  - Location to return the parsed group file entry
 | 
			
		||||
 *   buffer - I/O buffer used to access the group file
 | 
			
		||||
 *   buflen - The size of the I/O buffer in bytes
 | 
			
		||||
 *
 | 
			
		||||
 * Returned Value:
 | 
			
		||||
 *   < 0 :  An error has occurred.
 | 
			
		||||
 *   = 0 :  No entry with this name was found.
 | 
			
		||||
 *   = 1 :  The entry with this name was found.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
int grp_findby_name(FAR const char *gname, FAR struct group *entry,
 | 
			
		||||
                    FAR char *buffer, size_t buflen)
 | 
			
		||||
{
 | 
			
		||||
  return grp_foreach(grp_match_name, (uintptr_t)gname,
 | 
			
		||||
                     entry, buffer, buflen);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: grp_findby_gid
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Find group file entry using the group ID.
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   gid    - The group ID
 | 
			
		||||
 *   entry  - Location to return the parsed group file entry
 | 
			
		||||
 *   buffer - I/O buffer used to access the group file
 | 
			
		||||
 *   buflen - The size of the I/O buffer in bytes
 | 
			
		||||
 *
 | 
			
		||||
 * Returned Value:
 | 
			
		||||
 *   < 0 :  An error has occurred.
 | 
			
		||||
 *   = 0 :  No entry with this name was found.
 | 
			
		||||
 *   = 1 :  The entry with this name was found.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
int grp_findby_gid(gid_t gid, FAR struct group *entry, FAR char *buffer,
 | 
			
		||||
                   size_t buflen)
 | 
			
		||||
{
 | 
			
		||||
  /* Verify that the GID is in the valid range of 0 through INT16_MAX.
 | 
			
		||||
   * OpenGroup.org does not specify a GID_MAX or GID_MIN.  Instead we use a
 | 
			
		||||
   * priori knowledge that gid_t is type int16_t.
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  if ((uint16_t)gid > INT16_MAX)
 | 
			
		||||
    {
 | 
			
		||||
      return -EINVAL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return grp_foreach(grp_match_gid, (uintptr_t)gid, entry, buffer, buflen);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,121 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * libs/libc-musl/grp/lib_getgrbuf.c
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed to the Apache Software Foundation (ASF) under one or more
 | 
			
		||||
 * contributor license agreements.  See the NOTICE file distributed with
 | 
			
		||||
 * this work for additional information regarding copyright ownership.  The
 | 
			
		||||
 * ASF licenses this file to you under the Apache License, Version 2.0 (the
 | 
			
		||||
 * "License"); you may not use this file except in compliance with the
 | 
			
		||||
 * License.  You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *   http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 | 
			
		||||
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
 | 
			
		||||
 * License for the specific language governing permissions and limitations
 | 
			
		||||
 * under the License.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
* @file lib_getgrbuf.c
 | 
			
		||||
* @brief nuttx source code
 | 
			
		||||
*        https://github.com/apache/incubator-nuttx.git
 | 
			
		||||
* @version 10.3.0 
 | 
			
		||||
* @author AIIT XUOS Lab
 | 
			
		||||
* @date 2022-08-04
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
#include <grp.h>
 | 
			
		||||
 | 
			
		||||
#include "grp/lib_grp.h"
 | 
			
		||||
#include "libc-musl.h"
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Private Data
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
static FAR char *g_buf;
 | 
			
		||||
static FAR struct group *g_grp;
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: getgrbuf
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   libc-musl/grp internal helper function for getgrgid and getgrnam to allocate
 | 
			
		||||
 *   and setup a group structure once a matching entry has been found.
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   gid    - Value to set the group structure's gr_gid field to.
 | 
			
		||||
 *   name   - Value to set the group structure's gr_name field to.
 | 
			
		||||
 *   passwd - Value to set the group structure's passwd field to.
 | 
			
		||||
 *
 | 
			
		||||
 * Returned Value:
 | 
			
		||||
 *   A pointer to a statically allocated group structure, or NULL if an
 | 
			
		||||
 *   error occurs, in which case errno is set appropriately.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
FAR struct group *getgrbuf(gid_t gid, FAR const char *name,
 | 
			
		||||
                           FAR const char *passwd)
 | 
			
		||||
{
 | 
			
		||||
  FAR struct group *result;
 | 
			
		||||
  FAR char *newbuf;
 | 
			
		||||
  size_t buflen;
 | 
			
		||||
  int err;
 | 
			
		||||
 | 
			
		||||
  buflen = sizeof(FAR char **) + strlen(name) + 1 + strlen(passwd) + 1;
 | 
			
		||||
 | 
			
		||||
  newbuf = (FAR char *)lib_realloc(g_buf, buflen);
 | 
			
		||||
 | 
			
		||||
  if (!newbuf)
 | 
			
		||||
    {
 | 
			
		||||
      err = ENOMEM;
 | 
			
		||||
      goto error;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  g_buf = newbuf;
 | 
			
		||||
 | 
			
		||||
  if (!g_grp)
 | 
			
		||||
    {
 | 
			
		||||
      g_grp = (FAR struct group *)lib_malloc(sizeof(struct group));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (!g_grp)
 | 
			
		||||
    {
 | 
			
		||||
      err = ENOMEM;
 | 
			
		||||
      goto error;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  err = getgrbuf_r(gid, name, passwd, g_grp, g_buf, buflen, &result);
 | 
			
		||||
 | 
			
		||||
  if (err)
 | 
			
		||||
    {
 | 
			
		||||
      goto error;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return result;
 | 
			
		||||
 | 
			
		||||
error:
 | 
			
		||||
  lib_free(g_grp);
 | 
			
		||||
  lib_free(g_buf);
 | 
			
		||||
  g_grp = NULL;
 | 
			
		||||
  g_buf = NULL;
 | 
			
		||||
  set_errno(err);
 | 
			
		||||
 | 
			
		||||
  return NULL;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,105 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * libs/libc-musl/grp/lib_getgrbufr.c
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed to the Apache Software Foundation (ASF) under one or more
 | 
			
		||||
 * contributor license agreements.  See the NOTICE file distributed with
 | 
			
		||||
 * this work for additional information regarding copyright ownership.  The
 | 
			
		||||
 * ASF licenses this file to you under the Apache License, Version 2.0 (the
 | 
			
		||||
 * "License"); you may not use this file except in compliance with the
 | 
			
		||||
 * License.  You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *   http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 | 
			
		||||
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
 | 
			
		||||
 * License for the specific language governing permissions and limitations
 | 
			
		||||
 * under the License.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
* @file lib_getgrbufr.c
 | 
			
		||||
* @brief nuttx source code
 | 
			
		||||
*        https://github.com/apache/incubator-nuttx.git
 | 
			
		||||
* @version 10.3.0 
 | 
			
		||||
* @author AIIT XUOS Lab
 | 
			
		||||
* @date 2022-08-04
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
#include <grp.h>
 | 
			
		||||
 | 
			
		||||
#include "grp/lib_grp.h"
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: getgrbuf_r
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   libc-musl/grp internal helper function for getgrgid_r and getgrnam_r to setup
 | 
			
		||||
 *   the caller supplied 'grp' and 'buf' buffers once a matching entry has
 | 
			
		||||
 *   been found.
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   gid    - Value to set grp->gr_gid to.
 | 
			
		||||
 *   name   - Value to set grp->gr_name to.
 | 
			
		||||
 *   passwd - Value to set grp->passwd to.
 | 
			
		||||
 *   grp    - Pointer to the space to store the retrieved group structure in.
 | 
			
		||||
 *   buf    - String fields pointed to by the group struct are stored here.
 | 
			
		||||
 *   buflen - The length of buf in bytes.
 | 
			
		||||
 *   result - Pointer to the resulting group struct, or NULL in case of fail.
 | 
			
		||||
 *
 | 
			
		||||
 * Returned Value:
 | 
			
		||||
 *   On success getgrgid_r returns 0 and sets *result to grp.  In case of
 | 
			
		||||
 *   failure an error number is returned.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
int getgrbuf_r(gid_t gid, FAR const char *name, FAR const char *passwd,
 | 
			
		||||
               FAR struct group *grp, FAR char *buf, size_t buflen,
 | 
			
		||||
               FAR struct group **result)
 | 
			
		||||
{
 | 
			
		||||
  size_t reqdlen;
 | 
			
		||||
  size_t padlen;
 | 
			
		||||
 | 
			
		||||
  /* In 'buf' a NULL pointer value will be stored, which must be naturally
 | 
			
		||||
   * aligned, followed by the null terminated group name string and the null
 | 
			
		||||
   * terminated passwd string 'x' (indicating 'no password').  Make sure
 | 
			
		||||
   * sufficient buffer space was supplied by the caller.
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  padlen  = sizeof(FAR void *) - ((uintptr_t)buf % sizeof(FAR char *));
 | 
			
		||||
  reqdlen = sizeof(FAR void *) + strlen(name) + 1 + strlen(passwd) + 1;
 | 
			
		||||
 | 
			
		||||
  if (buflen < padlen + reqdlen)
 | 
			
		||||
    {
 | 
			
		||||
      /* Insufficient buffer space supplied. */
 | 
			
		||||
 | 
			
		||||
      *result = NULL;
 | 
			
		||||
      return ERANGE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  grp->gr_mem    = (FAR char **)&buf[padlen];
 | 
			
		||||
  grp->gr_name   = &buf[padlen + sizeof(FAR char *)];
 | 
			
		||||
  grp->gr_passwd = &buf[padlen + sizeof(FAR char *) + strlen(name) + 1];
 | 
			
		||||
 | 
			
		||||
  strcpy(grp->gr_name, name);
 | 
			
		||||
  strcpy(grp->gr_passwd, passwd);
 | 
			
		||||
  grp->gr_gid  = gid;
 | 
			
		||||
  *grp->gr_mem = NULL;
 | 
			
		||||
 | 
			
		||||
  *result = grp;
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,83 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * libs/libc-musl/grp/lib_getgrgid.c
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed to the Apache Software Foundation (ASF) under one or more
 | 
			
		||||
 * contributor license agreements.  See the NOTICE file distributed with
 | 
			
		||||
 * this work for additional information regarding copyright ownership.  The
 | 
			
		||||
 * ASF licenses this file to you under the Apache License, Version 2.0 (the
 | 
			
		||||
 * "License"); you may not use this file except in compliance with the
 | 
			
		||||
 * License.  You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *   http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 | 
			
		||||
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
 | 
			
		||||
 * License for the specific language governing permissions and limitations
 | 
			
		||||
 * under the License.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
* @file lib_getgrgid.c
 | 
			
		||||
* @brief nuttx source code
 | 
			
		||||
*        https://github.com/apache/incubator-nuttx.git
 | 
			
		||||
* @version 10.3.0 
 | 
			
		||||
* @author AIIT XUOS Lab
 | 
			
		||||
* @date 2022-08-04
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <grp.h>
 | 
			
		||||
 | 
			
		||||
#include "grp/lib_grp.h"
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: getgrgid
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   The getgrgid() function searches the group database for an entry with
 | 
			
		||||
 *   a matching gid.
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   gid - The gid to return a group structure for
 | 
			
		||||
 *
 | 
			
		||||
 * Returned Value:
 | 
			
		||||
 *   A pointer to a statically allocated group structure, or NULL if no
 | 
			
		||||
 *   matching entry is found or an error occurs.  Applications wishing to
 | 
			
		||||
 *   check for error situations should set errno to 0 before calling
 | 
			
		||||
 *   getgrgid().  If getgrgid() returns a null pointer and errno is set to
 | 
			
		||||
 *   non-zero, an error occurred.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
FAR struct group *getgrgid(gid_t gid)
 | 
			
		||||
{
 | 
			
		||||
#ifdef CONFIG_LIBC_GROUP_FILE
 | 
			
		||||
  int ret;
 | 
			
		||||
 | 
			
		||||
  ret = grp_findby_gid(gid, &g_group, g_group_buffer, GRPBUF_RESERVE_SIZE);
 | 
			
		||||
  if (ret != 1)
 | 
			
		||||
    {
 | 
			
		||||
      return NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return &g_group;
 | 
			
		||||
#else
 | 
			
		||||
  if (gid != ROOT_GID)
 | 
			
		||||
    {
 | 
			
		||||
      return NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return getgrbuf(ROOT_GID, ROOT_NAME, ROOT_PASSWD);
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,95 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * libs/libc-musl/grp/lib_getgrgidr.c
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed to the Apache Software Foundation (ASF) under one or more
 | 
			
		||||
 * contributor license agreements.  See the NOTICE file distributed with
 | 
			
		||||
 * this work for additional information regarding copyright ownership.  The
 | 
			
		||||
 * ASF licenses this file to you under the Apache License, Version 2.0 (the
 | 
			
		||||
 * "License"); you may not use this file except in compliance with the
 | 
			
		||||
 * License.  You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *   http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 | 
			
		||||
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
 | 
			
		||||
 * License for the specific language governing permissions and limitations
 | 
			
		||||
 * under the License.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
* @file lib_getgrgidr.c
 | 
			
		||||
* @brief nuttx source code
 | 
			
		||||
*        https://github.com/apache/incubator-nuttx.git
 | 
			
		||||
* @version 10.3.0 
 | 
			
		||||
* @author AIIT XUOS Lab
 | 
			
		||||
* @date 2022-08-04
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <grp.h>
 | 
			
		||||
 | 
			
		||||
#include "grp/lib_grp.h"
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: getgrgid_r
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   The getgrgid_r() function searches the group database for an entry with
 | 
			
		||||
 *   a matching gid and stores the retrieved group structure in the space
 | 
			
		||||
 *   pointed to by grp.
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   gid - The gid to return a group structure for.
 | 
			
		||||
 *   grp - Pointer to the space to store the retrieved group structure in.
 | 
			
		||||
 *   buf - The string fields pointed to by the group struct are stored here.
 | 
			
		||||
 *   buflen - The length of buf in bytes.
 | 
			
		||||
 *   result - Pointer to the resulting group struct, or NULL in case of fail.
 | 
			
		||||
 *
 | 
			
		||||
 * Returned Value:
 | 
			
		||||
 *   On success getgrgid_r returns 0 and sets *result to grp.  If no match
 | 
			
		||||
 *   is found, 0 is returned and *result is set to NULL.  In case of failure
 | 
			
		||||
 *   an error number is returned.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
int getgrgid_r(gid_t gid, FAR struct group *grp, FAR char *buf,
 | 
			
		||||
               size_t buflen, FAR struct group **result)
 | 
			
		||||
{
 | 
			
		||||
#ifdef CONFIG_LIBC_GROUP_FILE
 | 
			
		||||
  int ret;
 | 
			
		||||
 | 
			
		||||
  ret = grp_findby_gid(gid, grp, buf, buflen);
 | 
			
		||||
  if (ret != 1)
 | 
			
		||||
    {
 | 
			
		||||
      *result = NULL;
 | 
			
		||||
      return ret < 0 ? -ret : 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  *result = grp;
 | 
			
		||||
  return 0;
 | 
			
		||||
#else
 | 
			
		||||
  if (gid != ROOT_GID)
 | 
			
		||||
    {
 | 
			
		||||
      /* The only known group is 'root', which has a gid of 0.  Thus, report
 | 
			
		||||
       * back that no match was found.
 | 
			
		||||
       */
 | 
			
		||||
 | 
			
		||||
      *result = NULL;
 | 
			
		||||
      return 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return getgrbuf_r(ROOT_GID, ROOT_NAME, ROOT_PASSWD, grp, buf, buflen,
 | 
			
		||||
                    result);
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,84 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * libs/libc-musl/grp/lib_getgrnam.c
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed to the Apache Software Foundation (ASF) under one or more
 | 
			
		||||
 * contributor license agreements.  See the NOTICE file distributed with
 | 
			
		||||
 * this work for additional information regarding copyright ownership.  The
 | 
			
		||||
 * ASF licenses this file to you under the Apache License, Version 2.0 (the
 | 
			
		||||
 * "License"); you may not use this file except in compliance with the
 | 
			
		||||
 * License.  You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *   http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 | 
			
		||||
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
 | 
			
		||||
 * License for the specific language governing permissions and limitations
 | 
			
		||||
 * under the License.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
* @file lib_getgrnam.c
 | 
			
		||||
* @brief nuttx source code
 | 
			
		||||
*        https://github.com/apache/incubator-nuttx.git
 | 
			
		||||
* @version 10.3.0 
 | 
			
		||||
* @author AIIT XUOS Lab
 | 
			
		||||
* @date 2022-08-04
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <grp.h>
 | 
			
		||||
 | 
			
		||||
#include "grp/lib_grp.h"
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: getgrnam
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   The getgrnam() function searches the group database for an entry with
 | 
			
		||||
 *   a matching name.
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   name - The group name to return a group structure for
 | 
			
		||||
 *
 | 
			
		||||
 * Returned Value:
 | 
			
		||||
 *   A pointer to a statically allocated group structure, or NULL if no
 | 
			
		||||
 *   matching entry is found or an error occurs.  Applications wishing to
 | 
			
		||||
 *   check for error situations should set errno to 0 before calling
 | 
			
		||||
 *   getgrnam().  If getgrnam() returns a null pointer and errno is set to
 | 
			
		||||
 *   non-zero, an error occurred.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
FAR struct group *getgrnam(FAR const char *name)
 | 
			
		||||
{
 | 
			
		||||
#ifdef CONFIG_LIBC_GROUP_FILE
 | 
			
		||||
  int ret;
 | 
			
		||||
 | 
			
		||||
  ret = grp_findby_name(name, &g_group, g_group_buffer, GRPBUF_RESERVE_SIZE);
 | 
			
		||||
  if (ret != 1)
 | 
			
		||||
    {
 | 
			
		||||
      return NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return &g_group;
 | 
			
		||||
#else
 | 
			
		||||
  if (strcmp(name, "root"))
 | 
			
		||||
    {
 | 
			
		||||
      return NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return getgrbuf(ROOT_GID, ROOT_NAME, ROOT_PASSWD);
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,97 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * libs/libc-musl/grp/lib_getgrnamr.c
 | 
			
		||||
 *
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed to the Apache Software Foundation (ASF) under one or more
 | 
			
		||||
 * contributor license agreements.  See the NOTICE file distributed with
 | 
			
		||||
 * this work for additional information regarding copyright ownership.  The
 | 
			
		||||
 * ASF licenses this file to you under the Apache License, Version 2.0 (the
 | 
			
		||||
 * "License"); you may not use this file except in compliance with the
 | 
			
		||||
 * License.  You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *   http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 | 
			
		||||
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
 | 
			
		||||
 * License for the specific language governing permissions and limitations
 | 
			
		||||
 * under the License.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
/**
 | 
			
		||||
* @file lib_getgrnamr.c
 | 
			
		||||
* @brief nuttx source code
 | 
			
		||||
*        https://github.com/apache/incubator-nuttx.git
 | 
			
		||||
* @version 10.3.0 
 | 
			
		||||
* @author AIIT XUOS Lab
 | 
			
		||||
* @date 2022-08-04
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <grp.h>
 | 
			
		||||
 | 
			
		||||
#include "grp/lib_grp.h"
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: getgrnam_r
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   The getgrnam_r() function searches the group database for an entry with
 | 
			
		||||
 *   a matching name and stores the retrieved group structure in the space
 | 
			
		||||
 *   pointed to by grp.
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   name - The name of the group to return a group structure for.
 | 
			
		||||
 *   grp - Pointer to the space to store the retrieved group structure in.
 | 
			
		||||
 *   buf - The string fields pointed to by the group struct are stored here.
 | 
			
		||||
 *   buflen - The length of buf in bytes.
 | 
			
		||||
 *   result - Pointer to the resulting group struct, or NULL in case of fail.
 | 
			
		||||
 *
 | 
			
		||||
 * Returned Value:
 | 
			
		||||
 *   On success getgrnam_r returns 0 and sets *result to grp.  If no match
 | 
			
		||||
 *   is found, 0 is returned and *result is set to NULL.  In case of failure
 | 
			
		||||
 *   an error number is returned.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
int getgrnam_r(FAR const char *name, FAR struct group *grp, FAR char *buf,
 | 
			
		||||
               size_t buflen, FAR struct group **result)
 | 
			
		||||
{
 | 
			
		||||
#ifdef CONFIG_LIBC_GROUP_FILE
 | 
			
		||||
  int ret;
 | 
			
		||||
 | 
			
		||||
  ret = grp_findby_name(name, grp, buf, buflen);
 | 
			
		||||
  if (ret != 1)
 | 
			
		||||
    {
 | 
			
		||||
      *result = NULL;
 | 
			
		||||
      return ret < 0 ? -ret : 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  *result = grp;
 | 
			
		||||
  return 0;
 | 
			
		||||
#else
 | 
			
		||||
  if (strcmp(name, ROOT_NAME))
 | 
			
		||||
    {
 | 
			
		||||
      /* The only known group is 'root', which has a gid of 0.  Thus, report
 | 
			
		||||
       * back that no match was found.
 | 
			
		||||
       */
 | 
			
		||||
 | 
			
		||||
      *result = NULL;
 | 
			
		||||
      return 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return getgrbuf_r(ROOT_GID, ROOT_NAME, ROOT_PASSWD, grp, buf, buflen,
 | 
			
		||||
                    result);
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,100 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * libs/libc-musl/grp/lib_grp.h
 | 
			
		||||
 *
 | 
			
		||||
 * 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.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
* @file lib_grp.h
 | 
			
		||||
* @brief nuttx source code
 | 
			
		||||
*        https://github.com/apache/incubator-nuttx.git
 | 
			
		||||
* @version 10.3.0 
 | 
			
		||||
* @author AIIT XUOS Lab
 | 
			
		||||
* @date 2022-08-04
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef __LIBS_LIBC_GRP_LIB_GRP_H
 | 
			
		||||
#define __LIBS_LIBC_GRP_LIB_GRP_H
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <grp.h>
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Pre-processor Definitions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#define ROOT_GID 0
 | 
			
		||||
#define ROOT_NAME "root"
 | 
			
		||||
#define ROOT_PASSWD "x"
 | 
			
		||||
 | 
			
		||||
/* Reserver space for a NULL terminated list for group member names */
 | 
			
		||||
 | 
			
		||||
#define MEMBER_SIZE ((CONFIG_LIBC_GROUP_NUSERS + 1) * sizeof(FAR char *))
 | 
			
		||||
 | 
			
		||||
/* Reserve space for the maximum line in the group file PLUS space for an
 | 
			
		||||
 * array of Member names.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define GRPBUF_RESERVE_SIZE (CONFIG_LIBC_GROUP_LINESIZE + MEMBER_SIZE)
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Data
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
#define EXTERN extern "C"
 | 
			
		||||
extern "C"
 | 
			
		||||
{
 | 
			
		||||
#else
 | 
			
		||||
#define EXTERN extern
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_LIBC_GROUP_FILE
 | 
			
		||||
/* Data for non-reentrant group functions */
 | 
			
		||||
 | 
			
		||||
EXTERN struct group g_group;
 | 
			
		||||
EXTERN char g_group_buffer[GRPBUF_RESERVE_SIZE];
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Function Prototypes
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
FAR struct group *getgrbuf(gid_t gid, FAR const char *name,
 | 
			
		||||
                           FAR const char *passwd);
 | 
			
		||||
int getgrbuf_r(gid_t gid, FAR const char *name, FAR const char *passwd,
 | 
			
		||||
               FAR struct group *grp, FAR char *buf, size_t buflen,
 | 
			
		||||
               FAR struct group **result);
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_LIBC_GROUP_FILE
 | 
			
		||||
int grp_findby_name(FAR const char *gname, FAR struct group *entry,
 | 
			
		||||
                    FAR char *buffer, size_t buflen);
 | 
			
		||||
int grp_findby_gid(gid_t gid, FAR struct group *entry, FAR char *buffer,
 | 
			
		||||
                   size_t buflen);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#undef EXTERN
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif /* __LIBS_LIBC_GRP_LIB_GRP_H */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,53 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * libs/libc-musl/grp/lib_grp_globals.c
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed to the Apache Software Foundation (ASF) under one or more
 | 
			
		||||
 * contributor license agreements.  See the NOTICE file distributed with
 | 
			
		||||
 * this work for additional information regarding copyright ownership.  The
 | 
			
		||||
 * ASF licenses this file to you under the Apache License, Version 2.0 (the
 | 
			
		||||
 * "License"); you may not use this file except in compliance with the
 | 
			
		||||
 * License.  You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *   http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 | 
			
		||||
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
 | 
			
		||||
 * License for the specific language governing permissions and limitations
 | 
			
		||||
 * under the License.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
* @file lib_grp_globals.c
 | 
			
		||||
* @brief nuttx source code
 | 
			
		||||
*        https://github.com/apache/incubator-nuttx.git
 | 
			
		||||
* @version 10.3.0 
 | 
			
		||||
* @author AIIT XUOS Lab
 | 
			
		||||
* @date 2022-08-04
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include "grp/lib_grp.h"
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_LIBC_GROUP_FILE
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Data
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/* Data for non-reentrant group functions */
 | 
			
		||||
 | 
			
		||||
struct group g_group;
 | 
			
		||||
char g_group_buffer[GRPBUF_RESERVE_SIZE];
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#endif /* CONFIG_LIBC_GROUP_FILE */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,68 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * libs/libc-musl/grp/lib_initgroups.c
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed to the Apache Software Foundation (ASF) under one or more
 | 
			
		||||
 * contributor license agreements.  See the NOTICE file distributed with
 | 
			
		||||
 * this work for additional information regarding copyright ownership.  The
 | 
			
		||||
 * ASF licenses this file to you under the Apache License, Version 2.0 (the
 | 
			
		||||
 * "License"); you may not use this file except in compliance with the
 | 
			
		||||
 * License.  You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *   http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 | 
			
		||||
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
 | 
			
		||||
 * License for the specific language governing permissions and limitations
 | 
			
		||||
 * under the License.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
* @file lib_initgroups.c
 | 
			
		||||
* @brief nuttx source code
 | 
			
		||||
*        https://github.com/apache/incubator-nuttx.git
 | 
			
		||||
* @version 10.3.0 
 | 
			
		||||
* @author AIIT XUOS Lab
 | 
			
		||||
* @date 2022-08-04
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <grp.h>
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: initgroups
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   The group database /etc/group is read to determine all groups of which
 | 
			
		||||
 *   user is a member.  The additional group group is also added to this set,
 | 
			
		||||
 *   which is then used to set the supplementary group IDs of the calling
 | 
			
		||||
 *   process.
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   user  - Name of the user to query the /etc/group database for.
 | 
			
		||||
 *   group - Additional gid to add to the list of group IDs.
 | 
			
		||||
 *
 | 
			
		||||
 * Returned Value:
 | 
			
		||||
 *   The initgroups() function returns zero if successful, and -1 in case of
 | 
			
		||||
 *   failure, in which case errno is set appropriately.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
int initgroups(FAR const char *user, gid_t group)
 | 
			
		||||
{
 | 
			
		||||
  /* There currently is no support for supplementary group IDs in NuttX.
 | 
			
		||||
   * Thus, just ignore this request silently and report success.
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,32 @@
 | 
			
		|||
############################################################################
 | 
			
		||||
# libs/libc-musl/hex2bin/Make.defs
 | 
			
		||||
#
 | 
			
		||||
# 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.
 | 
			
		||||
#
 | 
			
		||||
############################################################################
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_LIBC_HEX2BIN),y)
 | 
			
		||||
 | 
			
		||||
# Add the hex2bin sources to the build
 | 
			
		||||
 | 
			
		||||
CSRCS += lib_fhex2mem.c  lib_hex2bin.c  lib_hex2mem.c
 | 
			
		||||
 | 
			
		||||
# Add the hex2bin directory to the build
 | 
			
		||||
 | 
			
		||||
DEPPATH += --dep-path hex2bin
 | 
			
		||||
VPATH += :hex2bin
 | 
			
		||||
 | 
			
		||||
endif
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,97 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * libs/libc-musl/hex2bin/lib_fhex2mem.c
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed to the Apache Software Foundation (ASF) under one or more
 | 
			
		||||
 * contributor license agreements.  See the NOTICE file distributed with
 | 
			
		||||
 * this work for additional information regarding copyright ownership.  The
 | 
			
		||||
 * ASF licenses this file to you under the Apache License, Version 2.0 (the
 | 
			
		||||
 * "License"); you may not use this file except in compliance with the
 | 
			
		||||
 * License.  You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *   http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 | 
			
		||||
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
 | 
			
		||||
 * License for the specific language governing permissions and limitations
 | 
			
		||||
 * under the License.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
* @file lib_fhex2mem.c
 | 
			
		||||
* @brief nuttx source code
 | 
			
		||||
*        https://github.com/apache/incubator-nuttx.git
 | 
			
		||||
* @version 10.3.0 
 | 
			
		||||
* @author AIIT XUOS Lab
 | 
			
		||||
* @date 2022-08-04
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <hex2bin.h>
 | 
			
		||||
 | 
			
		||||
#include <nuttx/streams.h>
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_LIBC_HEX2BIN
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: fhex2mem
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Read the Intel HEX ASCII data provided on the standard stream
 | 
			
		||||
 *   'instream' and write the binary to memory.
 | 
			
		||||
 *
 | 
			
		||||
 *   If, for example, instream is stdin, then the HEX ASCII data would be
 | 
			
		||||
 *   taken from the console and written to memory.
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   instream  - The incoming standard stream from which Intel HEX data
 | 
			
		||||
 *               will be received.
 | 
			
		||||
 *   baseaddr  - The base address of the memory region stream.
 | 
			
		||||
 *   endpaddr  - The end address (plus 1) of the memory region.
 | 
			
		||||
 *   swap      - Controls byte ordering.  See enum hex2bin_swap_e for
 | 
			
		||||
 *               description of the values.
 | 
			
		||||
 *
 | 
			
		||||
 * Returned Value:
 | 
			
		||||
 *   Zero (OK) is returned on success; a negated errno value is returned on
 | 
			
		||||
 *   failure.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
int fhex2mem(FAR FILE *instream, uint32_t baseaddr, uint32_t endpaddr,
 | 
			
		||||
             enum hex2bin_swap_e swap)
 | 
			
		||||
{
 | 
			
		||||
  struct lib_stdinstream_s stdinstream;
 | 
			
		||||
  struct lib_memsostream_s memoutstream;
 | 
			
		||||
 | 
			
		||||
  /* Check memory addresses */
 | 
			
		||||
 | 
			
		||||
  DEBUGASSERT(instream != NULL && endpaddr > baseaddr);
 | 
			
		||||
 | 
			
		||||
  /* Wrap the file descriptor as raw stream; wrap the memory as a memory
 | 
			
		||||
   * stream.
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  lib_stdinstream(&stdinstream, instream);
 | 
			
		||||
  lib_memsostream(&memoutstream, (FAR char *)baseaddr,
 | 
			
		||||
                  (int)(endpaddr - baseaddr));
 | 
			
		||||
 | 
			
		||||
  /* And do the deed */
 | 
			
		||||
 | 
			
		||||
  return hex2bin(&stdinstream.public, &memoutstream.public,
 | 
			
		||||
                 (uint32_t)baseaddr, (uint32_t)endpaddr,
 | 
			
		||||
                 (enum hex2bin_swap_e)swap);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif /* CONFIG_LIBC_HEX2BIN */
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,695 @@
 | 
			
		|||
/****************************************************************************
 | 
			
		||||
 * libs/libc-musl/hex2bin/lib_hex2bin.c
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed to the Apache Software Foundation (ASF) under one or more
 | 
			
		||||
 * contributor license agreements.  See the NOTICE file distributed with
 | 
			
		||||
 * this work for additional information regarding copyright ownership.  The
 | 
			
		||||
 * ASF licenses this file to you under the Apache License, Version 2.0 (the
 | 
			
		||||
 * "License"); you may not use this file except in compliance with the
 | 
			
		||||
 * License.  You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *   http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 | 
			
		||||
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
 | 
			
		||||
 * License for the specific language governing permissions and limitations
 | 
			
		||||
 * under the License.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
* @file lib_hex2bin.c
 | 
			
		||||
* @brief nuttx source code
 | 
			
		||||
*        https://github.com/apache/incubator-nuttx.git
 | 
			
		||||
* @version 10.3.0 
 | 
			
		||||
* @author AIIT XUOS Lab
 | 
			
		||||
* @date 2022-08-04
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * References:
 | 
			
		||||
 *   - http://en.wikipedia.org/wiki/Intel_HEX
 | 
			
		||||
 *   - Hexadecimal Object File Format Specification, Revision A January 6,
 | 
			
		||||
 *     1988, Intel
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Included Files
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include <nuttx/config.h>
 | 
			
		||||
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <ctype.h>
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include <debug.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
#include <hex2bin.h>
 | 
			
		||||
 | 
			
		||||
#include <nuttx/streams.h>
 | 
			
		||||
 | 
			
		||||
#include "libc-musl.h"
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_LIBC_HEX2BIN
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Pre-processor Definitions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/* ASCII record sizes */
 | 
			
		||||
 | 
			
		||||
#define BYTECOUNT_ASCSIZE      2
 | 
			
		||||
#define ADDRESS_ASCSIZE        4
 | 
			
		||||
#define RECTYPE_ASCSIZE        2
 | 
			
		||||
 | 
			
		||||
#define BYTECOUNT_LINENDX      (0)
 | 
			
		||||
#define ADDRESS_LINENDX        (BYTECOUNT_LINENDX + BYTECOUNT_ASCSIZE)
 | 
			
		||||
#define RECTYPE_LINENDX        (ADDRESS_LINENDX + ADDRESS_ASCSIZE)
 | 
			
		||||
#define DATA_LINENDX           (RECTYPE_LINENDX + RECTYPE_ASCSIZE)
 | 
			
		||||
#define HEADER_ASCSIZE          DATA_LINENDX
 | 
			
		||||
 | 
			
		||||
#define CHECKSUM_ASCSIZE       2
 | 
			
		||||
#define TRAILER_SIZE           (CHECKSUM_ASCSIZE)
 | 
			
		||||
 | 
			
		||||
#define MAXDATA_BINSIZE        255
 | 
			
		||||
#define RECORD_ASCSIZE(n)      (HEADER_ASCSIZE + TRAILER_SIZE + 2*(n))
 | 
			
		||||
#define MAXRECORD_ASCSIZE      RECORD_ASCSIZE(MAXDATA_BINSIZE)
 | 
			
		||||
#define MINRECORD_ASCSIZE      RECORD_ASCSIZE(0)
 | 
			
		||||
#define LINE_ALLOC             MAXRECORD_ASCSIZE
 | 
			
		||||
 | 
			
		||||
/* Binary record sizes */
 | 
			
		||||
 | 
			
		||||
#define BYTECOUNT_BINSIZE      1
 | 
			
		||||
#define ADDRESS_BINSIZE        2
 | 
			
		||||
#define RECTYPE_BINSIZE        1
 | 
			
		||||
 | 
			
		||||
#define BYTECOUNT_BINNDX       (0)
 | 
			
		||||
#define ADDRESS_BINNDX         (BYTECOUNT_BINNDX + BYTECOUNT_BINSIZE)
 | 
			
		||||
#define RECTYPE_BINNDX         (ADDRESS_BINNDX + ADDRESS_BINSIZE)
 | 
			
		||||
#define DATA_BINNDX            (RECTYPE_BINNDX + RECTYPE_BINSIZE)
 | 
			
		||||
#define HEADER_BINSIZE         DATA_BINNDX
 | 
			
		||||
 | 
			
		||||
#define CHECKSUM_BINSIZE       1
 | 
			
		||||
#define TRAILER_BINSIZE        CHECKSUM_BINSIZE
 | 
			
		||||
 | 
			
		||||
#define RECORD_BINSIZE(n)      (HEADER_BINSIZE + TRAILER_BINSIZE + (n))
 | 
			
		||||
#define MAXRECORD_BINSIZE      RECORD_BINSIZE(MAXDATA_BINSIZE)
 | 
			
		||||
#define MINRECORD_BKINSIZE     RECORD_BINSIZE(0)
 | 
			
		||||
#define BIN_ALLOC              MAXRECORD_BINSIZE
 | 
			
		||||
 | 
			
		||||
/* Record start code */
 | 
			
		||||
 | 
			
		||||
#define RECORD_STARTCODE       ':'
 | 
			
		||||
 | 
			
		||||
/* Record Types */
 | 
			
		||||
 | 
			
		||||
#define RECORD_DATA            0  /* Data */
 | 
			
		||||
#define RECORD_EOF             1  /* End of file */
 | 
			
		||||
#define RECORD_EXT_SEGADDR     2  /* Extended segment address record */
 | 
			
		||||
#define RECORD_START_SEGADDR   3  /* Start segment address record */
 | 
			
		||||
#define RECORD_EXT_LINADDR     4  /* Extended linear address record */
 | 
			
		||||
#define RECORD_START_LINADDR   5  /* Start linear address record */
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Private Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: nibble2bin
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
static int nibble2bin(uint8_t ascii)
 | 
			
		||||
{
 | 
			
		||||
  if (ascii >= '0' && ascii <= '9')
 | 
			
		||||
    {
 | 
			
		||||
      return (ascii - 0x30);
 | 
			
		||||
    }
 | 
			
		||||
  else if (ascii >= 'a' && ascii <= 'f')
 | 
			
		||||
    {
 | 
			
		||||
      return (ascii - 'a' + 10);
 | 
			
		||||
    }
 | 
			
		||||
  else if (ascii >= 'A' && ascii <= 'F')
 | 
			
		||||
    {
 | 
			
		||||
      return (ascii - 'A' + 10);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return -EINVAL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: byte2bin
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
static int byte2bin(FAR const uint8_t *ascii)
 | 
			
		||||
{
 | 
			
		||||
  int nibble;
 | 
			
		||||
  int byte;
 | 
			
		||||
 | 
			
		||||
  /* Get the MS nibble (big endian order) */
 | 
			
		||||
 | 
			
		||||
  nibble = nibble2bin(*ascii++);
 | 
			
		||||
  if (nibble < 0)
 | 
			
		||||
    {
 | 
			
		||||
      return nibble;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  byte = (nibble << 4);
 | 
			
		||||
 | 
			
		||||
  /* Get the MS nibble */
 | 
			
		||||
 | 
			
		||||
  nibble = nibble2bin(*ascii);
 | 
			
		||||
  if (nibble < 0)
 | 
			
		||||
    {
 | 
			
		||||
      return nibble;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  byte |= nibble;
 | 
			
		||||
  return byte;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: word2bin
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#if 0 /* Not used */
 | 
			
		||||
static int word2bin(FAR const char *ascii)
 | 
			
		||||
{
 | 
			
		||||
  int byte;
 | 
			
		||||
  int word;
 | 
			
		||||
 | 
			
		||||
  /* Get the MS byte (big endian order) */
 | 
			
		||||
 | 
			
		||||
  byte = word2bin(ascii);
 | 
			
		||||
  if (byte < 0)
 | 
			
		||||
    {
 | 
			
		||||
      return byte;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  word = (byte << 8);
 | 
			
		||||
 | 
			
		||||
  /* Get the MS byte */
 | 
			
		||||
 | 
			
		||||
  byte = word2bin(ascii + 2);
 | 
			
		||||
  if (byte < 0)
 | 
			
		||||
    {
 | 
			
		||||
      return byte;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  word |= byte;
 | 
			
		||||
  return word;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: data2bin
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
int data2bin(FAR uint8_t *dest, FAR const uint8_t *src, int nsrcbytes)
 | 
			
		||||
{
 | 
			
		||||
  int byte;
 | 
			
		||||
 | 
			
		||||
  /* An even number of source bytes is expected */
 | 
			
		||||
 | 
			
		||||
  if ((nsrcbytes & 1) != 0)
 | 
			
		||||
    {
 | 
			
		||||
      return -EINVAL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* Convert src bytes in groups of 2, writing one byte to the output on each
 | 
			
		||||
   * pass through the loop.
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  while (nsrcbytes > 0)
 | 
			
		||||
    {
 | 
			
		||||
      /* Get the MS nibble (big endian order) */
 | 
			
		||||
 | 
			
		||||
      byte = byte2bin(src);
 | 
			
		||||
      if (byte < 0)
 | 
			
		||||
        {
 | 
			
		||||
          return byte;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      src += 2;
 | 
			
		||||
 | 
			
		||||
      /* And write the byte to the destination */
 | 
			
		||||
 | 
			
		||||
      *dest++ = byte;
 | 
			
		||||
      nsrcbytes -= 2;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: readstream
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
static int readstream(FAR struct lib_instream_s *instream,
 | 
			
		||||
                      FAR uint8_t *line, unsigned int lineno)
 | 
			
		||||
{
 | 
			
		||||
  int nbytes = 0;
 | 
			
		||||
  int ch;
 | 
			
		||||
 | 
			
		||||
  /* Skip until the beginning of line start code is encountered */
 | 
			
		||||
 | 
			
		||||
  ch = instream->get(instream);
 | 
			
		||||
  while (ch != RECORD_STARTCODE && ch != EOF)
 | 
			
		||||
    {
 | 
			
		||||
      ch = instream->get(instream);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* Skip over the startcode */
 | 
			
		||||
 | 
			
		||||
  if (ch != EOF)
 | 
			
		||||
    {
 | 
			
		||||
      ch = instream->get(instream);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* Then read, verify, and buffer until the end of line is encountered */
 | 
			
		||||
 | 
			
		||||
  while (ch != EOF && nbytes < (MAXRECORD_ASCSIZE - 1))
 | 
			
		||||
    {
 | 
			
		||||
      if (ch == '\n' || ch == '\r')
 | 
			
		||||
        {
 | 
			
		||||
          *line = '\0';
 | 
			
		||||
          return nbytes;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      /* Only hex data goes into the line buffer */
 | 
			
		||||
 | 
			
		||||
      else if (isxdigit(ch))
 | 
			
		||||
        {
 | 
			
		||||
          *line++ = ch;
 | 
			
		||||
          nbytes++;
 | 
			
		||||
        }
 | 
			
		||||
      else if (!isspace(ch)) /* Not expected */
 | 
			
		||||
        {
 | 
			
		||||
          lerr("Line %u ERROR: Unexpected character %c[%02x] in stream\n",
 | 
			
		||||
               lineno, isprint(ch) ? ch : '.', ch);
 | 
			
		||||
          break;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      /* Read the next character from the input stream */
 | 
			
		||||
 | 
			
		||||
      ch = instream->get(instream);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* Some error occurred: Unexpected EOF, line too long, or bad character in
 | 
			
		||||
   * stream
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  lerr("Line %u ERROR: Failed to read line. %d characters read\n",
 | 
			
		||||
       lineno, nbytes);
 | 
			
		||||
  return EOF;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: hex2bin_swap16 and hex2bin_swap32
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
static inline void hex2bin_swap16(FAR uint8_t *data, int bytecount)
 | 
			
		||||
{
 | 
			
		||||
  for (; bytecount > 0; bytecount -= 2)
 | 
			
		||||
    {
 | 
			
		||||
      uint8_t b0 = data[0];
 | 
			
		||||
      uint8_t b1 = data[1];
 | 
			
		||||
 | 
			
		||||
      *data++ = b1;
 | 
			
		||||
      *data++ = b0;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void hex2bin_swap32(FAR uint8_t *data, int bytecount)
 | 
			
		||||
{
 | 
			
		||||
  for (; bytecount > 0; bytecount -= 4)
 | 
			
		||||
    {
 | 
			
		||||
      uint8_t b0 = data[0];
 | 
			
		||||
      uint8_t b1 = data[1];
 | 
			
		||||
      uint8_t b2 = data[2];
 | 
			
		||||
      uint8_t b3 = data[3];
 | 
			
		||||
 | 
			
		||||
      *data++ = b3;
 | 
			
		||||
      *data++ = b2;
 | 
			
		||||
      *data++ = b1;
 | 
			
		||||
      *data++ = b0;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: writedata
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
static inline void writedata(FAR struct lib_sostream_s *outstream,
 | 
			
		||||
                             FAR uint8_t *data, int bytecount)
 | 
			
		||||
{
 | 
			
		||||
  for (; bytecount > 0; bytecount--)
 | 
			
		||||
    {
 | 
			
		||||
      outstream->put(outstream, *data++);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Public Functions
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Name: hex2bin
 | 
			
		||||
 *
 | 
			
		||||
 * Description:
 | 
			
		||||
 *   Read the Intel HEX ASCII data provided on the serial IN stream and write
 | 
			
		||||
 *   the binary to the seek-able serial OUT stream.
 | 
			
		||||
 *
 | 
			
		||||
 *   These streams may be files or, in another usage example, the IN stream
 | 
			
		||||
 *   could be a serial port and the OUT stream could be a memory stream.
 | 
			
		||||
 *   This would decode and write the serial input to memory.
 | 
			
		||||
 *
 | 
			
		||||
 * Input Parameters:
 | 
			
		||||
 *   instream  - The incoming stream from which Intel HEX data will be
 | 
			
		||||
 *               received.
 | 
			
		||||
 *   outstream - The outgoing stream in which binary data will be written.
 | 
			
		||||
 *   baseaddr  - The base address of the outgoing stream.  Seeking in the
 | 
			
		||||
 *               output stream will be relative to this address.
 | 
			
		||||
 *   endpaddr  - The end address (plus 1) of the outgoing stream.  This
 | 
			
		||||
 *               value is used only for range checking.  endpaddr must
 | 
			
		||||
 *               be larger than baseaddr.  A zero value for endpaddr
 | 
			
		||||
 *               disables range checking.
 | 
			
		||||
 *   swap      - Controls byte ordering.  See enum hex2bin_swap_e for
 | 
			
		||||
 *               description of the values.
 | 
			
		||||
 *
 | 
			
		||||
 * Returned Value:
 | 
			
		||||
 *   Zero (OK) is returned on success; a negated errno value is returned on
 | 
			
		||||
 *   failure.
 | 
			
		||||
 *
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
 | 
			
		||||
int hex2bin(FAR struct lib_instream_s *instream,
 | 
			
		||||
            FAR struct lib_sostream_s *outstream, uint32_t baseaddr,
 | 
			
		||||
            uint32_t endpaddr, enum hex2bin_swap_e swap)
 | 
			
		||||
{
 | 
			
		||||
  FAR uint8_t *alloc;
 | 
			
		||||
  FAR uint8_t *line;
 | 
			
		||||
  FAR uint8_t *bin;
 | 
			
		||||
  int nbytes;
 | 
			
		||||
  int bytecount;
 | 
			
		||||
  uint32_t address;
 | 
			
		||||
  uint32_t endaddr;
 | 
			
		||||
  uint32_t expected;
 | 
			
		||||
  uint32_t extension;
 | 
			
		||||
  uint16_t address16;
 | 
			
		||||
  uint8_t checksum;
 | 
			
		||||
  unsigned int lineno;
 | 
			
		||||
  int i;
 | 
			
		||||
  int ret = OK;
 | 
			
		||||
 | 
			
		||||
  /* Allocate buffer memory */
 | 
			
		||||
 | 
			
		||||
  alloc = (FAR uint8_t *)lib_malloc(LINE_ALLOC + BIN_ALLOC);
 | 
			
		||||
  if (alloc == NULL)
 | 
			
		||||
    {
 | 
			
		||||
      lerr("ERROR: Failed to allocate memory\n");
 | 
			
		||||
      return -ENOMEM;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  line = alloc;
 | 
			
		||||
  bin  = &alloc[LINE_ALLOC];
 | 
			
		||||
 | 
			
		||||
  extension = 0;
 | 
			
		||||
  expected = 0;
 | 
			
		||||
  lineno = 0;
 | 
			
		||||
 | 
			
		||||
  /* Read and process the HEX input stream stream until the end of file
 | 
			
		||||
   * record is received (or until an error occurs)
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  while ((nbytes = readstream(instream, line, lineno)) != EOF)
 | 
			
		||||
    {
 | 
			
		||||
      /* Increment the line number */
 | 
			
		||||
 | 
			
		||||
      lineno++;
 | 
			
		||||
 | 
			
		||||
      /* Did we read enough data to do anything? */
 | 
			
		||||
 | 
			
		||||
      if (nbytes < MINRECORD_ASCSIZE)
 | 
			
		||||
        {
 | 
			
		||||
          lerr("Line %u ERROR: Record too short: %d\n", lineno, nbytes);
 | 
			
		||||
          goto errout_with_einval;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      /* We should always read an even number of bytes */
 | 
			
		||||
 | 
			
		||||
      if ((nbytes & 1) != 0)
 | 
			
		||||
        {
 | 
			
		||||
          lerr("Line %u ERROR: Record length is odd: %d\n", lineno, nbytes);
 | 
			
		||||
          goto errout_with_einval;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      /* Get the data byte count */
 | 
			
		||||
 | 
			
		||||
      bytecount = byte2bin(&line[BYTECOUNT_LINENDX]);
 | 
			
		||||
      if (bytecount < 0)
 | 
			
		||||
        {
 | 
			
		||||
          lerr("Line %u ERROR: Failed to read bytecount: %d\n",
 | 
			
		||||
               lineno, bytecount);
 | 
			
		||||
          ret = bytecount;
 | 
			
		||||
          goto errout_with_buffers;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      /* Verify that the bytecount matches the length of the record */
 | 
			
		||||
 | 
			
		||||
      if (RECORD_ASCSIZE(bytecount) != nbytes)
 | 
			
		||||
        {
 | 
			
		||||
          lerr("Line %u ERROR: Expected %d bytes, read %d\n",
 | 
			
		||||
               lineno, RECORD_ASCSIZE(bytecount), nbytes);
 | 
			
		||||
          goto errout_with_einval;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      /* Convert the entire line to binary.  We need to do this for
 | 
			
		||||
       * checksum calculation which includes the entire line (minus
 | 
			
		||||
       * the start code and the checksum at the end of the line itself)
 | 
			
		||||
       */
 | 
			
		||||
 | 
			
		||||
      ret = data2bin(bin, line, nbytes);
 | 
			
		||||
      if (ret < 0)
 | 
			
		||||
        {
 | 
			
		||||
          lerr("Line %u ERROR: Failed to convert line to binary: %d\n",
 | 
			
		||||
               lineno, ret);
 | 
			
		||||
          goto errout_with_buffers;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      /* Calculate and verify the checksum over all of the data */
 | 
			
		||||
 | 
			
		||||
      nbytes >>= 1;  /* Number of bytes in bin[] */
 | 
			
		||||
      checksum = 0;
 | 
			
		||||
 | 
			
		||||
      for (i = 0; i < nbytes; i++)
 | 
			
		||||
        {
 | 
			
		||||
          checksum += bin[i];
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      if (checksum != 0)
 | 
			
		||||
        {
 | 
			
		||||
          lerr("Line %u ERROR: Bad checksum %02x\n", lineno, checksum);
 | 
			
		||||
          goto errout_with_einval;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      /* Get the 16-bit (unextended) address from the record */
 | 
			
		||||
 | 
			
		||||
      address16 = (uint16_t)bin[ADDRESS_BINNDX] << 8 |
 | 
			
		||||
                  (uint16_t)bin[ADDRESS_BINNDX + 1];
 | 
			
		||||
 | 
			
		||||
      /* Handle the record by its record type */
 | 
			
		||||
 | 
			
		||||
      switch (bin[RECTYPE_BINNDX])
 | 
			
		||||
        {
 | 
			
		||||
        case RECORD_DATA: /* Data */
 | 
			
		||||
          {
 | 
			
		||||
            /* Swap data in place in the binary buffer as required */
 | 
			
		||||
 | 
			
		||||
            switch (swap)
 | 
			
		||||
              {
 | 
			
		||||
              case HEX2BIN_NOSWAP: /* No swap, stream is the correct byte order */
 | 
			
		||||
                break;
 | 
			
		||||
 | 
			
		||||
              case HEX2BIN_SWAP16: /* Swap bytes in 16-bit values */
 | 
			
		||||
                {
 | 
			
		||||
                  if ((bytecount & 1) != 0)
 | 
			
		||||
                    {
 | 
			
		||||
                      lerr("Line %d ERROR: Byte count %d is not a multiple "
 | 
			
		||||
                           "of 2\n",
 | 
			
		||||
                           lineno, bytecount);
 | 
			
		||||
                       goto errout_with_einval;
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                  /* Do the byte swap */
 | 
			
		||||
 | 
			
		||||
                  hex2bin_swap16(&bin[DATA_BINNDX], bytecount);
 | 
			
		||||
                }
 | 
			
		||||
                break;
 | 
			
		||||
 | 
			
		||||
              case HEX2BIN_SWAP32: /* Swap bytes in 32-bit values */
 | 
			
		||||
                {
 | 
			
		||||
                  if ((bytecount & 3) != 0)
 | 
			
		||||
                    {
 | 
			
		||||
                      lerr("Line %d ERROR: Byte count %d is not a multiple "
 | 
			
		||||
                           "of 4\n",
 | 
			
		||||
                           lineno, bytecount);
 | 
			
		||||
                       goto errout_with_einval;
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                  /* Do the byte swap */
 | 
			
		||||
 | 
			
		||||
                  hex2bin_swap32(&bin[DATA_BINNDX], bytecount);
 | 
			
		||||
                }
 | 
			
		||||
                break;
 | 
			
		||||
 | 
			
		||||
              default:
 | 
			
		||||
                {
 | 
			
		||||
                  lerr("ERROR: Invalid swap argument: %d\n", swap);
 | 
			
		||||
                  goto errout_with_einval;
 | 
			
		||||
                }
 | 
			
		||||
              }
 | 
			
		||||
 | 
			
		||||
            /* Get and verify the full 32-bit address */
 | 
			
		||||
 | 
			
		||||
            address = extension + (uint32_t)address16;
 | 
			
		||||
            endaddr = address + bytecount;
 | 
			
		||||
 | 
			
		||||
            if (address < baseaddr || (endpaddr != 0 && endaddr >= endpaddr))
 | 
			
		||||
              {
 | 
			
		||||
                lerr("Line %d ERROR: Extended address %08lx is out of "
 | 
			
		||||
                     "range\n",
 | 
			
		||||
                     lineno, (unsigned long)address);
 | 
			
		||||
                goto errout_with_einval;
 | 
			
		||||
              }
 | 
			
		||||
 | 
			
		||||
            /* Seek to the correct position in the OUT stream if we have
 | 
			
		||||
             * made an unexpected jump in the data address.
 | 
			
		||||
             */
 | 
			
		||||
 | 
			
		||||
            if (address != expected)
 | 
			
		||||
              {
 | 
			
		||||
                off_t pos = outstream->seek(outstream,
 | 
			
		||||
                                            address - baseaddr, SEEK_SET);
 | 
			
		||||
                if (pos == (off_t)-1)
 | 
			
		||||
                  {
 | 
			
		||||
                    lerr("Line %u ERROR: Seek to address %08lu failed\n",
 | 
			
		||||
                         lineno, (unsigned long)address);
 | 
			
		||||
                    ret = -ESPIPE;
 | 
			
		||||
                    goto errout_with_buffers;
 | 
			
		||||
                  }
 | 
			
		||||
              }
 | 
			
		||||
 | 
			
		||||
            /* Transfer data to the OUT stream */
 | 
			
		||||
 | 
			
		||||
            writedata(outstream, &bin[DATA_BINNDX], bytecount);
 | 
			
		||||
 | 
			
		||||
            /* This is the next data address that we expect to see */
 | 
			
		||||
 | 
			
		||||
            expected = address + bytecount;
 | 
			
		||||
          }
 | 
			
		||||
          break;
 | 
			
		||||
 | 
			
		||||
        case RECORD_EOF: /* End of file */
 | 
			
		||||
 | 
			
		||||
          /*  End Of File record.  Must occur exactly once per file in the
 | 
			
		||||
           * last line of the file. The byte count is 00 and the data field
 | 
			
		||||
           * is empty. Usually the address field is also 0000.
 | 
			
		||||
           */
 | 
			
		||||
 | 
			
		||||
          if (bytecount == 0)
 | 
			
		||||
            {
 | 
			
		||||
              ret = OK;
 | 
			
		||||
              goto exit_with_buffers;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
          lerr("Line %u ERROR: Nonzero bytecount %d in EOF\n",
 | 
			
		||||
               lineno, bytecount);
 | 
			
		||||
          goto errout_with_einval;
 | 
			
		||||
 | 
			
		||||
        case RECORD_EXT_SEGADDR: /* Extended segment address record */
 | 
			
		||||
 | 
			
		||||
          /* The address specified by the data field is multiplied by 16
 | 
			
		||||
           * (shifted 4 bits left) and added to the subsequent data record
 | 
			
		||||
           * addresses. This allows addressing of up to a megabyte of
 | 
			
		||||
           * address space. The address field of this record has to be
 | 
			
		||||
           * 0000, the byte count is 02 (the segment is 16-bit). The
 | 
			
		||||
           * least significant hex digit of the segment address is always
 | 
			
		||||
           * 0.
 | 
			
		||||
           */
 | 
			
		||||
 | 
			
		||||
          if (bytecount != 2 || address16 != 0 || bin[DATA_BINNDX + 1] != 0)
 | 
			
		||||
            {
 | 
			
		||||
              lerr("Line %u ERROR: Invalid segment address\n", lineno);
 | 
			
		||||
              lerr("  bytecount=%d address=%04x segment=%02x%02x\n",
 | 
			
		||||
                   bytecount, address16, bin[DATA_BINNDX],
 | 
			
		||||
                   bin[DATA_BINNDX + 1]);
 | 
			
		||||
              goto errout_with_einval;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
          extension = (uint32_t)bin[DATA_BINNDX] << 12;
 | 
			
		||||
          break;
 | 
			
		||||
 | 
			
		||||
        case RECORD_START_SEGADDR: /* Start segment address record */
 | 
			
		||||
 | 
			
		||||
          /* For 80x86 processors, it specifies the initial content of
 | 
			
		||||
           * the CS:IP registers. The address field is 0000, the byte
 | 
			
		||||
           * count is 04, the first two bytes are the CS value, the
 | 
			
		||||
           * latter two are the IP value.
 | 
			
		||||
           */
 | 
			
		||||
 | 
			
		||||
          break;
 | 
			
		||||
 | 
			
		||||
        case RECORD_EXT_LINADDR: /* Extended linear address record */
 | 
			
		||||
 | 
			
		||||
          /* The address field is 0000, the byte count is 02. The two
 | 
			
		||||
           * data bytes (two hex digit pairs in big endian order)
 | 
			
		||||
           * represent the upper 16 bits of the 32 bit address for
 | 
			
		||||
           * all subsequent 00 type records until the next 04 type
 | 
			
		||||
           * record comes. If there is not a 04 type record, the
 | 
			
		||||
           * upper 16 bits default to 0000. To get the absolute
 | 
			
		||||
           * address for subsequent 00 type records, the address
 | 
			
		||||
           * specified by the data field of the most recent 04 record
 | 
			
		||||
           * is added to the 00 record addresses.
 | 
			
		||||
           */
 | 
			
		||||
 | 
			
		||||
          if (bytecount != 2 || address16 != 0)
 | 
			
		||||
            {
 | 
			
		||||
              lerr("Line %u ERROR: Invalid linear address\n", lineno);
 | 
			
		||||
              lerr("  bytecount=%d address=%04x\n", bytecount, address16);
 | 
			
		||||
              goto errout_with_einval;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
          extension = (uint32_t)bin[DATA_BINNDX] << 24 |
 | 
			
		||||
                      (uint32_t)bin[DATA_BINNDX + 1] << 16;
 | 
			
		||||
          break;
 | 
			
		||||
 | 
			
		||||
        case RECORD_START_LINADDR: /* Start linear address record */
 | 
			
		||||
 | 
			
		||||
          /* The address field is 0000, the byte count is 04. The 4
 | 
			
		||||
           * data bytes represent the 32-bit value loaded into the EIP
 | 
			
		||||
           * register of the 80386 and higher CPU.
 | 
			
		||||
           */
 | 
			
		||||
 | 
			
		||||
          break;
 | 
			
		||||
 | 
			
		||||
        default:
 | 
			
		||||
          break;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  lerr("ERROR: No EOF record found\n");
 | 
			
		||||
 | 
			
		||||
errout_with_einval:
 | 
			
		||||
  ret = -EINVAL;
 | 
			
		||||
 | 
			
		||||
errout_with_buffers:
 | 
			
		||||
exit_with_buffers:
 | 
			
		||||
  lib_free(alloc);
 | 
			
		||||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif /* CONFIG_LIBC_HEX2BIN */
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Loading…
	
		Reference in New Issue