Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
75 commits
Select commit Hold shift + click to select a range
b32d6c7
unified USBD audio
Mar 17, 2022
683cb5c
usbd updates
Mar 17, 2022
87e81a3
usbd working, usbh power error
Mar 17, 2022
02c3743
revert library version fixes USB audio
Mar 17, 2022
7316ce6
unified usbh
Mar 17, 2022
940a9d0
refactored mpu
Mar 17, 2022
488749a
pin config
Mar 18, 2022
95b3a36
support dynamic log/pow tables
Mar 19, 2022
0f7eeb9
support dynamic log/pow tables
Mar 19, 2022
73d927d
include device.h
Mar 19, 2022
f997017
task and resource handling
Mar 19, 2022
1c6cacf
use unified usbh
Mar 19, 2022
d9b380e
include d2data section
Mar 19, 2022
caa355f
link file for green Xibeca prototypes
Mar 19, 2022
59a83f4
adc updates
Mar 19, 2022
ce700f7
log/pow tables
Mar 20, 2022
8712e77
exit program on allocation
Mar 20, 2022
bda0823
H750 updates
Mar 20, 2022
d9c7dfe
updated D2/D3 configurations
Mar 20, 2022
e7618d5
use HEAP_D2 to side-load new patch
Mar 20, 2022
001b824
minimise debug size
Mar 23, 2022
d2fe429
push-pull / open drain mode control updated
Mar 23, 2022
b74f321
gpio / dac updates
Mar 23, 2022
0b10789
default to small blocksize
Mar 23, 2022
9b97328
wip BioSignals fail
Mar 23, 2022
4f938bc
wip not building
Mar 23, 2022
43ee1d3
bootloader mode
Mar 23, 2022
d3184c5
working configuration
Mar 23, 2022
36260b4
updated for common usbd implementation
Mar 23, 2022
525bee4
moved C_SRC_USBD/_AUDIO to libs
Mar 23, 2022
5aa400c
unified usb
Mar 24, 2022
2cfb734
unified usb
Mar 24, 2022
398b8ee
unified usb
Mar 24, 2022
a45b7a3
unified usb
Mar 24, 2022
6ede72c
unified usb
Mar 24, 2022
4d49e4a
unified usb
Mar 24, 2022
df8e330
use unified usbh
Mar 24, 2022
a917e6b
use correct fs/hs defines
Mar 24, 2022
b2ecfa3
correct STM32F4 system bootloader address
Mar 24, 2022
3e6f344
add HOST_HS/FS and USB magic definitions
Mar 24, 2022
1c76d5e
use startup code with ability to switch to system (ie dfu) bootloader
Mar 24, 2022
0619b25
tidy config
Mar 24, 2022
b6b71ed
tidy config
Mar 24, 2022
ba4814b
tidy config
Mar 24, 2022
8c23b40
updated notes
Mar 24, 2022
5233987
Merge branch 'develop' into feature/acdc
Mar 24, 2022
e705724
Merge branch 'feature/usb-refactor' into feature/acdc
Mar 24, 2022
24041d8
Merge branch 'feature/startup-dfu' into feature/acdc
Mar 24, 2022
8be7114
Merge branch 'develop' into feature/usbd-startup-refactor
Mar 24, 2022
5a327bd
bump version and update history
Mar 24, 2022
38211d9
allow for CVs to be unassigned
Mar 25, 2022
6fd1847
always check last character of parameter name for > sign
Mar 26, 2022
1fc2c49
CV assign fixes
Mar 26, 2022
73d563e
don't use global variable in callbacks
Mar 26, 2022
05dc03e
patched library
Mar 26, 2022
bc408a0
configurable pre/post usb audio routing
Mar 27, 2022
74de899
fix pre/post usb audio routing
Mar 27, 2022
fc0078f
debounce encoder switches
Mar 28, 2022
af93373
try to prevent SAI DMA errors
Mar 28, 2022
a52c723
backwards compatible with zero resource crc
Mar 28, 2022
a4ecc13
Return 0 from flash_write on success. Streamlined address and instruc…
Mar 28, 2022
dc4c3d2
cleanup
Mar 28, 2022
7428511
use stored crc to compare data on write
Mar 28, 2022
026a24e
default to 32 out of max 512 blocksize
Mar 28, 2022
f57d929
increased FreeRTOS heap size
Mar 28, 2022
6ca716d
streamlined flags, use -O3
Mar 28, 2022
44767fe
PatchDefinition::copy returns success if copy not required (i.e. on p…
Mar 28, 2022
cd62e64
bump version and update history
Mar 28, 2022
0160d0e
updated pin configuration code
Mar 28, 2022
f1002fa
updated pin configuration code
Mar 28, 2022
9221152
fix usb dependencies
Mar 28, 2022
23ec36b
reduce max blocksize to not exceed available memory
Mar 28, 2022
6c15407
updated pin configuration code
Mar 28, 2022
d01c002
v22.4.rc1
Mar 28, 2022
c569cb4
added pow/log table compilation units
Mar 28, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 6 additions & 18 deletions ACDC/ACDC.ioc
Original file line number Diff line number Diff line change
Expand Up @@ -148,17 +148,16 @@ Mcu.IP15=TIM4
Mcu.IP16=TIM8
Mcu.IP17=UART5
Mcu.IP18=UART7
Mcu.IP19=USB_DEVICE
Mcu.IP19=USB_OTG_FS
Mcu.IP2=DEBUG
Mcu.IP20=USB_OTG_FS
Mcu.IP3=DMA
Mcu.IP4=FMC
Mcu.IP5=FREERTOS
Mcu.IP6=NVIC
Mcu.IP7=QUADSPI
Mcu.IP8=RCC
Mcu.IP9=SAI1
Mcu.IPNb=21
Mcu.IPNb=20
Mcu.Name=STM32H743IIKx
Mcu.Package=UFBGA176
Mcu.Pin0=PE3
Expand All @@ -176,7 +175,6 @@ Mcu.Pin108=PB11
Mcu.Pin109=VP_FREERTOS_VS_CMSIS_V1
Mcu.Pin11=PE5
Mcu.Pin110=VP_SYS_VS_Systick
Mcu.Pin111=VP_USB_DEVICE_VS_USB_DEVICE_AUDIO_FS
Mcu.Pin12=PE6
Mcu.Pin13=PB7
Mcu.Pin14=PB6
Expand Down Expand Up @@ -273,7 +271,7 @@ Mcu.Pin96=PD8
Mcu.Pin97=PA3
Mcu.Pin98=PA7
Mcu.Pin99=PB1
Mcu.PinsNb=112
Mcu.PinsNb=111
Mcu.ThirdPartyNb=0
Mcu.UserConstants=
Mcu.UserName=STM32H743IIKx
Expand Down Expand Up @@ -532,8 +530,8 @@ ProjectManager.FreePins=true
ProjectManager.HalAssertFull=true
ProjectManager.HeapSize=0x200
ProjectManager.KeepUserCode=true
ProjectManager.LastFirmware=true
ProjectManager.LibraryCopy=1
ProjectManager.LastFirmware=false
ProjectManager.LibraryCopy=2
ProjectManager.MainLocation=Core/Src
ProjectManager.NoMain=false
ProjectManager.PreviousToolchain=
Expand All @@ -545,7 +543,7 @@ ProjectManager.StackSize=0x400
ProjectManager.TargetToolchain=Other Toolchains (GPDSC)
ProjectManager.ToolChainLocation=
ProjectManager.UnderRoot=false
ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-MX_DMA_Init-DMA-false-HAL-true,3-SystemClock_Config-RCC-false-HAL-false,4-MX_QUADSPI_Init-QUADSPI-false-HAL-true,5-MX_FMC_Init-FMC-false-HAL-true,6-MX_SAI1_Init-SAI1-false-HAL-true,7-MX_ADC1_Init-ADC1-false-HAL-true,8-MX_SPI2_Init-SPI2-false-HAL-true,9-MX_SPI3_Init-SPI3-false-HAL-true,10-MX_TIM2_Init-TIM2-false-HAL-true,11-MX_TIM4_Init-TIM4-false-HAL-true,12-MX_UART5_Init-UART5-false-HAL-true,13-MX_UART7_Init-UART7-false-HAL-true,14-MX_USB_DEVICE_Init-USB_DEVICE-false-HAL-false,15-MX_TIM8_Init-TIM8-false-HAL-true,16-MX_TIM3_Init-TIM3-false-HAL-true,0-MX_CORTEX_M7_Init-CORTEX_M7-false-HAL-true
ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-MX_DMA_Init-DMA-false-HAL-true,3-SystemClock_Config-RCC-false-HAL-false,4-MX_QUADSPI_Init-QUADSPI-false-HAL-true,5-MX_FMC_Init-FMC-false-HAL-true,6-MX_SAI1_Init-SAI1-false-HAL-true,7-MX_ADC1_Init-ADC1-false-HAL-true,8-MX_SPI2_Init-SPI2-false-HAL-true,9-MX_SPI3_Init-SPI3-false-HAL-true,10-MX_TIM2_Init-TIM2-false-HAL-true,11-MX_TIM4_Init-TIM4-false-HAL-true,12-MX_UART5_Init-UART5-false-HAL-true,13-MX_UART7_Init-UART7-false-HAL-true,14-MX_TIM8_Init-TIM8-false-HAL-true,15-MX_TIM3_Init-TIM3-false-HAL-true,16-MX_USB_OTG_FS_PCD_Init-USB_OTG_FS-false-HAL-true,0-MX_CORTEX_M7_Init-CORTEX_M7-false-HAL-true
QUADSPI.ClockPrescaler=9
QUADSPI.FifoThreshold=4
QUADSPI.FlashSize=22
Expand Down Expand Up @@ -863,20 +861,10 @@ TIM8.Channel-PWM\ Generation2\ CH2=TIM_CHANNEL_2
TIM8.IPParameters=Channel-PWM Generation1 CH1,Channel-PWM Generation2 CH2,Period,Prescaler
TIM8.Period=1023
TIM8.Prescaler=100
USB_DEVICE.CLASS_NAME_FS=AUDIO
USB_DEVICE.IPParameters=VirtualMode-AUDIO_FS,VirtualModeFS,CLASS_NAME_FS,VID-AUDIO_FS,MANUFACTURER_STRING-AUDIO_FS,PID_AUDIO_FS,PRODUCT_STRING_AUDIO_FS
USB_DEVICE.MANUFACTURER_STRING-AUDIO_FS=Rebel Technology
USB_DEVICE.PID_AUDIO_FS=0xDADA
USB_DEVICE.PRODUCT_STRING_AUDIO_FS=OWL-ACDC
USB_DEVICE.VID-AUDIO_FS=0x1209
USB_DEVICE.VirtualMode-AUDIO_FS=Audio
USB_DEVICE.VirtualModeFS=Audio_FS
USB_OTG_FS.IPParameters=VirtualMode
USB_OTG_FS.VirtualMode=Device_Only
VP_FREERTOS_VS_CMSIS_V1.Mode=CMSIS_V1
VP_FREERTOS_VS_CMSIS_V1.Signal=FREERTOS_VS_CMSIS_V1
VP_SYS_VS_Systick.Mode=SysTick
VP_SYS_VS_Systick.Signal=SYS_VS_Systick
VP_USB_DEVICE_VS_USB_DEVICE_AUDIO_FS.Mode=AUDIO_FS
VP_USB_DEVICE_VS_USB_DEVICE_AUDIO_FS.Signal=USB_DEVICE_VS_USB_DEVICE_AUDIO_FS
board=custom
4 changes: 4 additions & 0 deletions ACDC/Core/Inc/hardware.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,17 @@
#define OWL_XIBECA
#define HARDWARE_ID XIBECA_HARDWARE
#define HARDWARE_VERSION "AC/DC"
#define USBD_PRODUCT_STRING_FSHS "OWL-ACDC"

/* #define NO_EXTERNAL_RAM */
/* #define NO_CCM_RAM */
#define DMA_RAM __attribute__ ((section (".dmadata")))

/* note that with H750, PLUS_RAM may be used by firmware */
#define USE_PLUS_RAM

#define USE_FAST_POW_RESOURCES

#ifdef NDEBUG
#define USE_ICACHE
#define USE_DCACHE
Expand Down
29 changes: 29 additions & 0 deletions ACDC/Core/Src/ACDC.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
#include "message.h"
#include "Codec.h"
#include "flash.h"
#include "Storage.h"
#include "ServiceCall.h"

#define XIBECA_PIN3 GPIOD, GPIO_PIN_2
#define XIBECA_PIN4 GPIOG, GPIO_PIN_10
Expand Down Expand Up @@ -182,3 +184,30 @@ void onLoop(void){
setLed(i+5, getParameterValue(PARAMETER_BA+i));
}
}

