xapp1022里:
staticintxpcie_init(void ) )。
{
gdev=PCI _ find _ device (PCI _ vendor _ id _ Xilinx,PCI_DEVICE_ID_XILINX_PCIE,gdev );
if (空值==gdev ) {
printk (/* kern _ warning (/' % s : init : hardware not found. n ',gDrvrName );
//return(crit_err );
返回(-1;
}
if(0PCI_enable_device(gdev ) ) )
printk (/* kern _ warning (/' % s : init : devicenotenabled. n ',gDrvrName );
//return(crit_err );
返回(-1;
}
//getbaseaddressofregistersfrompcistructure.shouldcomefrompci _ dev
//structure,butthatelementseemstobemissingonthedevelopmentsystem。
if(0gbasehdwr ) {
printk (/* kern _ warning (/' % s : init : baseaddressnotset. n ',gDrvrName );
//return(crit_err );
返回(-1;
}
printk (/* kern _ warning (/' basehwval % x (n ),) unsigned int ) gBaseHdwr );
printk (/* kern _ warning (/' basehwlen % d (n ),) unsigned int ) gBaseLen );
//remap thei/oregisterblocksothatitcanbesafelyaccessed。
//I/oregisterblockstartsatgbasehdwrandis 32字节长。
//itiscasttocharbecausethatisthewaylinusdoesit。
//参考'/usr/src/Linux-2.4/documentation/io-mapping.txt '。
gbasevirt=IOremap(gbasehdwr,gBaseLen );
if (! gasevirt}{
printk (/* kern _ warning (/' % s : init : couldnotremapmemory. n ',gDrvrName );
//return(crit_err );
返回(-1;
}
printk (/* kern _ warning (/' virthwval % x (n ),(unsigned int ) gBaseVirt );
//getirqfrompci _ dev structure.itmayhavebeenremappedbythekernel,
//andthisvaluewillbethecorrectone。
gIrq=gDev-irq;
printk(IRQ:%d(n )、gIrq );
//--- -开始:初始化硬件
//trytogainexclusivecontrolofmemoryfordemohardware。
(if(0check_mem_region(gbasehdwr,KINBURN_REGISTER_SIZE ) ) ) ) ) ) ) )
printk (/* kern _ warning */' % s : init : memory inuse. n ',gDrvrName );
//return(crit_err );
返回(-1;
}
request_mem_region(gbasehdwr,KINBURN_REGISTER_SIZE,' 3GIO_Demo_Drv ' );
gstatflags=gstatflags|have _ region;
printk (/* kern _ warning (/' % s : init : initializehardwaredone .n ',gDrvrName );
//请求IRQ from操作系统。
#if 0
if(0request_IRQ(girq,XPCIe悲伤故事Handler,/* SA_INTERRUPT糟糕的柠檬/SA_SHIRQ,gDrvrName,gDev ) ) }
printk (/* kern _ warning (/' % s : init : unabletoallocateirq ),gDrvrName );
返回(-1;
}
gStatFlags=gStatFlags | HAVE悲伤的故事
#endif
init代码(;
//----end :初始化硬件
//----start : allocate buffers
gufferunaligned=kmalloc (buf _ size,GFP_KERNEL );
gReadBuffer=gBufferUnaligned;
if (空值==gbufferunaligned ) {
printk (kern _ crit ' % s : init : unabletoallocategbuffer. n ',gDrvrName );
返回(-1;
}
gritebuffer=kmalloc(buf_size,GFP_KERNEL );
if(null==gwritebuffer ) {
printk (kern _ crit ' % s : init : unabletoallocategbuffer. n ',gDrvrName );
返回(-1;
}
//--- END: Allocate Buffers
//--start :注册驱动程序
//registerwiththekernelasacharacterdevice。
//abort if it故障。
if(0register_chrdev(gdrvrmajor、gDrvrName、XPCIe_Intf ) ) )
printk (kern _ warning ' % s : init : will not registern ',gDrvrName );
返回(crit _ err;
}
printk (kern _ info ' % s : init : module registeredn ',gDrvrName );
gstatflags=gstatflags|have _ kreg;
printk('%sdriverisloadedn ',gDrvrName );
返回0;
}
ioremap ) )函数将内存域的物理地址映射到Linux系统中的虚拟地址,并允许使用gBaseVirt全局指针访问卡中的内存映射寄存器。
{
ret=readb () void* ) reg_addr;
返回ret;
}
() ) ) )。
{
writeb(val,) void* ) reg_addr );
}