#include #include #include #include #include #include "hwlib.h" #include "socal/socal.h" #include "socal/hps.h" #include "socal/alt_gpio.h" #include "hps_0.h" // // void init_HW(void); void startup_leds(void); void PRESET_one_SECTOR(void); void print_sector(void); void print_RAM(void); // // // #define HW_REGS_BASE ( ALT_STM_OFST ) #define HW_REGS_SPAN ( 0x04000000 ) #define HW_REGS_MASK ( HW_REGS_SPAN - 1 ) // // #define RAMi 12000000 // Used RAM-Size integer #define RAMs 24000000 // Used RAM-Size short integer #define RAMb 48000000 // Used RAM-Size byte # // This did work fine in a NIOSII environment -------------------------------------------------------- // #define DPRAM_BASE 0x00100000 // Base-Address Dual-Ported-Ram 0xB63A6000 // #define DPRAM DPRAM_BASE //------------------------------------------------------------------------------------------------------ // /* *********************** Global Definitions ********************** */ // //----------------------------------------------------------------------------------------- union rld { // unsigned char rl02c[512]; // unsigned short rl02i[256]; // unsigned int rl02l[128]; }; union rld SECTOR __attribute__ ((aligned(4))); // define a union union rld *u_rl02ptr; // pointer to union. //----------------------------------------------------------------------------------------- union rlt { unsigned char rl_drive_c[RAMb]; // unsigned short rl_drive_i[RAMs]; // unsigned int rl_drive_l[RAMi]; // }; union rlt RLDRIVE __attribute__ ((aligned(4))); // define a union union rlt *u_rl02_drive_ptr; // pointer to union //------------------------------------------------------------------------------------------------------ int fd; // Hold FPGA address void *virtual_base; // Virtual addr that maps to physical void *PIO_0_addr; // PIO-0 address void *PIO_1_addr; // PIO-1 address void *DPR_addr; // Dual Ported Ram address void *UART0_addr; // UART_0 address FILE* fp; //------------------------------------------------------------------------------------------------------ // // void init_HW(void) { //--------------------------------------------------------------------------------------------------- // === get FPGA addresses === // Open /dev/mem if( ( fd = open( "/dev/mem", ( O_RDWR | O_SYNC ) ) ) == -1 ) { printf( "ERROR: could not open \"/dev/mem\"...\n" ); return; } //--------------------------------------------------------------------------------------------------- // Get virtual addr that maps to physical virtual_base = mmap( NULL, HW_REGS_SPAN, ( PROT_READ | PROT_WRITE ), MAP_SHARED, fd, HW_REGS_BASE ); if( virtual_base == MAP_FAILED ) { printf( "ERROR: mmap() failed...\n" ); close( fd ); return; } //---------------------------------------------------------------------------------------------------- // // Get the addresses that maps to the FPGA: LED, DPR and UART controll PIO_0_addr = virtual_base + ( ( unsigned long )( ALT_LWFPGASLVS_OFST + PIO_0_BASE ) & ( unsigned long)( HW_REGS_MASK ) ); PIO_1_addr = virtual_base + ( ( unsigned long )( ALT_LWFPGASLVS_OFST + PIO_1_BASE ) & ( unsigned long)( HW_REGS_MASK ) ); DPR_addr = virtual_base + ( ( unsigned long )( ALT_LWFPGASLVS_OFST + DPR_BASE ) & ( unsigned long)( HW_REGS_MASK ) ); UART0_addr = virtual_base + ( ( unsigned long )( ALT_LWFPGASLVS_OFST + UART_0_BASE ) & ( unsigned long)( HW_REGS_MASK ) ); if( virtual_base == MAP_FAILED ) { printf( "ERROR: mmap() failed...\n" ); close( fd ); return; } //----------------------------------------------------------------------------------------------------- // } // // void PRESET_one_SECTOR(void) { // initialize data for one sector used for test and reference purpose. int i; unsigned short mysector[]= { 0x0000, 0x0000, 0x8000, // PR1,header_index=3 0x0000, 0x0000, 0x0000, // Header 0x0000, // PD1 0x0000, 0x0000, 0x8000, // PR2 0x0000, 0x0000, // Data 00-01 0xFF00, 0xFF00, 0xFF00, 0xFF00, 0xFF00, 0x0000, 0x0000, 0x0000, // Data 02-09 0x3333, 0x3333, 0x3333, 0x3333, 0x3333, 0x0000, 0x0000, 0x5500, // Data 10-17 0x5555, 0x5555, 0x5555, 0x5555, 0x0055, 0x0000, 0x0000, 0x9249, // Data 18-25 0x4924, 0x2492, 0x9249, 0x0024, 0x0000, 0x0000, 0x9123, 0x23DC, // Data 26-33 0xDC91, 0x9123, 0x00DC, 0x0000, 0x0000, 0x8080, 0x8080, 0x8080, // Data 34-41 0x8080, 0x8080, 0x0000, 0x0000, 0xE700, 0xF39C, 0x9CE7, 0xE7F3, // Data 42-49 0xF39C, 0x0000, 0x0000, 0x6300, 0xF18C, 0x8C63, 0x63F1, 0xF18C, // Data 50-57 0x0000, 0x0000, 0x7F00, 0x7F7F, 0x7F7F, 0x7F7F, 0x7F7F, 0x007F, // Data 58-65 0x0000, 0x0000, 0x0D0A, 0x4C52, 0x3230, 0x532D, 0x4D49, 0x4C55, // Data 66-73 0x5441, 0x524F, 0x5620, 0x4E4F, 0x5220, 0x4945, 0x484E, 0x5241, // Data 74-81 0x2044, 0x4548, 0x4255, 0x5245, 0x4547, 0x0A52, 0x520D, 0x304C, // Data 82-89 0x2D32, 0x4953, 0x554D, 0x414C, 0x4F54, 0x2052, 0x4F56, 0x204E, // Data 90-97 0x4552, 0x4E49, 0x4148, 0x4452, 0x4820, 0x5545, 0x4542, 0x4752, // Data 98-105 0x5245, 0x0D0A, 0x00FF, 0x00FF, 0x00FF, 0x00FF, 0x00FF, 0x00FF, // Data 106-113 0x00FF, 0x00FF, 0x00FF, 0x00FF, 0x00FF, 0x00FF, 0x00FF, 0x00FF, // Data 114-121 0x00FF, 0x00FF, 0x00FF, 0x00FF, 0x00FF, 0x0000, // Data 122-127 0x3A33, // Data 128 = CRC 0x0000, // 129 = PD2 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 130-137=Zero 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 138-145=Zero 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }; // 146-153=Zero // // for (i = 0; i < 256; i++ ){ SECTOR.rl02i[i] = 0x0000; } // clear buffer for (i = 0; i < 150; i++ ){ SECTOR.rl02i[i] = mysector[i]; } // Load buffer } // // void startup_leds(void) { int loop_count; int led_direction; int led_mask; loop_count = 0; led_mask = 0x01; led_direction = 0; // 0: left to right direction // while(loop_count < 3 ) { *(uint32_t *)PIO_0_addr = led_mask; usleep( 20*1000 ); if (led_direction == 0){ led_mask <<= 1; if (led_mask == (0x01 << (PIO_0_DATA_WIDTH-1))) led_direction = 1; }else{ led_mask >>= 1; if (led_mask == 0x01){ led_direction = 0; loop_count++; } } } } // // void print_sector(void){ int j; printf("\n\r+----------------------------------------------------------------+\n\r"); for (j = 0; j < 256; j++ ) { printf("%c",SECTOR.rl02c[j]); } printf("\n\r|----------------------------------------------------------------|\n\r"); } // void print_RAM(void){ int j; printf("\n\r+...............................................................+\n\r"); for (j = 0; j < 256; j++ ) { printf("%c",RLDRIVE.rl_drive_c[j]); } printf("\n\r|...............................................................|\n\r"); } // // // // // int main() { int i; init_HW(); // PRESET_one_SECTOR(); printf("\n\r One SECTOR preset done \n\r "); printf("\n\r Copy 256 Byte from SECTOR to RAM \n\r "); memcpy(&RLDRIVE.rl_drive_c[0], &SECTOR.rl02c[0], 256 ); // like RAM to RAM printf("\n\r print Sector and RAM: \n\r "); print_sector(); print_RAM(); // //printf("\n\r PIO-0 Addr: %X DPR-Addr: %X \n\n\r ",PIO_0_addr,DPR_addr ); // PIO-0 Addr: B60B4000 DPR-Addr: B6494000 while(1){ for (i = 0; i < 200; i++ ) { // printf("\n\r copy RAM -------------> DPR :"); startup_leds(); // //----------------- //memcpy((void *)(DPRAM), &RLDRIVE.rl_drive_i[0], 11520); // OK bei NIOS************************ memcpy((void *)(DPR_addr), &RLDRIVE.rl_drive_i[0], 11520); // Not working //memcpy((void *)(*(uint32_t *)DPR_addr), &RLDRIVE.rl_drive_i[0], 11520); // sementation fault //memcpy((void *)(uint32_t *)DPR_addr, &RLDRIVE.rl_drive_i[0], 11520); // Not working //memcpy((void *)(uint32_t *)&DPR_addr, &RLDRIVE.rl_drive_i[0], 11520); // Not working //memcpy((void *)(DPRAM), &RLDRIVE.rl_drive_i[0], 11520); // Like NIOS, also not working //memcpy( DPR_addr, &RLDRIVE.rl_drive_i[0], 11520); // Not working //----------------- // printf("\n\r Clear RAM area and print it .... :"); for (i = 0; i < 256; i++ ) { RLDRIVE.rl_drive_i[i] = 0x0000; // clear RAM } print_RAM(); printf("\n\r\n\n\n\n\n\n"); printf("\n\r copy back DPR -------------> RAM :"); //----------- //memcpy(&RLDRIVE.rl_drive_i[0], (void *)(DPRAM), 11520); // OK bei NIOS********************** memcpy(&RLDRIVE.rl_drive_i[0], (void *)(DPR_addr), 11520); // Not working //memcpy(&RLDRIVE.rl_drive_i[0], (void *)(*(uint32_t *)DPR_addr), 11520); // segmentation fault //memcpy(&RLDRIVE.rl_drive_i[0], (void *)(uint32_t *)DPR_addr, 11520); // Not working //memcpy(&RLDRIVE.rl_drive_i[0], (void *)(uint32_t *)&DPR_addr, 11520); // Not working //memcpy(&RLDRIVE.rl_drive_i[0], (void *)(DPRAM), 11520); // Like NIOS, also not working //memcpy( &RLDRIVE.rl_drive_i[0], DPR_addr, 11520); // Not working //----------- startup_leds(); // // print_RAM(); // } } return 0; }