void write(u32 x, u32 y, u32 vali) { CONTROLLER_mWriteReg(SW_BASE,VALI,vali); CONTROLLER_mWriteReg(SW_BASE,ADR_X,x); CONTROLLER_mWriteReg(SW_BASE,ADR_Y,y); CONTROLLER_mWriteReg(SW_BASE,OP_CODE,3); delay(); u32 written = CONTROLLER_mReadReg(SW_BASE,WRITTEN); while(written == 0) written = CONTROLLER_mReadReg(SW_BASE,WRITTEN); CONTROLLER_mWriteReg(SW_BASE,OP_CODE,2); }
int main(void) { CONTROLLER_mWriteReg(SW_BASE,OP_CODE,4); // reset CONTROLLER_mWriteReg(SW_BASE,DELAY_TIME,50000000); delay(); setup(); delay(); CONTROLLER_mWriteReg(SW_BASE,OP_CODE,1); while(1) { } }
/* UDP_SERVER_FUNCTION * * This function is the main callback when a UDP packet is received. * * It copies the payload of the UDP packet to the shared memory * interfaces of the CONTROLLER PCORE (write data into REG0), raises a ready flag (write START_COMPUTING into REG2), waits for * a completion flag to be returned (wait START_READING from REG2) and read back the results (reads data from REG1) * The result is then copied into the payload of a new UDP packet and returned. * */ void udp_server_function(void *arg, struct udp_pcb *pcb, struct pbuf *p, struct ip_addr *addr, u16_t port){ int k; // An iterator for loops //printf("\n"); //printf("Received an UDP packet ...\n"); // Only respond to packets of the correct size // (we could make the protocol more complex later on) if (p->len == (NINPUTS)*sizeof(unsigned int)){ // Copy payload into something better aligned unsigned int payload_temp[NINPUTS]; unsigned char *payload_temp_char = (unsigned char *)payload_temp; unsigned char *payload_ptr; payload_ptr = (unsigned char *)p->payload; for (k=0; k<(NINPUTS)*sizeof(unsigned int); k++){ payload_temp_char[k] = payload_ptr[k]; } // Variables for shared memory interface float *payload_temp_fl = (float *)payload_temp; //printf("Writing data ...\n"); for (k=0; k<2; k++){ //payload_temp[k]=0; //printf("u[%d] = %5.4f\n", k,(float)payload_temp[k]); printf("x[%d] = %5.4f\n", k,payload_temp_fl[k]); } // Copy stuff in REG0 for (k=0; k<NINPUTS; k++){ //printf("x[%d] = %5.4f\n", k,payload_temp_fl[k]); CONTROLLER_mWriteReg(0x77200000, 0, payload_temp[k]); //writing to REG0 } CONTROLLER_mWriteReg(0x77200000, 2*4, START_COMPUTING); //writing to REG2 /* Poll the output ready register (REG2) until it becomes unity*/ //printf("Waiting data ready ...\n"); Xuint32 Data_Reg2; while(1){ Data_Reg2=CONTROLLER_mReadReg(0x77200000, 2*4); //reading from REG2 //printf("Reg2 = %5.4f\n", (float)Data_Reg2); if (Data_Reg2 == START_READING){ break; } } //printf("Reading data ...\n"); Xuint32 payload_read[NOUTPUTS]; // read stuff from for (k=0; k<NOUTPUTS; k++){ payload_read[k]=CONTROLLER_mReadReg(0x77200000, 1*4);//reading from REG1 //printf("u[%d] = %5.4f\n", k,(float)payload_read[k]); } float *payload_read_fl = (float *)payload_read; /* //debug only remove payload_read[0]=1065353216; //1 in float payload_read[1]=1073741824; //2 in float */ for (k=0; k<NOUTPUTS; k++){ printf("debug u[%d] = %5.4f\n", k,(float)payload_read_fl[k]); } // Create a reply struct pbuf pnew; pnew.next = NULL; pnew.payload = payload_read; pnew.len = NOUTPUTS*4; pnew.type = PBUF_RAM; pnew.tot_len = pnew.len; pnew.ref = 1; pnew.flags = 0; udp_sendto(pcb, &pnew, addr, port); //printf("Data sent to PC\n"); } pbuf_free(p); }