OpenQNX :: The QNX Community Portal

Jul 05, 2008 - 10:52 AM
Google
  Web openqnx.com   
     Create an account Home · Submit News · QNX Forums · QNX Download · Search   
_
Main Menu
Who's Online
There are 42 unlogged users and 1 registered user online.

You can log-in or register for a user account here.

Post new topic   Reply to topic
View previous topic Printable version Log in to check your private messages View next topic
Author Message
stjosue
Post subject: vxworks to qnx, help  PostPosted: Mar 29, 2006 - 11:58 PM
Active Member


Joined: Mar 06, 2006
Posts: 45

hi. everyone!

I'm porting and rewrite device driver source code AMDXRC II Lite for vxworks to qnx6.30

//PCI 9080

I have problem in this part of source code:

************************
version: vxworks
************************
Code:


static unsigned long pci_bar_addresses[]={
  PCI_CFG_BASE_ADDRESS_0,
  PCI_CFG_BASE_ADDRESS_1,
  PCI_CFG_BASE_ADDRESS_2,
  PCI_CFG_BASE_ADDRESS_3,
  PCI_CFG_BASE_ADDRESS_4,
  PCI_CFG_BASE_ADDRESS_5,
  0
};

typedef struct _pci_dev {
  os_uint16 vendor;
  os_uint16 device;
  os_uint16 subsystem_vendor;
  os_uint16 subsystem_device;
  int irq;
  char rev;
  struct {
    os_uint32 start;
    os_uint32 end;
    os_uint32 flags;
  } resource[DEVICE_COUNT_RESOURCE];
} pci_dev;

#define PCI_FIND_DEVICE     pciFindDevice
#define PCI_CONFIG_IN_BYTE    pciConfigInByte
#define PCI_CONFIG_IN_WORD    pciConfigInWord
#define PCI_CONFIG_IN_LONG    pciConfigInLong
#define PCI_CONFIG_OUT_LONG pciConfigOutLong

------------------------------------------------------------
  int i=0;
  int index=0;
  int instance;
  int bus=0,dev=0,fun=0,curr,mask,size;
  short vid,did;
  int j;
  char irql,rev;
  pci_dev pci_device;
  os_dbgprint(0, ("pci_reg_devices: entered\n"));

