Project

General

Profile

RE: uPP/DMA registers ยป main.c

Scott Whitney, 09/21/2011 05:09 PM

 
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
#include "fpga.h"
#include "pin_mux.h"
#include "upp_reg.h"
#include <string.h>

#define DEBUG_UPP 1

/* definitions for upp tx and rx buffers */
#define UPP_BUF_SIZE (4096*10)
void *rx_buf, *tx_buf;


static int upp_mmap_size, psc1_mmap_size, pinmux_size;
static uintptr_t upp_base, psc1_base, pinmux_base;

/* enbale the upp for digital loop back */
int upp_enable(void)
{
int mux_val;
int reg_stat;


reg_stat = ( *(uint32_t *)(upp_base+UPPCR) ) = 0;
printf("loopback register: %#010x\n",reg_stat);


return 1;
/* ( *(uint32_t *)(upp_base+UPDBL) )= 0x01;
reg_stat = ( *(uint32_t *)(upp_base+UPDBL) );
printf("loopback register: %#010x\n",reg_stat); */

/* mux_val = ( *(uint32_t *)(upp_base+UPDBL));
printf("DBL: %#010x\n",mux_val); */


}

int upp_reset(void)
{
int reg_stat;

reg_stat = ( *(uint32_t *)(upp_base+UPPCR) );
printf("upp Control before reset: %#010x\n",reg_stat);


/* lets clear out EN first */
( *(uint32_t *)(upp_base+UPPCR) ) = 0;
/* check the dma active bit */
while (( *(uint32_t *)(upp_base+UPPCR) ) & 0x00 ){
usleep(5);
}
reg_stat = UPPRESET;
( *(uint32_t *)(upp_base+UPPCR) ) = reg_stat;
usleep(100000);

( *(uint32_t *)(upp_base+UPPCR) ) = 0;
reg_stat = ( *(uint32_t *)(upp_base+UPPCR) );
printf("upp Control UPPCR: %#010x\n",reg_stat);

return 1;
}

int upp_config(void)
{
int reg_stat;
reg_stat = 0x02020007;
( *(uint32_t *)(upp_base+UPCTL) ) = reg_stat;
reg_stat = ( *(uint32_t *)(upp_base+UPCTL) );
printf("UPCTL: %#010x\n",reg_stat);

reg_stat = 0x180020;
( *(uint32_t *)(upp_base+UPICR) ) = reg_stat;
reg_stat = ( *(uint32_t *)(upp_base+UPICR) );
printf("UPICR: %#010x\n",reg_stat);
/* reg_stat = 0xDEAD; */
( *(uint32_t *)(upp_base+UPIVR) ) = 0x00;
reg_stat = ( *(uint32_t *)(upp_base+UPIVR) );
printf("UPIVR: %#010x\n",reg_stat);

reg_stat = 0x010100;
( *(uint32_t *)(upp_base+UPTCR) ) = reg_stat;
reg_stat = ( *(uint32_t *)(upp_base+UPTCR) );
printf("UPICR: %#010x\n",reg_stat);


reg_stat = 0x01000;
( *(uint32_t *)(upp_base+UPDBL) ) = reg_stat;
reg_stat = ( *(uint32_t *)(upp_base+UPDBL) );
#if DEBUG_UPP
printf("UPDBL: %#010x\n",reg_stat);
#endif


( *(uint32_t *)(upp_base+UPIEC) ) = 0xffffffff;
reg_stat = ( *(uint32_t *)(upp_base+UPIEC) );
#if DEBUG_UPP
printf("UPIEC: %#010x\n",reg_stat);
#endif


( *(uint32_t *)(upp_base+UPIES) ) = 0x0f0f;
reg_stat = ( *(uint32_t *)(upp_base+UPIES) );
#if DEBUG_UPP
printf("UPIES: %#010x\n",reg_stat);
#endif

reg_stat = ( *(uint32_t *)(upp_base+UPISR) );
#if DEBUG_UPP
printf("UPISR: %#010x\n",reg_stat);
#endif

printf("Wait for interrupt\n\n");
/* while ( !(*(uint32_t *)(upp_base+UPIER))&& !(*(uint32_t *)(upp_base+UPISR)) )
usleep(2); */

/* printf("Interrupt done\n");
printf("Rx buf\n");
printf("0x%08x ", *(int *)(rx_buf));
printf("0x%08x ", *(int *)(rx_buf + 4));
printf("0x%08x ", *(int *)(rx_buf + 8));
printf("0x%08x ", *(int *)(rx_buf + 12));

printf("Tx buf\n");
printf("0x%08x ", *(int *)(tx_buf));
printf("0x%08x ", *(int *)(tx_buf + 4));
printf("0x%08x ", *(int *)(tx_buf + 8));
printf("0x%08x ", *(int *)(tx_buf + 12)); */

return 1;
}

