📄 ohci_c_flow.txt
字号:
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 + -