首页 > 编程知识 正文

PCI串行端口,pci内存控制器驱动

时间:2023-05-03 06:19:43 阅读:18567 作者:4645

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 );

}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。