/* lets map the pinmux registers */
int upp_pinmux(void)
{
int mux_val;
/*unlock the sysconfig registers */
mux_val=( *(uint32_t *)(pinmux_base+KICK0R));
printf("Original KICK0: %#010x\n",mux_val);

mux_val=( *(uint32_t *)(pinmux_base+KICK1R));
printf("Original KICK1: %#010x\n",mux_val);
( *(uint32_t *)(pinmux_base+KICK0R)) = KICK0UL;
( *(uint32_t *)(pinmux_base+KICK1R)) = KICK1UL;
mux_val=( *(uint32_t *)(pinmux_base+KICK0R));
printf("Changed KICK0: %#010x\n",mux_val);

mux_val=( *(uint32_t *)(pinmux_base+KICK1R));
printf("Changed KICK1: %#010x\n",mux_val);


mux_val = ( *(uint32_t *)(pinmux_base+PINMUX13));
printf("Original PINMUX13: %#010x\n",mux_val);
mux_val |= REG13;
(*(uint32_t *)(pinmux_base+PINMUX13))=0x00;
// (*(uint32_t *)(pinmux_base+PINMUX13))=mux_val;
mux_val = ( *(uint32_t *)(pinmux_base+PINMUX13));
printf("PINMUX13: %#010x\n",mux_val);
(*(uint32_t *)(pinmux_base+PINMUX14))=REG14;
(*(uint32_t *)(pinmux_base+PINMUX15))=REG15;
mux_val = ( *(uint32_t *)(pinmux_base+PINMUX15));
printf("PINMUX15: %#010x\n",mux_val);
printf("We want to set 15 to: %#010x\n",REG15);

(*(uint32_t *)(pinmux_base+PINMUX16))=REG16;
(*(uint32_t *)(pinmux_base+PINMUX17))=REG17;
(*(uint32_t *)(pinmux_base+PINMUX18))=REG18;
mux_val = ( *(uint32_t *)(pinmux_base+PINMUX15));
printf("PINMUX15: %#010x\n",mux_val);

return 1;

}

static int upp_buff_init(void)
{
int ret;
int ps = getpagesize();

if ( (ret = posix_memalign( &rx_buf, ps, UPP_BUF_SIZE) ) ) {
perror("Memalign failed");
return -1;
}

if ( (ret = posix_memalign( &tx_buf, ps, UPP_BUF_SIZE) ) ) {
perror("Memalign failed");
return -1;
}

memset( (void *)tx_buf, 0xab, UPP_BUF_SIZE );
memset( (void *)rx_buf, 0xDE, UPP_BUF_SIZE );

#if DEBUG_UPP
printf("Tx buf addr = 0x%08x (0x%08x)\n", (void *)tx_buf, *(int *)tx_buf);
printf("Rx buf addr = 0x%08x (0x%08x)\n", (void *)rx_buf, *(int *)rx_buf);
#endif

return 0;
}