#ifdef USE_FAST_POW_RESOURCES
uint32_t fast_log_table_size = 0;
uint32_t fast_pow_table_size = 0;
float fast_log_table[16384] __attribute__ ((section (".d2data")));
uint32_t fast_pow_table[2048] __attribute__ ((section (".d2data")));
void onResourceUpdate(){
Resource* res = storage.getResourceByName(SYSTEM_TABLE_LOG ".bin");
if(res && res->isValid()){
fast_log_table_size = std::min(res->getDataSize()/sizeof(float), 16384U);
storage.readResource(res->getHeader(), fast_log_table, 0, fast_log_table_size*sizeof(float));
}else{
fast_log_table_size = 0;
}
res = storage.getResourceByName(SYSTEM_TABLE_POW ".bin");
if(res && res->isValid()){
fast_pow_table_size = std::min(res->getDataSize()/sizeof(uint32_t), 2048U);
storage.readResource(res->getHeader(), fast_pow_table, 0, fast_pow_table_size*sizeof(uint32_t));
}else{
fast_pow_table_size = 0;
}
debugMessage("log/pow", fast_log_table_size, fast_pow_table_size);
}
#else
#include "FastLogTable.h"
#include "FastPowTable.h"
#endif
44 changes: 40 additions & 4 deletions ACDC/Core/Src/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,6 @@
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "cmsis_os.h"
#include "usb_device.h"
#include "usb_device.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
Expand Down Expand Up @@ -66,6 +64,8 @@ TIM_HandleTypeDef htim8;
UART_HandleTypeDef huart5;
UART_HandleTypeDef huart7;

