diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 9d3293bd..e86c6e43 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -1,6 +1,12 @@ lib_xud Change Log ================== +0.2.0 +----- + + * CHANGE: Pass channel end for hardware peripheral messages rather than + allocating one with each message + 0.1.1 ----- @@ -9,6 +15,7 @@ lib_xud Change Log * RESOLVED: Continuous suspend/resume notifications when host disconnected (introduced earlier as part of #11813) + 0.1.0 ----- diff --git a/examples/AN00124_CDC_VCOM_class/src/main.xc b/examples/AN00124_CDC_VCOM_class/src/main.xc index ff3a7d93..0934f5f8 100644 --- a/examples/AN00124_CDC_VCOM_class/src/main.xc +++ b/examples/AN00124_CDC_VCOM_class/src/main.xc @@ -28,6 +28,7 @@ void app_virtual_com(client interface usb_cdc_interface cdc) { int main() { /* Channels to communicate with USB endpoints */ chan c_ep_out[XUD_EP_COUNT_OUT], c_ep_in[XUD_EP_COUNT_IN]; + chan c_set_addr; /* Interface to communicate with USB CDC (Virtual Serial) */ interface usb_cdc_interface cdc_data; @@ -37,7 +38,7 @@ int main() { null, epTypeTableOut, epTypeTableIn, null, null, -1 , XUD_SPEED_HS, XUD_PWR_BUS); - on USB_TILE: Endpoint0(c_ep_out[0], c_ep_in[0]); + on USB_TILE: Endpoint0(c_ep_out[0], c_ep_in[0], c_set_addr); on USB_TILE: CdcEndpointsHandler(c_ep_in[1], c_ep_out[1], c_ep_in[2], cdc_data); diff --git a/examples/AN00124_CDC_VCOM_class/src/xud_cdc.h b/examples/AN00124_CDC_VCOM_class/src/xud_cdc.h index a65416a6..1a74066b 100644 --- a/examples/AN00124_CDC_VCOM_class/src/xud_cdc.h +++ b/examples/AN00124_CDC_VCOM_class/src/xud_cdc.h @@ -24,7 +24,7 @@ interface usb_cdc_interface { }; /* Endpoint 0 handling both std USB requests and CDC class specific requests */ -void Endpoint0(chanend chan_ep0_out, chanend chan_ep0_in); +void Endpoint0(chanend chan_ep0_out, chanend chan_ep0_in, chanend c_set_addr); /* Function to handle all endpoints of the CDC class excluding control endpoint0 */ void CdcEndpointsHandler(chanend c_epint_in, chanend c_epbulk_out, chanend c_epbulk_in, diff --git a/examples/AN00124_CDC_VCOM_class/src/xud_cdc.xc b/examples/AN00124_CDC_VCOM_class/src/xud_cdc.xc index 100f77be..5e56f58e 100644 --- a/examples/AN00124_CDC_VCOM_class/src/xud_cdc.xc +++ b/examples/AN00124_CDC_VCOM_class/src/xud_cdc.xc @@ -250,7 +250,7 @@ XUD_Result_t ControlInterfaceClassRequests(XUD_ep ep_out, XUD_ep ep_in, USB_Setu } /* Endpoint 0 handling both std USB requests and CDC class specific requests */ -void Endpoint0(chanend chan_ep0_out, chanend chan_ep0_in) +void Endpoint0(chanend chan_ep0_out, chanend chan_ep0_in, chanend c_set_addr) { USB_SetupPacket_t sp; @@ -312,7 +312,7 @@ void Endpoint0(chanend chan_ep0_out, chanend chan_ep0_in) result = USB_StandardRequests(ep0_out, ep0_in, devDesc, sizeof(devDesc), cfgDesc, sizeof(cfgDesc), null, 0, null, 0, stringDescriptors, sizeof(stringDescriptors)/sizeof(stringDescriptors[0]), - sp, usbBusSpeed); + sp, usbBusSpeed, c_set_addr); } } diff --git a/examples/AN00125_mass_storage_class/Makefile b/examples/AN00125_mass_storage_class/Makefile index f99c9b9d..3a55eb71 100644 --- a/examples/AN00125_mass_storage_class/Makefile +++ b/examples/AN00125_mass_storage_class/Makefile @@ -3,7 +3,11 @@ # or a valid argument for the --target option when compiling. # In this case, the target depends on the build configuration. +ifeq ($(CONFIG),X200) +TARGET = XCORE-200-EXPLORER +else TARGET = SLICEKIT-U16 +endif # The APP_NAME variable determines the name of the final .xe file. It should # not include the .xe postfix. If left blank the name will default to @@ -21,6 +25,7 @@ APP_NAME = app_mass_storage_demo # These flags define two build configurations - one for U-series XCC_FLAGS_U = -O3 -report -DXUD_SERIES_SUPPORT=XUD_U_SERIES -DUSE_XSCOPE=1 -fxscope -lflash +XCC_FLAGS_X200 = -O3 -report -DXUD_SERIES_SUPPORT=XUD_X200_SERIES -DUSE_XSCOPE=1 -fxscope -lflash # The USED_MODULES variable lists other module used by the application. USED_MODULES = lib_xud lib_logging(>=2.0.0) lib_xassert(>=3.0.0) diff --git a/examples/AN00125_mass_storage_class/src/endpoint0.xc b/examples/AN00125_mass_storage_class/src/endpoint0.xc index 49acdde7..ea4e7d9d 100644 --- a/examples/AN00125_mass_storage_class/src/endpoint0.xc +++ b/examples/AN00125_mass_storage_class/src/endpoint0.xc @@ -127,7 +127,7 @@ int MassStorageEndpoint0Requests(XUD_ep ep0_out, XUD_ep ep0_in, USB_SetupPacket_ } /* Endpoint 0 Task */ -void Endpoint0(chanend chan_ep0_out, chanend chan_ep0_in) +void Endpoint0(chanend chan_ep0_out, chanend chan_ep0_in, chanend c_set_addr) { USB_SetupPacket_t sp; unsigned bmRequestType; @@ -183,7 +183,7 @@ void Endpoint0(chanend chan_ep0_out, chanend chan_ep0_in) sizeof(devDesc), cfgDesc, sizeof(cfgDesc), null, 0, null, 0, stringDescriptors, sizeof(stringDescriptors)/sizeof(stringDescriptors[0]), - sp, usbBusSpeed); + sp, usbBusSpeed, c_set_addr); } /* USB bus reset detected, reset EP and get new bus speed */ diff --git a/examples/AN00125_mass_storage_class/src/main.xc b/examples/AN00125_mass_storage_class/src/main.xc index dafd11c5..d49209eb 100644 --- a/examples/AN00125_mass_storage_class/src/main.xc +++ b/examples/AN00125_mass_storage_class/src/main.xc @@ -23,13 +23,14 @@ void xscope_user_init(void) { #endif /* Prototype for Endpoint0 function in endpoint0.xc */ -void Endpoint0(chanend c_ep0_out, chanend c_ep0_in); +void Endpoint0(chanend c_ep0_out, chanend c_ep0_in, chanend c_set_addr); /* The main function runs three cores: the XUD manager, Endpoint 0, and a mass storage endpoint. An array of channels is used for both IN and OUT endpoints */ int main() { chan c_ep_out[XUD_EP_COUNT_OUT], c_ep_in[XUD_EP_COUNT_IN]; + chan c_set_addr; par { @@ -37,7 +38,7 @@ int main() null, epTypeTableOut, epTypeTableIn, null, null, -1 , XUD_SPEED_HS, XUD_PWR_BUS); - on USB_TILE: Endpoint0(c_ep_out[0], c_ep_in[0]); + on USB_TILE: Endpoint0(c_ep_out[0], c_ep_in[0], c_set_addr); on USB_TILE: massStorageClass(c_ep_out[1],c_ep_in[1],0); diff --git a/examples/AN00126_printer_class/src/endpoint0.xc b/examples/AN00126_printer_class/src/endpoint0.xc index 1abbf7e6..bc609ae6 100644 --- a/examples/AN00126_printer_class/src/endpoint0.xc +++ b/examples/AN00126_printer_class/src/endpoint0.xc @@ -137,7 +137,7 @@ XUD_Result_t PrinterInterfaceClassRequests(XUD_ep c_ep0_out, XUD_ep c_ep0_in, US } /* Endpoint 0 Task */ -void Endpoint0(chanend chan_ep0_out, chanend chan_ep0_in) +void Endpoint0(chanend chan_ep0_out, chanend chan_ep0_in, chanend c_set_addr) { USB_SetupPacket_t sp; @@ -204,7 +204,7 @@ void Endpoint0(chanend chan_ep0_out, chanend chan_ep0_in) result = USB_StandardRequests(ep0_out, ep0_in, devDesc, sizeof(devDesc), cfgDesc, sizeof(cfgDesc), null, 0, null, 0, stringDescriptors, sizeof(stringDescriptors)/sizeof(stringDescriptors[0]), - sp, usbBusSpeed); + sp, usbBusSpeed, c_set_addr); } } diff --git a/examples/AN00126_printer_class/src/main.xc b/examples/AN00126_printer_class/src/main.xc index 1c2b3b5e..c95dcff8 100644 --- a/examples/AN00126_printer_class/src/main.xc +++ b/examples/AN00126_printer_class/src/main.xc @@ -23,7 +23,7 @@ void xscope_user_init(void) { #endif /* Prototype for Endpoint0 function in endpoint0.xc */ -void Endpoint0(chanend c_ep0_out, chanend c_ep0_in); +void Endpoint0(chanend c_ep0_out, chanend c_ep0_in, chanend c_set_addr); /* Global report buffer, global since used by Endpoint0 core */ unsigned char g_reportBuffer[] = {0, 0, 0, 0}; @@ -78,6 +78,7 @@ void printer_main(chanend c_ep_prt_out) int main() { chan c_ep_out[XUD_EP_COUNT_OUT], c_ep_in[XUD_EP_COUNT_IN]; + chan c_set_addr; par { @@ -85,7 +86,7 @@ int main() null, epTypeTableOut, epTypeTableIn, null, null, -1 , XUD_SPEED_HS, XUD_PWR_BUS); - on USB_TILE: Endpoint0(c_ep_out[0], c_ep_in[0]); + on USB_TILE: Endpoint0(c_ep_out[0], c_ep_in[0], c_set_addr); on USB_TILE: printer_main(c_ep_out[1]); diff --git a/examples/AN00127_video_class/src/main.xc b/examples/AN00127_video_class/src/main.xc index e2955a31..fd3cd196 100644 --- a/examples/AN00127_video_class/src/main.xc +++ b/examples/AN00127_video_class/src/main.xc @@ -30,6 +30,7 @@ XUD_EpType epTypeTableIn[EP_COUNT_IN] = {XUD_EPTYPE_CTL | XUD_STATUS_ENABLE, X int main() { chan c_ep_out[EP_COUNT_OUT], c_ep_in[EP_COUNT_IN]; + chan c_set_addr; /* 'Par' statement to run the following tasks in parallel */ par @@ -38,7 +39,7 @@ int main() { null, epTypeTableOut, epTypeTableIn, null, null, -1 , XUD_SPEED_HS, XUD_PWR_BUS); - on USB_TILE: Endpoint0(c_ep_out[0], c_ep_in[0]); + on USB_TILE: Endpoint0(c_ep_out[0], c_ep_in[0], c_set_addr); on USB_TILE: VideoEndpointsHandler(c_ep_in[1], c_ep_in[2]); } diff --git a/examples/AN00127_video_class/src/usb_video.h b/examples/AN00127_video_class/src/usb_video.h index 1d6d17ee..44eddb40 100644 --- a/examples/AN00127_video_class/src/usb_video.h +++ b/examples/AN00127_video_class/src/usb_video.h @@ -13,6 +13,6 @@ void VideoEndpointsHandler(chanend c_epint_in, chanend c_episo_in); /* Endpoint 0 handles both std USB requests and Video class-specific requests */ -void Endpoint0(chanend chan_ep0_out, chanend chan_ep0_in); +void Endpoint0(chanend chan_ep0_out, chanend chan_ep0_in, chanend c_set_addr); #endif /* USB_VIDEO_H_ */ diff --git a/examples/AN00127_video_class/src/usb_video.xc b/examples/AN00127_video_class/src/usb_video.xc index 6f335015..64b44716 100644 --- a/examples/AN00127_video_class/src/usb_video.xc +++ b/examples/AN00127_video_class/src/usb_video.xc @@ -201,7 +201,7 @@ unsafe{ } /* Endpoint 0 handles both std USB requests and Video class-specific requests */ -void Endpoint0(chanend chan_ep0_out, chanend chan_ep0_in) +void Endpoint0(chanend chan_ep0_out, chanend chan_ep0_in, chanend c_set_addr) { USB_SetupPacket_t sp; @@ -270,7 +270,7 @@ void Endpoint0(chanend chan_ep0_out, chanend chan_ep0_in) result = USB_StandardRequests(ep0_out, ep0_in, devDesc, sizeof(devDesc), cfgDesc, sizeof(cfgDesc), null, 0, null, 0, stringDescriptors, sizeof(stringDescriptors)/sizeof(stringDescriptors[0]), - sp, usbBusSpeed); + sp, usbBusSpeed, c_set_addr); } } diff --git a/examples/AN00129_hid_class/src/endpoint0.xc b/examples/AN00129_hid_class/src/endpoint0.xc index caca128d..b021aa39 100644 --- a/examples/AN00129_hid_class/src/endpoint0.xc +++ b/examples/AN00129_hid_class/src/endpoint0.xc @@ -225,7 +225,7 @@ XUD_Result_t HidInterfaceClassRequests(XUD_ep c_ep0_out, XUD_ep c_ep0_in, USB_Se } /* Endpoint 0 Task */ -void Endpoint0(chanend chan_ep0_out, chanend chan_ep0_in) +void Endpoint0(chanend chan_ep0_out, chanend chan_ep0_in, chanend c_set_addr) { USB_SetupPacket_t sp; @@ -315,7 +315,7 @@ void Endpoint0(chanend chan_ep0_out, chanend chan_ep0_in) result = USB_StandardRequests(ep0_out, ep0_in, devDesc, sizeof(devDesc), cfgDesc, sizeof(cfgDesc), null, 0, null, 0, stringDescriptors, sizeof(stringDescriptors)/sizeof(stringDescriptors[0]), - sp, usbBusSpeed); + sp, usbBusSpeed, c_set_addr); } } diff --git a/examples/AN00129_hid_class/src/main.xc b/examples/AN00129_hid_class/src/main.xc index 9f8e9d40..06538bef 100644 --- a/examples/AN00129_hid_class/src/main.xc +++ b/examples/AN00129_hid_class/src/main.xc @@ -12,7 +12,7 @@ XUD_EpType epTypeTableOut[EP_COUNT_OUT] = {XUD_EPTYPE_CTL | XUD_STATUS_ENABLE}; XUD_EpType epTypeTableIn[EP_COUNT_IN] = {XUD_EPTYPE_CTL | XUD_STATUS_ENABLE, XUD_EPTYPE_BUL}; /* Prototype for Endpoint0 function in endpoint0.xc */ -void Endpoint0(chanend c_ep0_out, chanend c_ep0_in); +void Endpoint0(chanend c_ep0_out, chanend c_ep0_in, chanend c_set_addr); /* Global report buffer, global since used by Endpoint0 core */ unsigned char g_reportBuffer[4] = {0, 0, 0, 0}; @@ -84,16 +84,17 @@ void hid_mouse(chanend chan_ep_hid) int main() { chan c_ep_out[EP_COUNT_OUT], c_ep_in[EP_COUNT_IN]; + chan c_set_addr; par { - on tile[0]: XUD_Main(c_ep_out, EP_COUNT_OUT, c_ep_in, EP_COUNT_IN, - null, epTypeTableOut, epTypeTableIn, - null, null, -1 , XUD_SPEED_HS, XUD_PWR_BUS); + on USB_TILE: XUD_Main(c_ep_out, EP_COUNT_OUT, c_ep_in, EP_COUNT_IN, + null, epTypeTableOut, epTypeTableIn, + null, null, -1 , XUD_SPEED_HS, XUD_PWR_BUS); - on tile[0]: Endpoint0(c_ep_out[0], c_ep_in[0]); + on USB_TILE: Endpoint0(c_ep_out[0], c_ep_in[0], c_set_addr); - on tile[0]: hid_mouse(c_ep_in[1]); + on USB_TILE: hid_mouse(c_ep_in[1]); } diff --git a/examples/AN00131_CDC_EDC_class/src/main.xc b/examples/AN00131_CDC_EDC_class/src/main.xc index fd5a9b28..6df87279 100644 --- a/examples/AN00131_CDC_EDC_class/src/main.xc +++ b/examples/AN00131_CDC_EDC_class/src/main.xc @@ -27,6 +27,7 @@ XUD_EpType epTypeTableIn[XUD_EP_COUNT_IN] = {XUD_EPTYPE_CTL | XUD_STATUS_ENABL int main() { chan c_ep_out[XUD_EP_COUNT_OUT], c_ep_in[XUD_EP_COUNT_IN]; + chan c_set_addr; interface usb_cdc_ecm_if cdc_ecm; /* 'Par' statement to run the following tasks in parallel */ @@ -36,7 +37,7 @@ int main() { null, epTypeTableOut, epTypeTableIn, null, null, -1 , XUD_SPEED_HS, XUD_PWR_BUS); - on USB_TILE: Endpoint0(c_ep_out[0], c_ep_in[0]); + on USB_TILE: Endpoint0(c_ep_out[0], c_ep_in[0], c_set_addr); on USB_TILE: CdcEcmEndpointsHandler(c_ep_in[1], c_ep_out[1], c_ep_in[2], cdc_ecm); diff --git a/examples/AN00131_CDC_EDC_class/src/xud_ecm.h b/examples/AN00131_CDC_EDC_class/src/xud_ecm.h index 64d422cf..2866c3e1 100644 --- a/examples/AN00131_CDC_EDC_class/src/xud_ecm.h +++ b/examples/AN00131_CDC_EDC_class/src/xud_ecm.h @@ -27,7 +27,7 @@ void CdcEcmEndpointsHandler(chanend c_epint_in, chanend c_epbulk_out, chanend c_ SERVER_INTERFACE(usb_cdc_ecm_if, cdc_ecm)); /* Endpoint 0 handles both std USB requests and CDC class specific requests */ -void Endpoint0(chanend chan_ep0_out, chanend chan_ep0_in); +void Endpoint0(chanend chan_ep0_out, chanend chan_ep0_in, chanend c_set_addr); #endif /* __XUD_ECM_H__ */ diff --git a/examples/AN00131_CDC_EDC_class/src/xud_ecm.xc b/examples/AN00131_CDC_EDC_class/src/xud_ecm.xc index b7df653f..c56e2416 100644 --- a/examples/AN00131_CDC_EDC_class/src/xud_ecm.xc +++ b/examples/AN00131_CDC_EDC_class/src/xud_ecm.xc @@ -238,7 +238,7 @@ XUD_Result_t ControlInterfaceClassRequests(XUD_ep ep_out, XUD_ep ep_in, USB_Setu } /* Endpoint 0 handling both std USB requests and CDC class specific requests */ -void Endpoint0(chanend chan_ep0_out, chanend chan_ep0_in) +void Endpoint0(chanend chan_ep0_out, chanend chan_ep0_in, chanend c_set_addr) { USB_SetupPacket_t sp; @@ -303,7 +303,7 @@ void Endpoint0(chanend chan_ep0_out, chanend chan_ep0_in) result = USB_StandardRequests(ep0_out, ep0_in, devDesc, sizeof(devDesc), cfgDesc, sizeof(cfgDesc), null, 0, null, 0, stringDescriptors, sizeof(stringDescriptors)/sizeof(stringDescriptors[0]), - sp, usbBusSpeed); + sp, usbBusSpeed, c_set_addr); } } diff --git a/examples/AN00132_image_class/src/endpoint0.xc b/examples/AN00132_image_class/src/endpoint0.xc index 64391232..b3704ee4 100644 --- a/examples/AN00132_image_class/src/endpoint0.xc +++ b/examples/AN00132_image_class/src/endpoint0.xc @@ -158,7 +158,7 @@ XUD_Result_t StillImageClassRequests(XUD_ep c_ep0_out, XUD_ep c_ep0_in, USB_Setu /* Endpoint 0 Task */ -void Endpoint0(chanend chan_ep0_out, chanend chan_ep0_in) +void Endpoint0(chanend chan_ep0_out, chanend chan_ep0_in, chanend c_set_addr) { USB_SetupPacket_t sp; unsigned bmRequestType; @@ -204,7 +204,7 @@ void Endpoint0(chanend chan_ep0_out, chanend chan_ep0_in) * XUD_RES_ERR if request was not handled (i.e. STALLed) */ result = USB_StandardRequests(ep0_out, ep0_in, devDesc, sizeof(devDesc), cfgDesc, sizeof(cfgDesc), null, 0, null, 0, stringDescriptors, - sizeof(stringDescriptors)/sizeof(stringDescriptors[0]), sp, usbBusSpeed); + sizeof(stringDescriptors)/sizeof(stringDescriptors[0]), sp, usbBusSpeed, c_set_addr); /* USB bus reset detected, reset EP and get new bus speed */ if(result == XUD_RES_RST) diff --git a/examples/AN00132_image_class/src/main.xc b/examples/AN00132_image_class/src/main.xc index f4ab86f0..3893c275 100644 --- a/examples/AN00132_image_class/src/main.xc +++ b/examples/AN00132_image_class/src/main.xc @@ -34,7 +34,7 @@ enum { #define IMG_WIDTH 250 /* Prototype for Endpoint0 function in endpoint0.xc */ -void Endpoint0(chanend c_ep0_out, chanend c_ep0_in); +void Endpoint0(chanend c_ep0_out, chanend c_ep0_in, chanend c_set_addr); /* @@ -160,6 +160,7 @@ void bulk_endpoint(chanend chan_ep_from_host, chanend chan_ep_to_host) int main() { chan c_ep_out[XUD_EP_COUNT_OUT], c_ep_in[XUD_EP_COUNT_IN]; + chan c_set_addr; par { @@ -167,7 +168,7 @@ int main() null, epTypeTableOut, epTypeTableIn, null, null, -1 , XUD_SPEED_HS, XUD_PWR_BUS); - on USB_TILE: Endpoint0(c_ep_out[0], c_ep_in[0]); + on USB_TILE: Endpoint0(c_ep_out[0], c_ep_in[0], c_set_addr); on USB_TILE: bulk_endpoint(c_ep_out[1], c_ep_in[1]); diff --git a/examples/AN00135_test_and_measurement_class/src/endpoint0.xc b/examples/AN00135_test_and_measurement_class/src/endpoint0.xc index 7b656a83..4088b0a6 100644 --- a/examples/AN00135_test_and_measurement_class/src/endpoint0.xc +++ b/examples/AN00135_test_and_measurement_class/src/endpoint0.xc @@ -221,7 +221,7 @@ XUD_Result_t ControlEndpointClassRequests(XUD_ep ep_out, XUD_ep ep_in, USB_Setup } /* Endpoint 0 Task */ -void Endpoint0(chanend chan_ep0_out, chanend chan_ep0_in) +void Endpoint0(chanend chan_ep0_out, chanend chan_ep0_in, chanend c_set_addr) { USB_SetupPacket_t sp; XUD_BusSpeed_t usbBusSpeed; @@ -299,7 +299,7 @@ void Endpoint0(chanend chan_ep0_out, chanend chan_ep0_in) sizeof(devDesc), cfgDesc, sizeof(cfgDesc), null, 0, null, 0, stringDescriptors, sizeof(stringDescriptors)/sizeof(stringDescriptors[0]), - sp, usbBusSpeed); + sp, usbBusSpeed, c_set_addr); } /* USB bus reset detected, reset EP and get new bus speed */ diff --git a/examples/AN00135_test_and_measurement_class/src/main.xc b/examples/AN00135_test_and_measurement_class/src/main.xc index 9c861a61..fc2a5c6e 100644 --- a/examples/AN00135_test_and_measurement_class/src/main.xc +++ b/examples/AN00135_test_and_measurement_class/src/main.xc @@ -11,7 +11,7 @@ XUD_EpType epTypeTableIn[XUD_EP_COUNT_IN] = {XUD_EPTYPE_CTL | XUD_STATUS_ENABL /* Prototype for Endpoint0 function in endpoint0.xc */ -void Endpoint0(chanend c_ep0_out, chanend c_ep0_in); +void Endpoint0(chanend c_ep0_out, chanend c_ep0_in, chanend c_set_addr); void usbtmc_bulk_endpoints(chanend c_ep_out,chanend c_ep_in); /* Global report buffer, global since used by Endpoint0 core */ @@ -22,6 +22,7 @@ unsigned char g_reportBuffer[] = {0, 0, 0, 0}; int main() { chan c_ep_out[XUD_EP_COUNT_OUT], c_ep_in[XUD_EP_COUNT_IN]; + chan c_set_addr; par { @@ -29,7 +30,7 @@ int main() null, epTypeTableOut, epTypeTableIn, null, null, -1 , XUD_SPEED_HS, XUD_PWR_BUS); - on USB_TILE: Endpoint0(c_ep_out[0], c_ep_in[0]); + on USB_TILE: Endpoint0(c_ep_out[0], c_ep_in[0], c_set_addr); on USB_TILE: usbtmc_bulk_endpoints(c_ep_out[1],c_ep_in[1]); diff --git a/examples/AN00136_vendor_specific/src/endpoint0.xc b/examples/AN00136_vendor_specific/src/endpoint0.xc index 13939e18..4be6bc54 100644 --- a/examples/AN00136_vendor_specific/src/endpoint0.xc +++ b/examples/AN00136_vendor_specific/src/endpoint0.xc @@ -94,7 +94,7 @@ static char * unsafe stringDescriptors[] = } /* Endpoint 0 Task */ -void Endpoint0(chanend chan_ep0_out, chanend chan_ep0_in) +void Endpoint0(chanend chan_ep0_out, chanend chan_ep0_in, chanend c_set_addr) { USB_SetupPacket_t sp; XUD_BusSpeed_t usbBusSpeed; @@ -116,7 +116,7 @@ void Endpoint0(chanend chan_ep0_out, chanend chan_ep0_in) null, 0, null, 0, stringDescriptors, sizeof(stringDescriptors)/sizeof(stringDescriptors[0]), - sp, usbBusSpeed); + sp, usbBusSpeed, c_set_addr); } /* USB bus reset detected, reset EP and get new bus speed */ diff --git a/examples/AN00136_vendor_specific/src/main.xc b/examples/AN00136_vendor_specific/src/main.xc index cf646696..19786de8 100644 --- a/examples/AN00136_vendor_specific/src/main.xc +++ b/examples/AN00136_vendor_specific/src/main.xc @@ -14,7 +14,7 @@ XUD_EpType epTypeTableIn[XUD_EP_COUNT_IN] = {XUD_EPTYPE_CTL | XUD_STATUS_ENABL /* Prototype for Endpoint0 function in endpoint0.xc */ -void Endpoint0(chanend c_ep0_out, chanend c_ep0_in); +void Endpoint0(chanend c_ep0_out, chanend c_ep0_in, chanend c_set_addr); #define BUFFER_SIZE 128 @@ -86,6 +86,7 @@ void bulk_endpoint(chanend chan_ep_from_host, chanend chan_ep_to_host) int main() { chan c_ep_out[XUD_EP_COUNT_OUT], c_ep_in[XUD_EP_COUNT_IN]; + chan c_set_addr; par { @@ -94,7 +95,7 @@ int main() null, null, -1 , XUD_SPEED_HS, XUD_PWR_BUS); - on USB_TILE: Endpoint0(c_ep_out[0], c_ep_in[0]); + on USB_TILE: Endpoint0(c_ep_out[0], c_ep_in[0], c_set_addr); on USB_TILE: bulk_endpoint(c_ep_out[1], c_ep_in[1]); } diff --git a/lib_xud/api/xud.h b/lib_xud/api/xud.h index bb6a50a6..5c5a1159 100644 --- a/lib_xud/api/xud.h +++ b/lib_xud/api/xud.h @@ -325,10 +325,11 @@ XUD_Result_t XUD_DoSetRequestStatus(XUD_ep ep_in); /** * \brief Sets the device's address. This function must be called by Endpoint 0 * once a ``setDeviceAddress`` request is made by the host. + * \param c Channel end to use for talking to UIFM and save an allocation. * \param addr New device address. * \warning Must be run on USB core */ -XUD_Result_t XUD_SetDevAddr(/*tileref usbtile*/ unsigned addr); +XUD_Result_t XUD_SetDevAddr(chanend c, /*tileref usbtile*/ unsigned addr); /** diff --git a/lib_xud/api/xud_device.h b/lib_xud/api/xud_device.h index 865c78bf..285f2dff 100644 --- a/lib_xud/api/xud_device.h +++ b/lib_xud/api/xud_device.h @@ -59,6 +59,8 @@ * \param strDescsLength * \param sp ``USB_SetupPacket_t`` (passed by ref) in which the setup data is returned * \param usbBusSpeed The current bus speed (XUD_SPEED_HS or XUD_SPEED_FS) + * \param setAddrChanend Channel end to use for talking to UIFM for the + * Set Address request and save an allocation. * * \return Returns XUD_RES_OKAY on success. */ @@ -73,7 +75,8 @@ XUD_Result_t USB_StandardRequests(XUD_ep ep_out, XUD_ep ep_in, #else char * strDescs[], #endif - int strDescsLength, REFERENCE_PARAM(USB_SetupPacket_t, sp), XUD_BusSpeed_t usbBusSpeed); + int strDescsLength, REFERENCE_PARAM(USB_SetupPacket_t, sp), XUD_BusSpeed_t usbBusSpeed, + chanend setAddrChanend); /** * \brief Receives a Setup data packet and parses it into the passed USB_SetupPacket_t structure. * \param ep_out OUT endpint from XUD diff --git a/lib_xud/module_build_info b/lib_xud/module_build_info index 3990bfa6..bb166b7c 100644 --- a/lib_xud/module_build_info +++ b/lib_xud/module_build_info @@ -17,7 +17,7 @@ EXCLUDE_FILES += XUD_Token_In.S XUD_Token_Ping.S XUD_Token_SOF.S XUD_Token_Out.S OPTIONAL_HEADERS += xud_conf.h -VERSION = 0.1.1 +VERSION = 0.2.0 # DEPENDENT_MODULES = diff --git a/lib_xud/src/core/XUD_USBTile_Support.h b/lib_xud/src/core/XUD_USBTile_Support.h index 14968360..a0491eaf 100755 --- a/lib_xud/src/core/XUD_USBTile_Support.h +++ b/lib_xud/src/core/XUD_USBTile_Support.h @@ -11,6 +11,10 @@ unsigned XUD_DisableUsbPortMux(); int write_periph_word(tileref tile, unsigned peripheral, unsigned addr, unsigned data); +int write_periph_word_chanend(chanend c, tileref tile, + unsigned peripheral, + unsigned addr, unsigned data); + int read_periph_word(tileref tile, unsigned peripheral, unsigned addr, unsigned &data); unsigned get_tile_id(tileref ref); diff --git a/lib_xud/src/core/XUD_USBTile_Support.xc b/lib_xud/src/core/XUD_USBTile_Support.xc index 02522696..7325ac73 100644 --- a/lib_xud/src/core/XUD_USBTile_Support.xc +++ b/lib_xud/src/core/XUD_USBTile_Support.xc @@ -12,6 +12,48 @@ unsigned getsr_int(); +// taken from libxs1 implementation (periph.xc and periph_asm.S) +static int write_periph_32_chanend(chanend c, tileref tile, unsigned peripheral, + unsigned addr, + unsigned size, const unsigned data[size]) +{ + unsigned old_dest; + asm volatile("getd %0, res[%1]" : "=r"(old_dest) : "r"(c)); + + unsigned dest = XS1_RES_TYPE_CHANEND | + (get_tile_id(tile) << XS1_CHAN_ID_PROCESSOR_SHIFT) | + (peripheral << XS1_CHAN_ID_CHANNUM_SHIFT); + + asm volatile("setd res[%0], %1" :: "r"(c), "r"(dest)); + + const int with_ack = 1; + unsigned return_address; + unsigned ack = 1; + outct(c, CT_PERIPH_WRITE); + if (with_ack) { + unsafe { + return_address = (unsigned)c >> 8; + } + } else { + return_address = 0xff; + } + outuint(c, (return_address << 8) | addr); + outuchar(c, size << 2); + + for (unsigned i = 0; i < size; i++) { + outuint(c, data[i]); + } + outct(c, XS1_CT_END); + + if (with_ack) { + ack = (inct(c) == XS1_CT_ACK); + chkct(c, XS1_CT_END); + } + + asm volatile("setd res[%0], %1" :: "r"(c), "r"(old_dest)); + return ack; +} + int write_periph_word(tileref tile, unsigned peripheral, unsigned addr, unsigned data) { unsigned tmp[1]; @@ -19,6 +61,13 @@ int write_periph_word(tileref tile, unsigned peripheral, unsigned addr, unsigned return write_periph_32(tile, peripheral, addr, 1, tmp); } +int write_periph_word_chanend(chanend c, tileref tile, unsigned peripheral, unsigned addr, unsigned data) +{ + unsigned tmp[1]; + tmp[0] = data; + return write_periph_32_chanend(c, tile, peripheral, addr, 1, tmp); +} + int read_periph_word(tileref tile, unsigned peripheral, unsigned addr, unsigned &data) { unsigned tmp[1]; diff --git a/lib_xud/src/user/client/XUD_SetDevAddr.xc b/lib_xud/src/user/client/XUD_SetDevAddr.xc index 98681a49..406efd29 100644 --- a/lib_xud/src/user/client/XUD_SetDevAddr.xc +++ b/lib_xud/src/user/client/XUD_SetDevAddr.xc @@ -19,18 +19,17 @@ extern unsigned get_tile_id(tileref ref); extern tileref USB_TILE_REF; #endif - void XUD_SetCrcTableAddr(unsigned addr); /** @brief Sets the device addres in XUD * @param addr the new address */ -XUD_Result_t XUD_SetDevAddr(unsigned addr) +XUD_Result_t XUD_SetDevAddr(chanend c, unsigned addr) { #ifdef ARCH_L /* Set device address in UIFM */ #if defined(ARCH_X200) - write_periph_word(USB_TILE_REF, XS1_GLX_PER_UIFM_CHANEND_NUM, XS1_GLX_PER_UIFM_DEVICE_ADDRESS_NUM, addr); + write_periph_word_chanend(c, USB_TILE_REF, XS1_GLX_PER_UIFM_CHANEND_NUM, XS1_GLX_PER_UIFM_DEVICE_ADDRESS_NUM, addr); #elif defined(ARCH_S) write_periph_word(USB_TILE_REF, XS1_SU_PER_UIFM_CHANEND_NUM, XS1_SU_PER_UIFM_DEVICE_ADDRESS_NUM, addr); #else diff --git a/lib_xud/src/user/control/xud_device.xc b/lib_xud/src/user/control/xud_device.xc index d62e6a1f..bfd7113a 100644 --- a/lib_xud/src/user/control/xud_device.xc +++ b/lib_xud/src/user/control/xud_device.xc @@ -88,7 +88,8 @@ XUD_Result_t USB_StandardRequests(XUD_ep ep_out, XUD_ep ep_in, NULLABLE_ARRAY_OF(unsigned char, devDesc_fs), int devDescLength_fs, NULLABLE_ARRAY_OF(unsigned char, cfgDesc_fs), int cfgDescLength_fs, char * unsafe strDescs[], int strDescsLength, - USB_SetupPacket_t &sp, XUD_BusSpeed_t usbBusSpeed) + USB_SetupPacket_t &sp, XUD_BusSpeed_t usbBusSpeed, + chanend setAddrChanend) { /* Return value */ int datalength; @@ -142,7 +143,7 @@ XUD_Result_t USB_StandardRequests(XUD_ep ep_out, XUD_ep ep_in, } /* Set the device address in XUD */ - return XUD_SetDevAddr(sp.wValue); + return XUD_SetDevAddr(setAddrChanend, sp.wValue); } break; diff --git a/tests/test_write_periph_word_chanend/main.xc b/tests/test_write_periph_word_chanend/main.xc new file mode 100644 index 00000000..98aae8da --- /dev/null +++ b/tests/test_write_periph_word_chanend/main.xc @@ -0,0 +1,25 @@ +#include +#include +#include + +unsigned XUD_EnableUsbPortMux(); +int write_periph_word(tileref tile, unsigned peripheral, unsigned addr, unsigned data); +int read_periph_word(tileref tile, unsigned peripheral, unsigned addr, unsigned &data); + +int write_periph_word_chanend(chanend c, tileref tile, + unsigned peripheral, + unsigned addr, unsigned data); +int main(void) +{ + chan c; + XUD_EnableUsbPortMux(); + write_sswitch_reg(get_tile_id(usb_tile), 0x50, ( 1 << 0x3)); + par { + //write_periph_word(usb_tile, XS1_GLX_PER_UIFM_CHANEND_NUM, XS1_GLX_PER_UIFM_PHY_CONTROL_NUM, 1); + write_periph_word_chanend(c, usb_tile, XS1_GLX_PER_UIFM_CHANEND_NUM, XS1_GLX_PER_UIFM_PHY_CONTROL_NUM, 1); + } + unsigned val; + read_periph_word(usb_tile, XS1_GLX_PER_UIFM_CHANEND_NUM, XS1_GLX_PER_UIFM_PHY_CONTROL_NUM, val); + printf("%d\n", val); + return 0; +} diff --git a/tests/test_write_periph_word_chanend/makefile b/tests/test_write_periph_word_chanend/makefile new file mode 100644 index 00000000..7296989a --- /dev/null +++ b/tests/test_write_periph_word_chanend/makefile @@ -0,0 +1,2 @@ +all: + xcc -target=XCORE-200-EXPLORER ../../lib_xud/src/core/XUD_USBTile_Support.xc ../../lib_xud/src/core/XUD_USBTile_Support.S main.xc