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 register\n ‘,gDrvrName );
返回(crit _ err;
}
printk (kern _ info ‘ % s : init : module registered\n ‘,gDrvrName );
gstatflags=gstatflags|have _ kreg;
printk(‘%sdriverisloaded\n ‘,gDrvrName );
返回0;
}
ioremap ) )函数将内存域的物理地址映射到Linux系统中的虚拟地址,并允许使用gBaseVirt全局指针访问卡中的内存映射寄存器。
{
ret=readb () void* ) reg_addr;
返回ret;
}
() ) ) )。
{
writeb(val,) void* ) reg_addr );
}