PCI Express设备驱动 (9,用户态API)

提供给用户态程序使用的API函数:

 /******* api.h *******/

#include <sys/types.h>
#include
<sys/stat.h>
#include
<stdio.h>
#include
<fcntl.h>

#define u32 unsigned int

int PcieOpen();
u32 PcieWrite(
int fd, void* src_addr, u32 ddr2_offset, u32 num_bytes);
u32 PcieRead(
int fd, void* dst_addr, u32 ddr2_offset, u32 num_bytes);

 /******* api.c *******/ 

#include "api.h"
#define ONE_MB 1024*1024

int PcieOpen()
{
int fd;
fd
=open("/dev/card007", O_RDWR);
if (fd == -1)
{
printf(
"Open Pcie Device (/dev/card007) Failed!!!\n");
}
return fd;
}

u32 PcieWrite(
int fd, void* src_addr, u32 ddr2_offset, u32 num_bytes)
{
u32 n, n1, n_bytes;
u32 num, offset;

if (fd == -1)
{
printf(
"Error: Open Pcie Device (/dev/card007) Failed!!!\n");
return -1;
}

if (ddr2_offset%128 != 0)
{
printf(
"Error: ddr2_offset should be 128x2^n !!!\n");
return -1;
}

if (num_bytes%128 !=0)
{
printf(
"Error: Number of bytes to transfer should be 128x2^n !!!\n");
return -1;
}

offset
= lseek(fd, ddr2_offset, SEEK_SET); // set ddr2_offset.

num
= 0;
n
= num_bytes/(ONE_MB);
n1
= n;
while (n1)
{
num
+= write(fd, (src_addr+(n-n1)*(ONE_MB)), (ONE_MB)); //write card
offset = lseek(fd, offset+(ONE_MB), SEEK_SET); // set ddr2_offset.
n1--;
}

n_bytes
= (num_bytes - n*(ONE_MB))%(ONE_MB); // number of bytes < 1024*1024 bytes
if (n_bytes > 0)
{
num
+= write(fd, src_addr, n_bytes); // write card
}

return num;
}

u32 PcieRead(
int fd, void* dst_addr, u32 ddr2_offset, u32 num_bytes)
{
u32 n, n1, n_bytes;
u32 num, offset;

if (fd == -1)
{
printf(
"Error: Open Pcie Device (/dev/card007) Failed !!!\n");
return -1;
}

if (ddr2_offset%128 != 0)
{
printf(
"Error: ddr2_offset should be 128x2^n !!!\n");
return -1;
}

if (num_bytes%128 !=0)
{
printf(
"Error: Number of bytes to transfer should be 128x2^n !!!\n");
return -1;
}

offset
= lseek(fd, ddr2_offset, SEEK_SET); // set ddr2_offset.

num
= 0;
n
= num_bytes/(ONE_MB);
n1
= n;
while (n1)
{
num
+= read(fd, (dst_addr+(n-n1)*(ONE_MB)), (ONE_MB)); //write card
offset = lseek(fd, offset+(ONE_MB), SEEK_SET); // set ddr2_offset.
n1--;
}

n_bytes
= (num_bytes - n*(ONE_MB))%(ONE_MB); // number of bytes < 1024*1024 bytes
if (n_bytes > 0)
{
num
+= read(fd, dst_addr, n_bytes); // read card
}

return num;
}

PCI Express设备驱动 (4,PCIe配置空间和PCI设备中的寄存器)中的PCI设备中的寄存器部分可知,

该PCIe设备每次传输的数据必须是128个字节的整数倍,并且每次DMA最多可传输128*8192字节,即1M个字节的数据。

函数PcieOpen()打开设备文件,并返回文件描述符;

函数u32 PcieWrite(int fd, void* src_addr, u32 ddr2_offset, u32 num_bytes),输入设备文件描述符、要写入设备的数据的内存地址、设备上DDR2存储器的偏移量、以及写入的字节数。返回实际写入的字节数。

函数u32 PcieRead(int fd, void* dst_addr, u32 ddr2_offset, u32 num_bytes),输入设备文件描述符、从设备读出的数据要写入的内存地址、设备上DDR2存储器的偏移量、以及读出的字节数。返回实际读出的字节数。

函数PcieWrite和PcieRead可实现读写任意个字节的数据。  

 

posted on 2011-08-24 19:54  zzwworld  阅读(1591)  评论(0)    收藏  举报

导航