if (PCI_FIND_DEVICE(vendor, device, instance, &bus, &dev, &fun)!= ERROR)
  {
     instance ++;
     #ifdef FRC690
       bus = LONSWAP(bus);
       dev = LONSWAP(dev);
       fun  = LONSWAP(fun);
     #endif
     pciConfigInWord(bus, dev,);
     PCI_CONFIG_IN_WORD( bus, dev, fun,PCI_CFG_SUB_VENDER_ID,&vid);     
     PCI_CONFIG_IN_WORD( bus, dev, fun, PCI_CFG_SUB_SYSTEM_ID,&did );

     if ((vid==subvendor)&&(did==subdevice))
            {
              /* Found Device*/
              pci_device.vendor = pci_tbl[i].vendor;
              pci_device.device = pci_tbl[i].device;
              pci_device.subsystem_vendor=vid;
              pci_device.subsystem_device=did;
              for (j=0;pci_bar_addresses[j];j++)
                {
                  int lock;
                  PCI_CONFIG_IN_LONG( bus, dev, fun, pci_bar_addresses[j], &curr );
                  lock=intLock();
                  PCI_CONFIG_OUT_LONG( bus, dev, fun, pci_bar_addresses[j], ~0 );
                  PCI_CONFIG_IN_LONG( bus, dev, fun, pci_bar_addresses[j], &mask );
                  PCI_CONFIG_OUT_LONG( bus, dev, fun, pci_bar_addresses[j], curr);
                  intUnlock(lock);
                  if (!mask)
                    continue;
                 
                  if (curr & PCI_BASE_IO)
                    {
                      pci_device.resource[j].flags = 1;
                      curr &= PCI_IOBASE_MASK;
                      mask &=PCI_IOBASE_MASK;
                    }
                  else
                    {
                      pci_device.resource[j].flags = 0;
                      curr &= PCI_MEMBASE_MASK;
                      mask&=PCI_MEMBASE_MASK;
                    }

                 #ifdef MCP750
                  curr+=PCI_MSTR_MEM_LOCAL - PCI_MSTR_MEM_BUS;
                  #endif
                  pci_device.resource[j].start = curr;
                  pci_device.resource[j].end = curr+(~mask+1)-1;
                 
                }
               PCI_CONFIG_IN_BYTE( bus, dev, fun, PCI_CFG_DEV_INT_LINE, &irql );
               pci_device.irq = (int) irql;
               
               os_dbgprint(0, ("irql: i=%d\n",pci_device.irq));
             
               PCI_CONFIG_IN_BYTE( bus, dev, fun, PCI_CFG_REVISION, &rev );
               pci_device.rev = (int) rev;

               PCI_CONFIG_IN_LONG( bus, dev, fun, 4, &curr );
               printf("PCI Command/Status = %8x\n",curr);

//               init_board(&pci_device,index,XRC_ON_PCI_BUS); 
               index++;
            }
     



**********************
my version
**********************
Code:


static unsigned long pci_bar_addresses[]={
  0x10 ,
  0x14 ,
  0x18 ,
  0x1c ,
  0x20 ,
  0x24 ,
  0
};
 

#define PCI_FIND_DEVICE     pci_find_device 
#define PCI_CONFIG_IN_BYTE    pci_read_config8
#define PCI_CONFIG_IN_WORD    pci_read_config16
#define PCI_CONFIG_IN_LONG    pci_read_config32
#define PCI_CONFIG_OUT_LONG pci_write_config32

-----------------------------------------------------------
  int i=0;
  int index=0;
  int instance;
  uint32_t bus,dev,fun,curr,mask,size,dev_fun;
  short vid,did;
  int j;
  uint8_t irql,rev;
  pci_dev pci_device;
   
   bus= 0; dev= 0; fun= 0; curr= 0; mask= 0; size= 0; dev_fun = 0;

   os_dbgprint(0, ("pci_reg_devices: entered\n"));
 
      instance=0;
      if( PCI_FIND_DEVICE(pci_tbl[i].device,  pci_tbl[i].vendor, instance,&bus, &dev_fun)!=PCI_DEVICE_NOT_FOUND)
        {
          instance++;
          PCI_CONFIG_IN_WORD( bus, dev_fun, 0x2E,1, &did );   //sub system ID
          PCI_CONFIG_IN_WORD( bus, dev_fun, 0x2C,1,&vid );   //sub system vendor ID

          dev = (dev_fun&0xf8 )>>3 ;
          fun =  dev_fun&0x07 ;
     
        if ( (vid==subvendor)&&(did==subdevice) )
            {
              /* Found Device*/
              os_dbgprint(0, ("Found Device \n"));
              pci_device.vendor = pci_tbl[i].vendor;
              pci_device.device = pci_tbl[i].device;
              pci_device.subsystem_vendor=vid;
              pci_device.subsystem_device=did;

             for (j=0;pci_bar_addresses[j];j++)
                {
                   PCI_CONFIG_IN_LONG( bus, dev_fun, pci_bar_addresses[j], 1,&curr );
                   data = ~data;
                   PCI_CONFIG_OUT_LONG( bus, dev_fun, pci_bar_addresses[j],1,&data );
                   PCI_CONFIG_IN_LONG( bus, dev_fun, pci_bar_addresses[j], 1,&mask );
                   PCI_CONFIG_OUT_LONG( bus, dev_fun, pci_bar_addresses[j],1,&curr);

                   if (!mask)
                      continue;
 
                 /*  if (curr & PCI_BASE_IO)              <----???
                     {
                        pci_device.resource[j].flags = 1;
                        curr &= PCI_IOBASE_MASK;     <-----??
                        mask &=PCI_IOBASE_MASK;
                     }
                   else
                     {
                        pci_device.resource[j].flags = 0;
                        curr &= PCI_MEMBASE_MASK;      <-----???
                        mask&=PCI_MEMBASE_MASK;
                     }
                 */
                    #ifdef MCP750
                    curr+=PCI_MSTR_MEM_LOCAL - PCI_MSTR_MEM_BUS;
                    #endif
                    pci_device.resource[j].start = curr;
                    pci_device.resource[j].end = curr+(~mask+1)-1;
                 
                }
               PCI_CONFIG_IN_BYTE( bus, dev_fun, 0x3C,1, &irql );  //Interrupt Line
               pci_device.irq = (int)irql;
               
               os_dbgprint(0, ("irql: i=%d\n",pci_device.irq));
                           
               PCI_CONFIG_IN_BYTE( bus, dev_fun, 0x08,1, &rev );   //Revision ID
               pci_device.rev = (int) rev;

               PCI_CONFIG_IN_LONG( inf.BusNumber, inf.DevFunc, 0x4, 1, &curr );   //Command
               os_dbgprint(0 ,("PCI Command/Status = %8x\n",curr) );
 
//               init_board(&pci_device,index,XRC_ON_PCI_BUS);
               index++;
            }
         
        }




my problem is in this part:

/* if (curr & PCI_BASE_IO)
{
pci_device.resource[j].flags = 1;
curr &= PCI_IOBASE_MASK;
mask &=PCI_IOBASE_MASK;
}
else
{
pci_device.resource[j].flags = 0;
curr &= PCI_MEMBASE_MASK;
mask&=PCI_MEMBASE_MASK;
}
*/

PCI_BASE_IO ????
PCI_IOBASE_MASK ????
PCI_MEMBASE_MASK ????

can you tell me what can i do?, or what are the values of these PCI_BASE .....

help me please!!

thanks!.

i'm sorry if my english is bad, i'm learning.
 
 View user's profile Send private message  
Reply with quote Back to top
Michael Tasche
Post subject: Re: vxworks to qnx, help  PostPosted: Apr 02, 2006 - 07:21 PM
Guest





Hi,

do not try to port this vxWorks driver code line by line.
This many pci config space accesses are only needed under vxWorks,
because the absolutely bad API design of vxWorks does not support you
with the sizes of the pci bars.
Try to to get some qnx sample-code and/or look at the QNX API docu.
Than write the pci attach code from scratch or use some QNX sample code,
to identify your pci device on the bus.

-Michael

stjosue schrieb:
Quote:
hi. everyone!

I'm porting and rewrite device driver source code AMDXRC II Lite for
vxworks to qnx6.30

//PCI 9080

I have problem in this part of source code:

************************
version: vxworks
************************


static unsigned long pci_bar_addresses[]={
PCI_CFG_BASE_ADDRESS_0,
PCI_CFG_BASE_ADDRESS_1,
PCI_CFG_BASE_ADDRESS_2,
PCI_CFG_BASE_ADDRESS_3,
PCI_CFG_BASE_ADDRESS_4,
PCI_CFG_BASE_ADDRESS_5,
0
};

typedef struct _pci_dev {
os_uint16 vendor;
os_uint16 device;
os_uint16 subsystem_vendor;
os_uint16 subsystem_device;
int irq;
char rev;
struct {
os_uint32 start;
os_uint32 end;
os_uint32 flags;
} resource[DEVICE_COUNT_RESOURCE];
} pci_dev;

#define PCI_FIND_DEVICE pciFindDevice
#define PCI_CONFIG_IN_BYTE pciConfigInByte
#define PCI_CONFIG_IN_WORD pciConfigInWord
#define PCI_CONFIG_IN_LONG pciConfigInLong
#define PCI_CONFIG_OUT_LONG pciConfigOutLong

------------------------------------------------------------
int i=0;
int index=0;
int instance;
int bus=0,dev=0,fun=0,curr,mask,size;
short vid,did;
int j;
char irql,rev;
pci_dev pci_device;
os_dbgprint(0, ("pci_reg_devices:
entered\n"));

if (PCI_FIND_DEVICE(vendor, device, instance, &bus,
&dev, &fun)!= ERROR)
{
instance ++;
#ifdef FRC690
bus = LONSWAP(bus);
dev = LONSWAP(dev);
fun = LONSWAP(fun);
#endif
pciConfigInWord(bus, dev,);
PCI_CONFIG_IN_WORD( bus, dev,
fun,PCI_CFG_SUB_VENDER_ID,&vid);
PCI_CONFIG_IN_WORD( bus, dev, fun,
PCI_CFG_SUB_SYSTEM_ID,&did );

if
((vid==subvendor)&&(did==subdevice))

{
/* Found Device*/
pci_device.vendor = pci_tbl[i].vendor;
pci_device.device = pci_tbl[i].device;
pci_device.subsystem_vendor=vid;
pci_device.subsystem_device=did;
for (j=0;pci_bar_addresses[j];j++)
{
int lock;
PCI_CONFIG_IN_LONG( bus, dev, fun,
pci_bar_addresses[j], &curr );
lock=intLock();
PCI_CONFIG_OUT_LONG( bus, dev, fun,
pci_bar_addresses[j], ~0 );
PCI_CONFIG_IN_LONG( bus, dev, fun,
pci_bar_addresses[j], &mask );
PCI_CONFIG_OUT_LONG( bus, dev, fun,
pci_bar_addresses[j], curr);
intUnlock(lock);
if (!mask)
continue;

if (curr & PCI_BASE_IO)
{
pci_device.resource[j].flags = 1;
curr &= PCI_IOBASE_MASK;
mask &=PCI_IOBASE_MASK;
}
else
{
pci_device.resource[j].flags = 0;
curr &= PCI_MEMBASE_MASK;
mask&=PCI_MEMBASE_MASK;
}

#ifdef MCP750
curr+=PCI_MSTR_MEM_LOCAL - PCI_MSTR_MEM_BUS;
#endif
pci_device.resource[j].start = curr;
pci_device.resource[j].end =
curr+(~mask+1)-1;

}
PCI_CONFIG_IN_BYTE( bus, dev, fun,
PCI_CFG_DEV_INT_LINE, &irql );
pci_device.irq = (int) irql;

os_dbgprint(0, ("irql:
i=%d\n",pci_device.irq));

PCI_CONFIG_IN_BYTE( bus, dev, fun,
PCI_CFG_REVISION, &rev );
pci_device.rev = (int) rev;

PCI_CONFIG_IN_LONG( bus, dev, fun, 4, &curr
);
printf("PCI Command/Status =
%8x\n",curr);

//
init_board(&pci_device,index,XRC_ON_PCI_BUS);
index++;
}




**********************
my version
**********************
[code:1:cc01594649]

static unsigned long pci_bar_addresses[]={
0x10 ,
0x14 ,
0x18 ,
0x1c ,
0x20 ,
0x24 ,
0
};


#define PCI_FIND_DEVICE pci_find_device
#define PCI_CONFIG_IN_BYTE pci_read_config8
#define PCI_CONFIG_IN_WORD pci_read_config16
#define PCI_CONFIG_IN_LONG pci_read_config32
#define PCI_CONFIG_OUT_LONG pci_write_config32

-----------------------------------------------------------
int i=0;
int index=0;
int instance;
uint32_t bus,dev,fun,curr,mask,size,dev_fun;
short vid,did;
int j;
uint8_t irql,rev;
pci_dev pci_device;

bus= 0; dev= 0; fun= 0; curr= 0; mask= 0; size= 0; dev_fun = 0;

os_dbgprint(0, ("pci_reg_devices:
entered\n"));

instance=0;
if( PCI_FIND_DEVICE(pci_tbl[i].device,
pci_tbl[i].vendor, instance,&bus,
&dev_fun)!=PCI_DEVICE_NOT_FOUND)
{
instance++;
PCI_CONFIG_IN_WORD( bus, dev_fun, 0x2E,1, &did
); //sub system ID
PCI_CONFIG_IN_WORD( bus, dev_fun, 0x2C,1,&vid );
//sub system vendor ID

dev = (dev_fun&0xf8 )>>3 ;
fun = dev_fun&0x07 ;

if (
(vid==subvendor)&&(did==subdevice) )
{
/* Found Device*/
os_dbgprint(0, ("Found Device
\n"));
pci_device.vendor = pci_tbl[i].vendor;
pci_device.device = pci_tbl[i].device;
pci_device.subsystem_vendor=vid;
pci_device.subsystem_device=did;

for (j=0;pci_bar_addresses[j];j++)
{
PCI_CONFIG_IN_LONG( bus, dev_fun,
pci_bar_addresses[j], 1,&curr );
data = ~data;
PCI_CONFIG_OUT_LONG( bus, dev_fun,
pci_bar_addresses[j],1,&data );
PCI_CONFIG_IN_LONG( bus, dev_fun,
pci_bar_addresses[j], 1,&mask );
PCI_CONFIG_OUT_LONG( bus, dev_fun,
pci_bar_addresses[j],1,&curr);

if (!mask)
continue;

/* if (curr & PCI_BASE_IO)
----???
{
pci_device.resource[j].flags = 1;
curr &= PCI_IOBASE_MASK; <-----??
mask &=PCI_IOBASE_MASK;
}
else
{
pci_device.resource[j].flags = 0;
curr &= PCI_MEMBASE_MASK;
-----???
mask&=PCI_MEMBASE_MASK;
}
*/
#ifdef MCP750
curr+=PCI_MSTR_MEM_LOCAL - PCI_MSTR_MEM_BUS;
#endif
pci_device.resource[j].start = curr;
pci_device.resource[j].end =
curr+(~mask+1)-1;

}
PCI_CONFIG_IN_BYTE( bus, dev_fun, 0x3C,1, &irql
); //Interrupt Line
pci_device.irq = (int)irql;

os_dbgprint(0, ("irql:
i=%d\n",pci_device.irq));

PCI_CONFIG_IN_BYTE( bus, dev_fun, 0x08,1, &rev
); //Revision ID
pci_device.rev = (int) rev;

PCI_CONFIG_IN_LONG( inf.BusNumber, inf.DevFunc,
0x4, 1, &curr ); //Command
os_dbgprint(0 ,("PCI Command/Status =
%8x\n",curr) );

//
init_board(&pci_device,index,XRC_ON_PCI_BUS);
index++;
}

}

[/code:1:cc01594649]


my problem is in this part:

/* if (curr & PCI_BASE_IO)
{
pci_device.resource[j].flags = 1;
curr &= PCI_IOBASE_MASK;
mask &=PCI_IOBASE_MASK;
}
else
{
pci_device.resource[j].flags = 0;
curr &= PCI_MEMBASE_MASK;
mask&=PCI_MEMBASE_MASK;
}
*/

PCI_BASE_IO ????
PCI_IOBASE_MASK ????
PCI_MEMBASE_MASK ????

can you tell me what can i do?, or what are the values of these
PCI_BASE .....

help me please!!

thanks!.

i'm sorry if my english is bad, i'm learning.
 
   
Reply with quote Back to top
Display posts from previous:     
Jump to:  
All times are GMT
Post new topic   Reply to topic
View previous topic Printable version Log in to check your private messages View next topic
Powered by PNphpBB2 © 2003-2007 The PNphpBB Group
Credits
All logos and trademarks in this site are property of their respective owners. The comments are property of their posters.
Powered by OpenQNX: The QNX Community Portal Site
QNX and the QNX logo are registered trademarks of QNX Software Systems.