Sorry forgot to attach code. The output matches pci -v. I posted this meesage to other forum as I need an urgent reply sory if that caused any inconvenience to anybody
The code is as follows:
#include <sys/neutrino.h>
#include <hw/pci.h>
#include <hw/pci_devices.h>
#include <stdio.h>
#include <sys/mman.h>
#include <errno.h>
struct pci_dev_info inf;
#define HOTICE_CARD_DEVICE_ID 0x8478
#define HOTICE_CARD_VENDOR_ID 0x14f1
#define FUNC0_BAR_START ((void*)0x00900000)
int phndl;
void* hndl;
uint32_t addr;
void*mem_hndl;
uint32_t addr_hndl;
void pci_debug(struct pci_dev_info *inf);
void pci_give_command(uint16_t pci_command, struct pci_dev_info *inf);
int hdlc_detect_card(void);
void remove_card(struct pci_dev_info *inf);
//int main(int argc, char *argv)
int main(int argc, char *argv)
{
hdlc_detect_card();
remove_card(&inf);
}
void pci_debug(struct pci_dev_info *inf)
{
uint32_t i;
fprintf(stdout,"\n device id=%x",inf->DeviceId);
fprintf(stdout,"\n Vendo id=%x",inf->VendorId);
fprintf(stdout,"\n BusNumber=%x",inf->BusNumber);
fprintf(stdout,"\n device function=%x",inf->DevFunc);
fprintf(stdout,"\n device class=%x",inf->Class);
fprintf(stdout,"\n device irq=%x",inf->Irq);
fprintf(stdout,"\n pcibase address =%x",(*(inf->CpuBaseAddress)));
//addr_hndl=(uint32_t*)(*(inf->CpuBaseAddress));
fprintf(stdout,"\n base address size=%x",(*(inf->BaseAddressSize)));
pci_read_config32(inf->BusNumber,inf->DevFunc,0x10,1,&i);
fprintf(stdout,"\n base address 0=%x",i);
pci_read_config32(inf->BusNumber,inf->DevFunc,0x14,1,&i);
fprintf(stdout,"\n base address 1=%x",i);
pci_read_config32(inf->BusNumber,inf->DevFunc,0x18,1,&i);
fprintf(stdout,"\n base address 2=%x",i);
pci_read_config32(inf->BusNumber,inf->DevFunc,0x1c,1,&i);
fprintf(stdout,"\n base address 3=%x",i);
pci_read_config32(inf->BusNumber,inf->DevFunc,0x20,1,&i);
fprintf(stdout,"\n base address 4=%x",i);
pci_read_config32(inf->BusNumber,inf->DevFunc,0x24,1,&i);
fprintf(stdout,"\n base address 5=%x",i);
}
void pci_give_command(uint16_t pci_command, struct pci_dev_info *inf)
{
uint16_t test_read;
//fprintf(stdout,"\n pci command register ip=%x",pci_command);
pci_write_config16(inf->BusNumber,inf->DevFunc,0x04,1,&pci_command);
pci_read_config16(inf->BusNumber,inf->DevFunc,0x06,1,&test_read);
fprintf(stdout,"\n pci command register ip=%x",pci_command);
fprintf(stdout,"\n pci command register op =%x",test_read);
}
int hdlc_detect_card(void)
{
volatile uint32_t *x;
volatile int status;
volatile int pidx=0;
int flg;
unsigned device=HOTICE_CARD_DEVICE_ID;
unsigned vendor=HOTICE_CARD_VENDOR_ID;
unsigned index=1;
unsigned bus;
unsigned dev;
unsigned func;
unsigned dev_func;
memset( &inf, 0, sizeof( inf ) );
inf.VendorId= HOTICE_CARD_VENDOR_ID;
inf.DeviceId= HOTICE_CARD_DEVICE_ID;
ThreadCtl( _NTO_TCTL_IO, 0 );
phndl=pci_attach(0);
if (-1==phndl)
fprintf(stderr,"\n unable to attach pci");
else
{
status=pci_find_device( device,vendor,index,&bus,&dev_func );
if (status!=PCI_SUCCESS)
{
fprintf(stderr,"\n device not found");
}
else
{
dev=(dev_func&0xf8)>>3;
func=dev_func&0x07;
fprintf(stdout,"\n BusNumber=%x",bus);
fprintf(stdout,"\n device function=%x",func);
fprintf(stdout,"\n device dev_function=%x",dev_func);
fprintf(stdout,"\n device number=%x",dev);
}
hndl=pci_attach_device(NULL,(PCI_SHARE|PCI_SEARCH_VENDEV|PCI_INIT_ALL),pidx,&inf);
// hndl = pci_attach_device( NULL, (PCI_SEARCH_VENDEV|PCI_INIT_ALL), pidx, &inf );
if(NULL==hndl)
{
fprintf(stderr,"\n Erro code %x, implies %s",errno,sys_errlist[errno]);
return errno;
}
//pci_debug(&inf);
status =pci_read_config32(inf.BusNumber,inf.DevFunc,0x10,1,&addr);
if (PCI_SUCCESS!=status)
{
fprintf(stderr,"\n error reading config space 0 BAR2");
}
else
{
fprintf(stdout,"\n reading config space 0 BAR2, addr is =%x",addr);
addr_hndl=PCI_MEM_ADDR(addr);
fprintf(stdout,"\n config space 0 BAR2 addr is =%x",addr_hndl);
// flg=(/*MAP_PRIVATE|*/MAP_ANON|MAP_PHYS);
flg=0;
#if 0
mem_hndl=mmap(/*FUNC0_BAR_START*/NULL,(*(inf.BaseAddressSize)),(PROT_READ|PROT_WRITE/*|PROT_NOCACHE*/),flg,NOFD,(uint64_t)addr_hndl);
#endif
#if 1
mem_hndl=mmap_device_memory(/*FUNC0_BAR_START*/NULL,(*(inf.BaseAddressSize)),(PROT_READ|PROT_WRITE/*|PROT_NOCACHE*/),flg,(uint64_t)addr_hndl);
#endif
// |MAP_BELOW16M
if (MAP_FAILED==mem_hndl)
{
fprintf(stderr, "mmap failed : %s\n",strerror(errno));
remove_card(&inf);
return;
}
fprintf(stdout,"\n config space 0 BAR2 map addr is =%x",mem_hndl);
pci_give_command(0x384, &inf);
x=(uint32_t*)(mem_hndl+0x0600);
*x=0x00000010;
fprintf(stdout,"\n 1.base read addr =%x",x);
fprintf(stdout,"\n 1.value at base read addr =%x",*x);
x=(uint32_t*)(mem_hndl+0x0008);
// x=(uint32_t*)addr_hndl;
*x=0x00000100;
fprintf(stdout,"\n 2. base read addr =%x",x);
fprintf(stdout,"\n 2.value at base read addr =%x",*x);
x=(uint32_t*)(mem_hndl+0x0600);
// *x=0x00000010;
fprintf(stdout,"\n 3.base read addr =%x",x);
fprintf(stdout,"\n 3.value at base read addr =%x",*x);
x=(uint32_t*)(mem_hndl+0x0008);
// x=(uint32_t*)addr_hndl;
*x=0x00000000;
fprintf(stdout,"\n 4.base read addr =%x",x);
fprintf(stdout,"\n 4.value at base read addr =%x",*x);
/*Interrupt Status Descriptor*/
x=(uint32_t*)(mem_hndl+0x000C);
while (*x==0x00)
{
fprintf(stdout,"\n 5.base read addr =%x",x);
fprintf(stdout,"\n 5.value at base read addr =%x",*x);
}
}
}
}
void remove_card(struct pci_dev_info *inf)
{
int status;
if (MAP_FAILED!=mem_hndl)
{
// status = munmap(mem_hndl,(*(inf->BaseAddressSize)));
status = munmap_device_memory(mem_hndl,(*(inf->BaseAddressSize)));
if (-1==status)
{
fprintf(stderr, "munmap failed : %s\n",strerror(errno));
}
}
status=pci_detach_device(hndl);
if (PCI_SUCCESS!=status)
{
fprintf(stderr, "detach device failed status =%x : %s\n",status,strerror(errno));
}
status=pci_detach(phndl);
if (PCI_SUCCESS!=status)
{
fprintf(stderr, "detach device failed status =%x : %s\n",status,strerror(errno));
}
}