PCD_HandleTypeDef hpcd_USB_OTG_FS;

SDRAM_HandleTypeDef hsdram1;

osThreadId defaultTaskHandle;
Expand All @@ -90,6 +90,7 @@ static void MX_UART5_Init(void);
static void MX_UART7_Init(void);
static void MX_TIM8_Init(void);
static void MX_TIM3_Init(void);
static void MX_USB_OTG_FS_PCD_Init(void);
void StartDefaultTask(void const * argument);

/* USER CODE BEGIN PFP */
Expand Down Expand Up @@ -176,6 +177,7 @@ int main(void)
MX_UART7_Init();
MX_TIM8_Init();
MX_TIM3_Init();
MX_USB_OTG_FS_PCD_Init();
/* USER CODE BEGIN 2 */

#ifdef USE_EXTERNAL_RAM
Expand Down Expand Up @@ -951,6 +953,42 @@ static void MX_UART7_Init(void)

}

/**
* @brief USB_OTG_FS Initialization Function
* @param None
* @retval None
*/
static void MX_USB_OTG_FS_PCD_Init(void)
{

/* USER CODE BEGIN USB_OTG_FS_Init 0 */

/* USER CODE END USB_OTG_FS_Init 0 */

/* USER CODE BEGIN USB_OTG_FS_Init 1 */

/* USER CODE END USB_OTG_FS_Init 1 */
hpcd_USB_OTG_FS.Instance = USB_OTG_FS;
hpcd_USB_OTG_FS.Init.dev_endpoints = 9;
hpcd_USB_OTG_FS.Init.speed = PCD_SPEED_FULL;
hpcd_USB_OTG_FS.Init.dma_enable = DISABLE;
hpcd_USB_OTG_FS.Init.phy_itface = PCD_PHY_EMBEDDED;
hpcd_USB_OTG_FS.Init.Sof_enable = DISABLE;
hpcd_USB_OTG_FS.Init.low_power_enable = DISABLE;
hpcd_USB_OTG_FS.Init.lpm_enable = DISABLE;
hpcd_USB_OTG_FS.Init.battery_charging_enable = ENABLE;
hpcd_USB_OTG_FS.Init.vbus_sensing_enable = ENABLE;
hpcd_USB_OTG_FS.Init.use_dedicated_ep1 = DISABLE;
if (HAL_PCD_Init(&hpcd_USB_OTG_FS) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN USB_OTG_FS_Init 2 */

/* USER CODE END USB_OTG_FS_Init 2 */

}

/**
* Enable DMA controller clock
*/
Expand Down Expand Up @@ -1182,8 +1220,6 @@ static void MX_GPIO_Init(void)
/* USER CODE END Header_StartDefaultTask */
void StartDefaultTask(void const * argument)
{
/* init code for USB_DEVICE */
MX_USB_DEVICE_Init();
/* USER CODE BEGIN 5 */

setup();
Expand Down
89 changes: 89 additions & 0 deletions ACDC/Core/Src/stm32h7xx_hal_msp.c
Original file line number Diff line number Diff line change
Expand Up @@ -799,6 +799,95 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)

}

