// host_service_emulation.c // HPI host service emulation for 6713/6416 DSK with HPI daughtercard #include #include "c6x11dsk.h" #include "hpi_services.h" #include "hpi_services_funcs.h" #include #include // DSP host API emulation // only supports read and write packets extern HPI_SVC_BLOCK HpiSvcBlock; // packe protocol #define PKT_MAX_SIZE 256 #define PKT_PACKET_HEADER_FLAG 0xFA #define PKT_HEADER_OFFSET 0 #define PKT_UNIT_ID_OFFSET 1 #define PKT_LENGTH_OFFSET 2 #define PKT_COMMAND_OFFSET 3 #define PKT_PAYLOAD_OFFSET 4 #define PKT_COMMAND_MEM_WR 1 #define PKT_COMMAND_MEM_RD 2 #define PKT_COMMAND_RESPONSE 0xFE #define PKT_ID_MASTER 0 #define PKT_ID_ALL_SLAVE 0xFF #define SERIAL_TIMEOUT_INTERVAL 250 #pragma DATA_ALIGN (PacketBuffer , 4); // ensure word alignment static unsigned char PacketBuffer[PKT_MAX_SIZE]; void ProcessPacket_MemWr(unsigned char *pPayload) { unsigned char length, i, *p8; unsigned int *p32, temp32; p32 = (unsigned int *)(*(unsigned int *)pPayload); // get address (uint32) pPayload += 4; length = *pPayload; // get length (uint8) pPayload++; for(i = 0;i < length;i++) { // do iterations p8 = (unsigned char *)&temp32; // buffer data is not word aligned! *p8++ = *pPayload++; *p8++ = *pPayload++; *p8++ = *pPayload++; *p8++ = *pPayload++; *p32++ = temp32; // write to memory } } unsigned char ProcessPacket_MemRd(unsigned char *pPayload) { unsigned char length, i; unsigned int *p32, *pbuf; pbuf = (unsigned int *)pPayload; // point to first payload location (word aligned) p32 = (unsigned int *)(*pbuf); // get address (uint32) length = *(pPayload + 4); // get length (uint8) for(i = 0;i