| 
									
										
										
										
											2019-03-20 16:11:42 +07:00
										 |  |  | /* 
 | 
					
						
							|  |  |  |  * The MIT License (MIT) | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Copyright (c) 2018, hathach (tinyusb.org) | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Permission is hereby granted, free of charge, to any person obtaining a copy | 
					
						
							|  |  |  |  * of this software and associated documentation files (the "Software"), to deal | 
					
						
							|  |  |  |  * in the Software without restriction, including without limitation the rights | 
					
						
							|  |  |  |  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | 
					
						
							|  |  |  |  * copies of the Software, and to permit persons to whom the Software is | 
					
						
							|  |  |  |  * furnished to do so, subject to the following conditions: | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * The above copyright notice and this permission notice shall be included in | 
					
						
							|  |  |  |  * all copies or substantial portions of the Software. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | 
					
						
							|  |  |  |  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | 
					
						
							|  |  |  |  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | 
					
						
							|  |  |  |  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | 
					
						
							|  |  |  |  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | 
					
						
							|  |  |  |  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | 
					
						
							|  |  |  |  * THE SOFTWARE. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This file is part of the TinyUSB stack. | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2013-06-05 11:26:08 +07:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include <stdlib.h>
 | 
					
						
							|  |  |  | #include "unity.h"
 | 
					
						
							| 
									
										
										
										
											2014-04-17 20:40:34 +07:00
										 |  |  | #include "tusb_errors.h"
 | 
					
						
							| 
									
										
										
										
											2013-06-05 11:26:08 +07:00
										 |  |  | #include "type_helper.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-12 14:06:41 +07:00
										 |  |  | #include "mock_usbd_dcd.h"
 | 
					
						
							| 
									
										
										
										
											2013-06-05 11:26:08 +07:00
										 |  |  | #include "dcd_lpc175x_6x.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-12 21:06:43 +07:00
										 |  |  | LPC_USB_TypeDef lpc_usb; | 
					
						
							| 
									
										
										
										
											2013-06-12 14:06:41 +07:00
										 |  |  | usbd_device_info_t usbd_devices[CONTROLLER_DEVICE_NUMBER]; | 
					
						
							| 
									
										
										
										
											2013-06-05 11:26:08 +07:00
										 |  |  | extern dcd_dma_descriptor_t* dcd_udca[32]; | 
					
						
							| 
									
										
										
										
											2013-06-12 21:06:43 +07:00
										 |  |  | extern dcd_dma_descriptor_t  dcd_dd[DCD_MAX_DD]; | 
					
						
							| 
									
										
										
										
											2013-06-05 11:26:08 +07:00
										 |  |  | 
 | 
					
						
							|  |  |  | void setUp(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2018-10-23 12:19:32 +07:00
										 |  |  |   tu_memclr(dcd_udca, 32*4); | 
					
						
							|  |  |  |   tu_memclr(dcd_dd, sizeof(dcd_dma_descriptor_t)*DCD_MAX_DD); | 
					
						
							|  |  |  |   tu_memclr(&lpc_usb, sizeof(LPC_USB_TypeDef)); | 
					
						
							| 
									
										
										
										
											2013-06-05 11:26:08 +07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void tearDown(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-05 11:45:43 +07:00
										 |  |  | void test_dd_udca_align(void) | 
					
						
							| 
									
										
										
										
											2013-06-05 11:26:08 +07:00
										 |  |  | { | 
					
						
							|  |  |  |   TEST_ASSERT_BITS_LOW(128-1, (uint32_t) dcd_udca); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2013-06-05 11:45:43 +07:00
										 |  |  | 
 | 
					
						
							|  |  |  | void test_dd_structure(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   //------------- word 0 -------------//
 | 
					
						
							|  |  |  |   TEST_ASSERT_EQUAL( 0, offsetof(dcd_dma_descriptor_t, next)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   //------------- word 1 -------------//
 | 
					
						
							|  |  |  |   TEST_ASSERT_EQUAL( 0, BITFIELD_OFFSET_OF_UINT32(dcd_dma_descriptor_t, 1, mode) ); | 
					
						
							|  |  |  |   TEST_ASSERT_EQUAL( 2, BITFIELD_OFFSET_OF_UINT32(dcd_dma_descriptor_t, 1, is_next_valid) ); | 
					
						
							|  |  |  |   TEST_ASSERT_EQUAL( 4, BITFIELD_OFFSET_OF_UINT32(dcd_dma_descriptor_t, 1, is_isochronous) ); | 
					
						
							|  |  |  |   TEST_ASSERT_EQUAL( 5, BITFIELD_OFFSET_OF_UINT32(dcd_dma_descriptor_t, 1, max_packet_size) ); | 
					
						
							|  |  |  |   TEST_ASSERT_EQUAL( 16, BITFIELD_OFFSET_OF_UINT32(dcd_dma_descriptor_t, 1, buffer_length) ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   //------------- word 2 -------------//
 | 
					
						
							|  |  |  |   TEST_ASSERT_EQUAL( 8, offsetof(dcd_dma_descriptor_t, buffer_start_addr) ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   //------------- word 3 -------------//
 | 
					
						
							|  |  |  |   TEST_ASSERT_EQUAL( 0, BITFIELD_OFFSET_OF_UINT32(dcd_dma_descriptor_t, 3, is_retired) ); | 
					
						
							|  |  |  |   TEST_ASSERT_EQUAL( 1, BITFIELD_OFFSET_OF_UINT32(dcd_dma_descriptor_t, 3, status) ); | 
					
						
							|  |  |  |   TEST_ASSERT_EQUAL( 5, BITFIELD_OFFSET_OF_UINT32(dcd_dma_descriptor_t, 3, iso_last_packet_valid) ); | 
					
						
							|  |  |  |   TEST_ASSERT_EQUAL( 6, BITFIELD_OFFSET_OF_UINT32(dcd_dma_descriptor_t, 3, atle_is_lsb_extracted) ); | 
					
						
							|  |  |  |   TEST_ASSERT_EQUAL( 7, BITFIELD_OFFSET_OF_UINT32(dcd_dma_descriptor_t, 3, atle_is_msb_extracted) ); | 
					
						
							|  |  |  |   TEST_ASSERT_EQUAL( 8, BITFIELD_OFFSET_OF_UINT32(dcd_dma_descriptor_t, 3, atle_message_length_position) ); | 
					
						
							|  |  |  |   TEST_ASSERT_EQUAL( 16, BITFIELD_OFFSET_OF_UINT32(dcd_dma_descriptor_t, 3, present_count) ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   //------------- word 4 -------------//
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-12 21:06:43 +07:00
										 |  |  | void test_dcd_init(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   //------------- Code Under Test -------------//
 | 
					
						
							|  |  |  |   dcd_init(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   //------------- slave check -------------//
 | 
					
						
							| 
									
										
										
										
											2018-12-14 15:28:38 +07:00
										 |  |  |   TEST_ASSERT_EQUAL_HEX( TU_BIN8(11), LPC_USB->USBEpIntEn ); | 
					
						
							| 
									
										
										
										
											2013-06-12 21:06:43 +07:00
										 |  |  |   TEST_ASSERT_EQUAL_HEX( DEV_INT_DEVICE_STATUS_MASK | DEV_INT_ENDPOINT_SLOW_MASK | DEV_INT_ERROR_MASK, | 
					
						
							|  |  |  |                          LPC_USB->USBDevIntEn ); | 
					
						
							|  |  |  |   TEST_ASSERT_EQUAL_HEX( 0, LPC_USB->USBEpIntPri); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   //------------- DMA check -------------//
 | 
					
						
							|  |  |  |   for (uint32_t i=0; i<32; i++) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     TEST_ASSERT_EQUAL_HEX(dcd_dd+i, dcd_udca[i]); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   TEST_ASSERT_EQUAL_HEX(dcd_udca, LPC_USB->USBUDCAH); | 
					
						
							|  |  |  |   TEST_ASSERT_EQUAL_HEX(DMA_INT_END_OF_XFER_MASK | DMA_INT_NEW_DD_REQUEST_MASK | DMA_INT_ERROR_MASK, | 
					
						
							|  |  |  |                         LPC_USB->USBDMAIntEn); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void test_dcd_configure_endpoint_in(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2018-03-23 12:32:40 +07:00
										 |  |  |   tusb_desc_endpoint_t const desc_endpoint = | 
					
						
							| 
									
										
										
										
											2013-06-12 21:06:43 +07:00
										 |  |  |   { | 
					
						
							| 
									
										
										
										
											2018-03-23 12:32:40 +07:00
										 |  |  |       .bLength          = sizeof(tusb_desc_endpoint_t), | 
					
						
							| 
									
										
										
										
											2013-06-12 21:06:43 +07:00
										 |  |  |       .bDescriptorType  = TUSB_DESC_TYPE_ENDPOINT, | 
					
						
							|  |  |  |       .bEndpointAddress = 0x83, | 
					
						
							|  |  |  |       .bmAttributes     = { .xfer = TUSB_XFER_INTERRUPT }, | 
					
						
							|  |  |  |       .wMaxPacketSize   = { .size = 0x08 }, | 
					
						
							|  |  |  |       .bInterval        = 0x0A | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   dcd_init(); | 
					
						
							| 
									
										
										
										
											2018-10-23 12:19:32 +07:00
										 |  |  |   tu_memclr(&lpc_usb, sizeof(LPC_USB_TypeDef)); // clear to examine register after CUT
 | 
					
						
							| 
									
										
										
										
											2013-06-12 21:06:43 +07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   //------------- Code Under Test -------------//
 | 
					
						
							| 
									
										
										
										
											2013-06-26 18:00:05 +07:00
										 |  |  |   dcd_pipe_open(0, &desc_endpoint); | 
					
						
							| 
									
										
										
										
											2013-06-12 21:06:43 +07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   uint8_t const phy_ep = 2*3 + 1; | 
					
						
							| 
									
										
										
										
											2018-12-14 15:28:38 +07:00
										 |  |  |   TEST_ASSERT_EQUAL_HEX( TU_BIT(phy_ep), LPC_USB->USBReEp); | 
					
						
							| 
									
										
										
										
											2013-06-12 21:06:43 +07:00
										 |  |  |   TEST_ASSERT_EQUAL_HEX( phy_ep, LPC_USB->USBEpInd); | 
					
						
							|  |  |  |   TEST_ASSERT_EQUAL( desc_endpoint.wMaxPacketSize.size, LPC_USB->USBMaxPSize); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   TEST_ASSERT_FALSE( dcd_dd[phy_ep].is_next_valid ); | 
					
						
							|  |  |  |   TEST_ASSERT_EQUAL_HEX( 0, dcd_dd[phy_ep].next ); | 
					
						
							|  |  |  |   TEST_ASSERT_EQUAL( 0, dcd_dd[phy_ep].mode); | 
					
						
							|  |  |  |   TEST_ASSERT_FALSE( dcd_dd[phy_ep].is_isochronous ); | 
					
						
							|  |  |  |   TEST_ASSERT_EQUAL( 0, dcd_dd[phy_ep].buffer_length); | 
					
						
							|  |  |  |   TEST_ASSERT_EQUAL_HEX( 0, dcd_dd[phy_ep].buffer_start_addr); | 
					
						
							|  |  |  |   TEST_ASSERT_TRUE( dcd_dd[phy_ep].is_retired ); | 
					
						
							|  |  |  |   TEST_ASSERT_EQUAL( DD_STATUS_NOT_SERVICED, dcd_dd[phy_ep].status); | 
					
						
							|  |  |  |   TEST_ASSERT_FALSE( dcd_dd[phy_ep].iso_last_packet_valid ); | 
					
						
							|  |  |  |   TEST_ASSERT_FALSE( dcd_dd[phy_ep].atle_is_lsb_extracted ); | 
					
						
							|  |  |  |   TEST_ASSERT_FALSE( dcd_dd[phy_ep].atle_is_msb_extracted ); | 
					
						
							|  |  |  |   TEST_ASSERT_FALSE( dcd_dd[phy_ep].atle_message_length_position ); | 
					
						
							|  |  |  |   TEST_ASSERT_FALSE( dcd_dd[phy_ep].present_count ); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void test_dcd_configure_endpoint_out(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   TEST_IGNORE(); | 
					
						
							|  |  |  | } |