static int set_dma(void)
{

int reg_stat;

/*--------------------------------------------------------------------------
* UPID0 - Channel A (xmit)
*--------------------------------------------------------------------------*/
*(uint32_t *)(upp_base + UPID0) = *(uint32_t *)(tx_buf);
reg_stat = *(uint32_t *)(upp_base + UPID0);
#if DEBUG_UPP
printf("UPID0 = 0x%08x\n", reg_stat);
#endif
/*--------------------------------------------------------------------------
* UPID1 - Channel A (xmit)
*--------------------------------------------------------------------------*/
*(uint32_t *)(upp_base + UPID1) = (0x4 << 16 | 0x400);
reg_stat = *(uint32_t *)(upp_base + UPID1);
#if DEBUG_UPP
printf("UPID1 = 0x%08x\n", reg_stat);
#endif
/*--------------------------------------------------------------------------
* UPID2 - Channel A (xmit)
*--------------------------------------------------------------------------*/
*(uint32_t *)(upp_base + UPID2) = 0x00000400;
reg_stat = *(uint32_t *)(upp_base + UPID2);
#if DEBUG_UPP
printf("UPID2 = 0x%08x\n", reg_stat);
#endif
/*--------------------------------------------------------------------------
* UPQD0 - Channel B (Rcv)
*--------------------------------------------------------------------------*/
*(uint32_t *)(upp_base + UPQD0) = *(uint32_t *)(tx_buf);
reg_stat = *(uint32_t *)(upp_base + UPQD0);
#if DEBUG_UPP
printf("UPQD0 = 0x%08x\n", reg_stat);
#endif

/*--------------------------------------------------------------------------
* UPQD1 - Channel B (Rcv)
*--------------------------------------------------------------------------*/
*(uint32_t *)(upp_base + UPQD1) = (0x4 << 16 | 0x400);
reg_stat = *(uint32_t *)(upp_base + UPQD1);
#if DEBUG_UPP
printf("UPQD1 = 0x%08x\n", reg_stat);
#endif

/*--------------------------------------------------------------------------
* UPQD2 - Channel B (Rcv)
*-------------------------------------------------------------------------*/
*(uint32_t *)(upp_base + UPQD2) = 0x00000400;
reg_stat = *(uint32_t *)(upp_base + UPQD2);
#if DEBUG_UPP
printf("UPQD2 = 0x%08x\n", reg_stat);
#endif

}



/* lets map the pinmux registers */
static int upp_mmap_init(void)
{
int mem_fd;
int reg_stat;

mem_fd = open("/dev/mem", O_RDWR);
if ( mem_fd < 0){
printf("failed to open /dev/mem\n");
return mem_fd;
}
/* map the pin mux */
pinmux_size = getpagesize();
pinmux_base = (uintptr_t)mmap(0,pinmux_size, PROT_READ|PROT_WRITE,
MAP_SHARED, mem_fd, SYSBASE);
if ( pinmux_base == (uintptr_t)MAP_FAILED){
printf("\n\nupp_base mmap fail!\n\n");
return -1;
}

/* map the uPP */
upp_mmap_size = getpagesize();
upp_base = (uintptr_t)mmap(0,upp_mmap_size, PROT_READ|PROT_WRITE,
MAP_SHARED, mem_fd, UPPBASE);
if ( upp_base == (uintptr_t)MAP_FAILED){
printf("\n\nupp_base mmap fail!\n\n");
return -1;
}

/* map the Power control module */
psc1_mmap_size = getpagesize();
psc1_base = (uintptr_t)mmap(0,psc1_mmap_size, PROT_READ|PROT_WRITE,
MAP_SHARED, mem_fd, PSC1);
if ( psc1_base == (uintptr_t)MAP_FAILED){
printf("\n\nupp_base mmap fail!\n\n");
return -1;
}

close(mem_fd);
}


/* lets unmap the pinmux registers */
static int upp_mmap_deinit(void){

if (munmap( (void *)pinmux_base, pinmux_size) == -1){
printf("\n\n munmap fail\n");
return -1;
}



if (munmap( (void *)upp_base, upp_mmap_size) == -1){
printf("\n\n munmap fail\n");
return -1;
}

if (munmap( (void *)psc1_base, psc1_mmap_size) == -1){
printf("\n\n munmap fail\n");
return -1;
}

}