/**
* @brief PCD MSP Initialization
* This function configures the hardware resources used in this example
* @param hpcd: PCD handle pointer
* @retval None
*/
void HAL_PCD_MspInit(PCD_HandleTypeDef* hpcd)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
if(hpcd->Instance==USB_OTG_FS)
{
/* USER CODE BEGIN USB_OTG_FS_MspInit 0 */

/* USER CODE END USB_OTG_FS_MspInit 0 */
/** Initializes the peripherals clock
*/
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USB;
PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_HSI48;
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
{
Error_Handler();
}
/** Enable USB Voltage detector
*/
HAL_PWREx_EnableUSBVoltageDetector();

__HAL_RCC_GPIOA_CLK_ENABLE();
/**USB_OTG_FS GPIO Configuration
PA12 ------> USB_OTG_FS_DP
PA11 ------> USB_OTG_FS_DM
PA9 ------> USB_OTG_FS_VBUS
*/
GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_11;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF10_OTG1_FS;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

GPIO_InitStruct.Pin = GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

/* Peripheral clock enable */
__HAL_RCC_USB_OTG_FS_CLK_ENABLE();
/* USB_OTG_FS interrupt Init */
HAL_NVIC_SetPriority(OTG_FS_IRQn, 5, 0);
HAL_NVIC_EnableIRQ(OTG_FS_IRQn);
/* USER CODE BEGIN USB_OTG_FS_MspInit 1 */

/* USER CODE END USB_OTG_FS_MspInit 1 */
}

}

