We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
Hi,
I am working with a Terasic DE0-Nano-SoC board, and am working in DS-5 Community Edition 17.1.
I have created some PIO peripheral registers in Qsys / Platform Designer, connected to some well tested firmware, containing registers;
This data register PIO is bidirectional :
So in a c program, how do I change the data transfer direction ?
I appear to be able to write from an output only PIO, but so far only read from this bi-directional PIO.
Works when reading a read only register in my firmware :
SkelData_read = *(uint32_t *)h2p_lw_pio_d_addr;
Writing then reading a R/W register in my firmware always returns 0 :
*(uint32_t *)h2p_lw_pio_d_addr = Data;
Help appreciate,
Beau
OK, I have found information that has helped, but I still have problems outputting data.
Below is the crucial code, I am hoping someone can see where I am going wrong.Is it the address calculation for the Data Direction register ?This is for the Data register (which works for the output only PIOs) :h2p_lw_pio_d_addr=virtual_base + ( ( unsigned long )( ALT_LWFPGASLVS_OFST + PIO_D_BASE ) & ( unsigned long)( HW_REGS_MASK ) );Is this right for the Data Direction register ?h2p_lw_pio_d_dirn = virtual_base + ( ( unsigned long )( ALT_LWFPGASLVS_OFST + PIO_D_BASE + 1 ) & ( unsigned long)( HW_REGS_MASK ) );I am setting this as :Write :Set Data (8 bit) : Data = strtol(argv[4], &strptr, 10); // Data to write*(uint32_t *)h2p_lw_pio_d_addr = Data;Output it :*(uint32_t *)h2p_lw_pio_d_dirn = 0xff ; // All PIO Data bits set to output (write)Set Input :*(uint32_t *)h2p_lw_pio_d_dirn = 0x00 ; // All PIO Data bits set to input (read)Read Data :SkelData_read = *(uint32_t *)h2p_lw_pio_d_addr;Thanks,Beau Webber
I have had a reply on the Altera Forumn, that has given me the answer :
h2p_lw_pio_d_dirn = virtual_base + ( ( unsigned long )( ALT_LWFPGASLVS_OFST + PIO_D_BASE + 4 ) & ( unsigned long)( HW_REGS_MASK ) );
I understand the 1 vs 4 is due to word or byte addressing.
Working nicely now, able to read and write the registers in my own firmware, from C in Linux, via the SoC PIOs.Time to add the rest of my firmware .... Much appreciated austin944.Beau Webber