int main(void)
{
int fd;
char *mem;
unsigned short *reg;
int i;
int id;
int reg_stat;
unsigned short val;




/* map the pinmux registers */
upp_mmap_init();
reg_stat = ( *(uint32_t *)(psc1_base));
printf("Peripheral Revision is: %#010x\n",reg_stat);

reg_stat = ( *(uint32_t *)(psc1_base+PSTAT));
printf("PSTAT is: %#010x\n",reg_stat);

reg_stat = 0x03;
( *(uint32_t *)(psc1_base+UPPCONTROL))= reg_stat;
printf("uPP PSC status: %#010x\n",reg_stat);

reg_stat = ( *(uint32_t *)(psc1_base+PSCMD));
reg_stat &= 0xfffffffc;
reg_stat |= 0x03;
( *(uint32_t *)(psc1_base+PSCMD))= reg_stat;
while ( *(uint32_t *)(psc1_base + PSTAT) & 0x01)
usleep(2);

reg_stat = ( *(uint32_t *)(psc1_base+UPPSTATUS));
printf("uPP PSC status: %#010x\n",reg_stat);
reg_stat = ( *(uint32_t *)(upp_base) );
printf("uPP Peripheral ID register: %#010x\n",reg_stat);



/* mux the upp */
upp_pinmux();

/* now enbale upp loopback */
/*upp_enable();*/
upp_reset();

/* configure the upp for loopback */
upp_config();

/* setup the upp xmit and rcv buffers */
upp_buff_init();



/* enable the device */
*(uint32_t *)(upp_base + UPPCR) = (0x08);
reg_stat = ( *(uint32_t *)(upp_base+UPPCR) );
printf("upp Control now: %#010x\n",reg_stat);

reg_stat = ( *(uint32_t *)(psc1_base+UPIS0));
printf("Chan I status0: %#010x\n",reg_stat);
reg_stat = ( *(uint32_t *)(psc1_base+UPIS1));
printf("Chan I status1: %#010x\n",reg_stat);
reg_stat = ( *(uint32_t *)(psc1_base+UPIS2));
printf("Chan I status2: %#010x\n",reg_stat);
reg_stat = ( *(uint32_t *)(psc1_base+UPQS0));
printf("Chan Q status0: %#010x\n",reg_stat);
reg_stat = ( *(uint32_t *)(psc1_base+UPQS1));
printf("Chan Q status1: %#010x\n",reg_stat);
reg_stat = ( *(uint32_t *)(psc1_base+UPQS2));
printf("Chan Q status2: %#010x\n",reg_stat);

/* set the dma transfers */
set_dma();

reg_stat = ( *(uint32_t *)(psc1_base+UPIES));
printf("UPIES: %#010x\n",reg_stat);

/* for (i=0;i<2048;i++){
*(tx_buf+i)=i;
}*/

reg_stat = ( *(uint32_t *)(psc1_base+UPIES));
printf("UPIES: %#010x\n",reg_stat);


reg_stat = ( *(uint32_t *)(psc1_base+UPIS0));
printf("Chan I status0: %#010x\n",reg_stat);
reg_stat = ( *(uint32_t *)(psc1_base+UPIS1));
printf("Chan I status1: %#010x\n",reg_stat);
reg_stat = ( *(uint32_t *)(psc1_base+UPIS2));
printf("Chan I status2: %#010x\n",reg_stat);
reg_stat = ( *(uint32_t *)(psc1_base+UPQS0));
printf("Chan Q status0: %#010x\n",reg_stat);
reg_stat = ( *(uint32_t *)(psc1_base+UPQS1));
printf("Chan Q status1: %#010x\n",reg_stat);
reg_stat = ( *(uint32_t *)(psc1_base+UPQS2));
printf("Chan Q status2: %#010x\n",reg_stat);

reg_stat = ( *(uint32_t *)(psc1_base+UPIES));
printf("UPIES: %#010x\n",reg_stat);




/* unmap the pinmux registers */
upp_mmap_deinit();

return EXIT_SUCCESS;
}

    (1-1/1)