/**
* @brief PCD MSP De-Initialization
* This function freeze the hardware resources used in this example
* @param hpcd: PCD handle pointer
* @retval None
*/
void HAL_PCD_MspDeInit(PCD_HandleTypeDef* hpcd)
{
if(hpcd->Instance==USB_OTG_FS)
{
/* USER CODE BEGIN USB_OTG_FS_MspDeInit 0 */

/* USER CODE END USB_OTG_FS_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_USB_OTG_FS_CLK_DISABLE();

/**USB_OTG_FS GPIO Configuration
PA12 ------> USB_OTG_FS_DP
PA11 ------> USB_OTG_FS_DM
PA9 ------> USB_OTG_FS_VBUS
*/
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_12|GPIO_PIN_11|GPIO_PIN_9);

/* USB_OTG_FS interrupt DeInit */
HAL_NVIC_DisableIRQ(OTG_FS_IRQn);
/* USER CODE BEGIN USB_OTG_FS_MspDeInit 1 */

/* USER CODE END USB_OTG_FS_MspDeInit 1 */
}

}

static uint32_t FMC_Initialized = 0;

static void HAL_FMC_MspInit(void){
Expand Down
2 changes: 1 addition & 1 deletion ACDC/Core/Src/stm32h7xx_it.c
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,6 @@
/* USER CODE END 0 */

/* External variables --------------------------------------------------------*/
extern PCD_HandleTypeDef hpcd_USB_OTG_FS;
extern DMA_HandleTypeDef hdma_adc1;
extern ADC_HandleTypeDef hadc1;
extern QSPI_HandleTypeDef hqspi;
Expand All @@ -68,6 +67,7 @@ extern SAI_HandleTypeDef hsai_BlockA1;
extern SAI_HandleTypeDef hsai_BlockB1;
extern DMA_HandleTypeDef hdma_spi3_tx;
extern SPI_HandleTypeDef hspi3;
extern PCD_HandleTypeDef hpcd_USB_OTG_FS;
/* USER CODE BEGIN EV */

/* USER CODE END EV */
Expand Down
13 changes: 3 additions & 10 deletions ACDC/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -2,33 +2,26 @@ PROJECT = ACDC
BUILDROOT = .
OPENWARE ?= $(BUILDROOT)/..

LDSCRIPT = $(OPENWARE)/Hardware/xibeca.ld
include $(OPENWARE)/Hardware/owl3.mk
include $(OPENWARE)/Hardware/xibeca.mk

C_SRC = $(wildcard Core/Src/*.c)
CPP_SRC = $(wildcard Core/Src/*.cpp)
C_SRC += $(OPENWARE)/Source/pcm3168a.c
C_SRC += $(OPENWARE)/Source/usbd_audio.c
C_SRC += $(OPENWARE)/Source/sdram-as4cXm32.c
C_SRC += $(OPENWARE)/Source/flash-qspi.c
S_SRC = $(BUILDROOT)/Core/Src/startup_stm32h743xx.s
C_SRC += $(BUILDROOT)/USB_DEVICE/App/usb_device.c
C_SRC += $(BUILDROOT)/USB_DEVICE/App/usbd_desc.c
C_SRC += $(BUILDROOT)/USB_DEVICE/Target/usbd_conf.c

include $(OPENWARE)/Hardware/sources.mk

C_SRC += $(C_SRC_SAI)
# C_SRC += $(C_SRC_DAC)
C_SRC += $(C_SRC_SDRAM)
C_SRC += $(C_SRC_USBD)
# C_SRC += $(C_SRC_USBH)
C_SRC += $(C_SRC_DSP)
C_SRC += $(C_SRC_OS)
C_SRC += $(C_SRC_UART)
C_SRC += $(C_SRC_I2C)
C_SRC += $(C_SRC_QSPI)
C_SRC += $(C_SRC_MDMA)
C_SRC += $(C_SRC_USBD)
C_SRC += $(C_SRC_USBD_AUDIO)

include $(OPENWARE)/Hardware/h7.mk

Expand Down
Loading