⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ohci_c_flow.txt

📁 1394在linux下单独的驱动程序代码
💻 TXT
📖 第 1 页 / 共 3 页
字号:
IRM?What is IRM?ohci1394_init:	return pci_module_init(&ohci1394_pci_driver);ohci1394_pci_driver:	ohci1394_pci_tbl:	.class = 	PCI_CLASS_FIREWIRE_OHCI,ohci1394_pci_probe{	pci_enable_device(dev);	pci_set_master(dev);	host = hpsb_alloc_host(&ohci1394_driver, sizeof(struct ti_ohci));	/* We don't want hardware swapping */	pci_write_config_dword(dev, OHCI1394_PCI_HCI_Control, 0);	request_mem_region (ohci_base, OHCI1394_REGISTER_SIZE, OHCI1394_DRIVER_NAME);	ohci->registers = ioremap(ohci_base, OHCI1394_REGISTER_SIZE);	ohci->csr_config_rom_cpu =pci_alloc_consistent(ohci->dev, OHCI_CONFIG_ROM_LEN,&ohci->csr_config_rom_bus);	ohci->selfid_buf_cpu = pci_alloc_consistent(ohci->dev, OHCI1394_SI_DMA_BUF_SIZE,&ohci->selfid_buf_bus);	/* AR DMA request context allocation */	alloc_dma_rcv_ctx(ohci, &ohci->ar_req_context,DMA_CTX_ASYNC_REQ, 0, AR_REQ_NUM_DESC,AR_REQ_BUF_SIZE, AR_REQ_SPLIT_BUF_SIZE,OHCI1394_AsReqRcvContextBase);	/* AR DMA response context allocation */	alloc_dma_rcv_ctx(ohci, &ohci->ar_resp_context,DMA_CTX_ASYNC_RESP, 0, AR_RESP_NUM_DESC,AR_RESP_BUF_SIZE, AR_RESP_SPLIT_BUF_SIZE,OHCI1394_AsRspRcvContextBase) ;	/* AT DMA request context */	alloc_dma_trm_ctx(ohci, &ohci->at_req_context,DMA_CTX_ASYNC_REQ, 0, AT_REQ_NUM_DESC,OHCI1394_AsReqTrContextBase);	/* AT DMA response context */	alloc_dma_trm_ctx(ohci, &ohci->at_resp_context,DMA_CTX_ASYNC_RESP, 1, AT_RESP_NUM_DESC,OHCI1394_AsRspTrContextBase) ;	/* Start off with a soft reset, to clear everything to a sane state. */	ohci_soft_reset(ohci);	/* Now enable LPS, which we need in order to start accessing	 * most of the registers.  In fact, on some cards (ALI M5251),	 * accessing registers in the SClk domain without LPS enabled	 * will lock up the machine.  Wait 50msec to make sure we have	 * full link enabled.  */	reg_write(ohci, OHCI1394_HCControlSet, OHCI1394_HCControl_LPS);	mdelay(50);	/* Determine the number of available IR and IT contexts. */	ohci->nb_iso_rcv_ctx =get_nb_iso_ctx(ohci, OHCI1394_IsoRecvIntMaskSet);	ohci->nb_iso_xmit_ctx =get_nb_iso_ctx(ohci, OHCI1394_IsoXmitIntMaskSet);	/* Set the usage bits for non-existent contexts so they can't  be allocated */	ohci->ir_ctx_usage = ~0 << ohci->nb_iso_rcv_ctx;	ohci->it_ctx_usage = ~0 << ohci->nb_iso_xmit_ctx;	/* the IR DMA context is allocated on-demand; mark it inactive */	ohci->ir_legacy_context.ohci = NULL;	/* same for the IT DMA context */	ohci->it_legacy_context.ohci = NULL;	request_irq(dev->irq, ohci_irq_handler, SA_SHIRQ,OHCI1394_DRIVER_NAME, ohci);		ohci_initialize(ohci);	/* Tell the highlevel this host is ready */	hpsb_add_host(host);		:hosts.c}static void ohci_initialize(struct ti_ohci *ohci){	//OHCI1394_NodeID:0xE8,see pdf_doc,p53	//set bus number 0xffc0,nodenumber 0.	reg_write(ohci, OHCI1394_NodeID, 0x0000ffc0);	/* Clear link control register */	//OHCI1394_LinkControlClear:0xE4	reg_write(ohci, OHCI1394_LinkControlClear, 0xffffffff);		/* Enable cycle timer and cycle master and set the IRM	 * contender bit in our self ID packets. */	 //OHCI1394_LinkControlSet:0xE0,see pdf_doc,p51	reg_write(ohci, OHCI1394_LinkControlSet, 0x00300000);	//address:4,	data:0xc0,物理层的地址4内容是什么?	set_phy_reg_mask(ohci, 4, 0xc0);		//读取self_id:	/* Set up self-id dma buffer */	//OHCI1394_SelfIDBuffer:0x64,see pdf_doc,p147	reg_write(ohci, OHCI1394_SelfIDBuffer, ohci->selfid_buf_bus);	/* enable self-id dma */	//OHCI1394_LinkControlSet:0xE0,see pdf_doc,p51,accept self_ID packets	reg_write(ohci, OHCI1394_LinkControlSet, 0x00000200);			//读取Config ROM	/* Set the Config ROM mapping register */	//OHCI1394_ConfigROMmap:0x34,see pdf_doc,p44	reg_write(ohci, OHCI1394_ConfigROMmap, ohci->csr_config_rom_bus);	/* Initialize the Config ROM */	ohci_init_config_rom(ohci);		//读取最大包大小	/* Now get our max packet size */	//OHCI1394_BusOptions:0x20,see pdf_doc,p41	ohci->max_packet_size = 		1<<(((reg_read(ohci, OHCI1394_BusOptions)>>12)&0xf)+1);			/* Initialize AR dma */	/* Initialize AT dma */	/* 	 * Accept AT requests from all nodes. This probably 	 * will have to be controlled from the subsystem	 * on a per node basis.	 */	/* Specify AT retries */	/* We don't want hardware swapping */		/* Enable interrupts */	reg_write(ohci, OHCI1394_IntMaskSet,		  OHCI1394_unrecoverableError |		  OHCI1394_masterIntEnable | 		  OHCI1394_busReset | 		  OHCI1394_selfIDComplete |		  OHCI1394_RSPkt |		  OHCI1394_RQPkt |		  OHCI1394_respTxComplete |		  OHCI1394_reqTxComplete |		  OHCI1394_isochRx |		  OHCI1394_isochTx |		  OHCI1394_cycleInconsistent);	/* Enable link */}static void ohci_init_config_rom(struct ti_ohci *ohci){向那里put?向变量cr赋值吗?	cf_unit_begin(&cr, 0);	cf_put_1quad(&cr, reg_read(ohci, OHCI1394_BusID));	//OHCI1394_BusID:0x1C,see pdf_doc,p40	...}static void handle_selfid(struct ti_ohci *ohci, struct hpsb_host *host,int phyid, int isroot){}static int ohci_iso_recv_init(struct hpsb_iso *iso){}???	block_irq_interval		irq_interval		nblocks//see:	static int ohci_iso_recv_init(struct hpsb_iso *iso)//什么时候产生中断? /* int block_irq_interval:	number of blocks to batch between interrupts */ recv->block_irq_interval = iso->irq_interval / recv->nblocks;static void ohci_iso_recv_program(struct hpsb_iso *iso){		/* interrupt on last block, and at intervals */		if (blk == recv->nblocks-1 || (blk % recv->block_irq_interval) == 0) {		//see pdf_doc,p129			control |= 3 << 20; /* want interrupt */		}}static int ohci_iso_recv_start(struct hpsb_iso *iso, int cycle, int tag_mask, int sync){}static void ohci_iso_recv_task(unsigned long data){	struct hpsb_iso *iso = (struct hpsb_iso*) data;	struct ohci_iso_recv *recv = iso->hostdata;		if (recv->dma_mode == BUFFER_FILL_MODE)		ohci_iso_recv_bufferfill_task(iso, recv);	else		ohci_iso_recv_packetperbuf_task(iso, recv);}2,highlevel.c,see highlevel.h:	void (*add_host) (struct hpsb_host *host);	void (*remove_host) (struct hpsb_host *host);	void (*host_reset) (struct hpsb_host *host);	void (*iso_receive) (struct hpsb_host *host, int channel,quadlet_t *data, size_t length);	void (*fcp_request) (struct hpsb_host *host, int nodeid, int direction,int cts, u8 *data, size_t length);	int (*read) (struct hpsb_host *host, int nodeid, quadlet_t *buffer,u64 addr, size_t length, u16 flags);	int (*write) (struct hpsb_host *host, int nodeid, int destid,quadlet_t *data, u64 addr, size_t length, u16 flags);		int (*lock) (struct hpsb_host *host, int nodeid, quadlet_t *store,u64 addr, quadlet_t data, quadlet_t arg, int ext_tcode, u16 flags);	int (*lock64) (struct hpsb_host *host, int nodeid, octlet_t *store,u64 addr, octlet_t data, octlet_t arg, int ext_tcode, u16 flags);	int highlevel_read(struct hpsb_host *host, int nodeid, void *data,u64 addr, unsigned int length, u16 flags);	int highlevel_write(struct hpsb_host *host, int nodeid, int destid,void *data, u64 addr, unsigned int length, u16 flags);	int highlevel_lock(struct hpsb_host *host, int nodeid, quadlet_t *store,u64 addr, quadlet_t data, quadlet_t arg, int ext_tcode, u16 flags);	int highlevel_lock64(struct hpsb_host *host, int nodeid, octlet_t *store,u64 addr, octlet_t data, octlet_t arg, int ext_tcode, u16 flags);	void highlevel_iso_receive(struct hpsb_host *host, void *data,size_t length);	void highlevel_fcp_request(struct hpsb_host *host, int nodeid, int direction,void *data, size_t length);	void hpsb_register_highlevel(struct hpsb_highlevel *hl);	void hpsb_unregister_highlevel(struct hpsb_highlevel *hl);	int hpsb_register_addrspace(struct hpsb_highlevel *hl,struct hpsb_address_ops *ops, u64 start, u64 end);	int hpsb_unregister_addrspace(struct hpsb_highlevel *hl, u64 start);	int hpsb_listen_channel(struct hpsb_highlevel *hl, struct hpsb_host *host, unsigned int channel);	void hpsb_unlisten_channel(struct hpsb_highlevel *hl, struct hpsb_host *host,unsigned int channel);	void *hpsb_get_hostinfo(struct hpsb_highlevel *hl, struct hpsb_host *host);	void *hpsb_create_hostinfo(struct hpsb_highlevel *hl, struct hpsb_host *host,size_t data_size);	void hpsb_destroy_hostinfo(struct hpsb_highlevel *hl, struct hpsb_host *host);	void hpsb_set_hostinfo_key(struct hpsb_highlevel *hl, struct hpsb_host *host, unsigned long key);	unsigned long hpsb_get_hostinfo_key(struct hpsb_highlevel *hl, struct hpsb_host *host);	void *hpsb_get_hostinfo_bykey(struct hpsb_highlevel *hl, unsigned long key);	int hpsb_set_hostinfo(struct hpsb_highlevel *hl, struct hpsb_host *host, void *data);	struct hpsb_host *hpsb_get_host_bykey(struct hpsb_highlevel *hl, unsigned long key);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -