阅读:2302回复:13
请教大牛们一个问题,急!如果我想要把1394卡设成S400的 除了改变csr.h里面的参数以外,还需要做些别的 什么改动?另外,csr.h里面有哪些参数需要修改? |
|
沙发#
发布于:2003-03-05 23:38
这是个甚么文件呀? :D
|
|
板凳#
发布于:2003-03-06 09:15
啊,忘了说明了,是在linux下面设置 1394卡按照哪种速率工作的方法 :) |
|
地板#
发布于:2003-03-06 10:06
你的意思是只让它工作在400M下?
|
|
地下室#
发布于:2003-03-06 19:23
是呀,这样能做到吗? |
|
5楼#
发布于:2003-03-07 10:49
可是总线配置时的各种包都是以基本速率传输的呀
|
|
6楼#
发布于:2003-03-07 11:14
我觉得不用改什么。只要你的节点有400M的能力,你发的包的包头中填写400M的速度信息,就可以了。
我觉得不用改csr.h里的文件呀?你在什么地方改的? #ifndef _IEEE1394_CSR_H #define _IEEE1394_CSR_H #define CSR_REGISTER_BASE 0xfffff0000000ULL /* register offsets relative to CSR_REGISTER_BASE */ #define CSR_STATE_CLEAR 0x0 #define CSR_STATE_SET 0x4 #define CSR_NODE_IDS 0x8 #define CSR_RESET_START 0xc #define CSR_SPLIT_TIMEOUT_HI 0x18 #define CSR_SPLIT_TIMEOUT_LO 0x1c #define CSR_CYCLE_TIME 0x200 #define CSR_BUS_TIME 0x204 #define CSR_BUSY_TIMEOUT 0x210 #define CSR_BUS_MANAGER_ID 0x21c #define CSR_BANDWIDTH_AVAILABLE 0x220 #define CSR_CHANNELS_AVAILABLE_HI 0x224 #define CSR_CHANNELS_AVAILABLE_LO 0x228 #define CSR_CONFIG_ROM 0x400 #define CSR_CONFIG_ROM_END 0x800 #define CSR_FCP_COMMAND 0xB00 #define CSR_FCP_RESPONSE 0xD00 #define CSR_FCP_END 0xF00 #define CSR_TOPOLOGY_MAP 0x1000 #define CSR_TOPOLOGY_MAP_END 0x1400 #define CSR_SPEED_MAP 0x2000 #define CSR_SPEED_MAP_END 0x3000 struct csr_control { spinlock_t lock; quadlet_t state; quadlet_t node_ids; quadlet_t split_timeout_hi, split_timeout_lo; quadlet_t cycle_time; quadlet_t bus_time; quadlet_t bus_manager_id; quadlet_t bandwidth_available; quadlet_t channels_available_hi, channels_available_lo; const quadlet_t *rom; size_t rom_size; quadlet_t topology_map[256]; quadlet_t speed_map[1024]; }; void init_csr(void); void cleanup_csr(void); #endif /* _IEEE1394_CSR_H */ |
|
7楼#
发布于:2003-03-07 11:14
我觉得不用改什么。只要你的节点有400M的能力,你发的包的包头中填写400M的速度信息,就可以了。
我觉得不用改csr.h呀?你在什么地方改的? #ifndef _IEEE1394_CSR_H #define _IEEE1394_CSR_H #define CSR_REGISTER_BASE 0xfffff0000000ULL /* register offsets relative to CSR_REGISTER_BASE */ #define CSR_STATE_CLEAR 0x0 #define CSR_STATE_SET 0x4 #define CSR_NODE_IDS 0x8 #define CSR_RESET_START 0xc #define CSR_SPLIT_TIMEOUT_HI 0x18 #define CSR_SPLIT_TIMEOUT_LO 0x1c #define CSR_CYCLE_TIME 0x200 #define CSR_BUS_TIME 0x204 #define CSR_BUSY_TIMEOUT 0x210 #define CSR_BUS_MANAGER_ID 0x21c #define CSR_BANDWIDTH_AVAILABLE 0x220 #define CSR_CHANNELS_AVAILABLE_HI 0x224 #define CSR_CHANNELS_AVAILABLE_LO 0x228 #define CSR_CONFIG_ROM 0x400 #define CSR_CONFIG_ROM_END 0x800 #define CSR_FCP_COMMAND 0xB00 #define CSR_FCP_RESPONSE 0xD00 #define CSR_FCP_END 0xF00 #define CSR_TOPOLOGY_MAP 0x1000 #define CSR_TOPOLOGY_MAP_END 0x1400 #define CSR_SPEED_MAP 0x2000 #define CSR_SPEED_MAP_END 0x3000 struct csr_control { spinlock_t lock; quadlet_t state; quadlet_t node_ids; quadlet_t split_timeout_hi, split_timeout_lo; quadlet_t cycle_time; quadlet_t bus_time; quadlet_t bus_manager_id; quadlet_t bandwidth_available; quadlet_t channels_available_hi, channels_available_lo; const quadlet_t *rom; size_t rom_size; quadlet_t topology_map[256]; quadlet_t speed_map[1024]; }; void init_csr(void); void cleanup_csr(void); #endif /* _IEEE1394_CSR_H */ |
|
8楼#
发布于:2003-03-10 09:30
我觉得不用改什么。只要你的节点有400M的能力,你发的包的包头中填写400M的速度信息,就可以了。 这样改就可以吗? |
|
9楼#
发布于:2003-03-18 16:39
如果你的卡的能力就不到400,那你该什么都没有用。如果支持400Mbps的速度,那么仅仅需要在发送的包信息中的相应域中填写设置速度为400M就可以了,我觉得不必改。
而且大错特错的是:CSR.h中宏 #define CSR_FCP_END 0xF00 #define CSR_TOPOLOGY_MAP 0x1000 #define CSR_TOPOLOGY_MAP_END 0x1400 #define CSR_SPEED_MAP 0x2000 #define CSR_SPEED_MAP_END 0x3000 都是偏移地址,0x1000正是拓扑的偏移地址,而0x2000是速度拓扑的偏移地址,都被你改乱了!!! 头文件中的宏定义是为了程序的可读性。CSR.h中的宏都是偏移地址,基地址是FFFFF0000000。 速度拓扑和拓扑都位于是256M的寄存器空间的初始元件空间中(FFFFF0000800开始就都是初始元件空间了)。 |
|
10楼#
发布于:2003-03-18 18:53
如果你的卡的能力就不到400,那你该什么都没有用。如果支持400Mbps的速度,那么仅仅需要在发送的包信息中的相应域中填写设置速度为400M就可以了,我觉得不必改。 这个我知道了,但是还有问题, 如果,不改偏移地址的话,我是没法接收2048字节长度的 包的阿,改动后可以接收2048字节的数据包,但是 我测试驱动的时候发现,如果我每个包都是正好2048字节 长度,那测量出的传输率就高,如果不是,比如每个1024字节,传输率就低,前者比后者大约高出50%。 |
|
11楼#
发布于:2003-03-24 10:36
我就很奇怪!!!!你改了人家寄存器的偏移地址,从道理上讲就是一点都不通的,你把标准都改变了,还觉得对吗?就像你的车速上不去,你把自己的车牌变了,有用吗?不仅没用,警察还得找你。一个道理。
你的包长改变了,可能是设置了别的寄存器。 再说,“如果我每个包都是正好2048字节长度,那测量出的传输率就高,如果不是,比如每个1024字节,传输率就低,前者比后者大约高出50%。”这不是废话吗! |
|
12楼#
发布于:2003-03-24 17:25
?不是亚,如果你把每次发送的包长改成 2048,如果不把csr中的response偏址 做相应改动的话,接收会有问题啊 比如按照csr.h中的设置,response只有1024 字节的地址返回,如果我发送2048,那 我接收到的response最长就只有1024字节 我就没法发2048字节的包了啊, 而且生成驱动的时候,都需要访问控制/状态寄存器 csr的呀,这跟标准有关系吗? 标准有规定csr.h中的偏址不能改动? |
|
13楼#
发布于:2003-05-04 18:56
//--------------------------------------------------------------------------
// Routine Name: void ATwriteRequestBlock( AsynTransParameter *Parameter) // // Description: // Send Asynchronous write request Block // // Input: // asynchronous transmit parameter // // Output: // None // // Return: // None // //-------------------------------------------------------------------------- // Revision History: // 06/06/02 Created, Weifeng. Ge //-------------------------------------------------------------------------- void P1394::ATwriteRequestBlock(AsynTransParameter *Parameter){ BlockTransmitHeader Packet; Packet.First.Quad=0; Packet.First.Signals.tCode=Parameter->tCode; Packet.First.Signals.rt=Parameter->rt; Packet.First.Signals.tLabel=Parameter->tLabel; Packet.First.Signals.spd=Parameter->spd;//你要要作不同速度的传送,只要改变这个参数就行了,当然前提是你的Phy 支持S400。 Packet.First.Signals.scrBusID=Parameter->scrBus; Packet.Second.Quad=0; Packet.Second.Signals.destinationID=Parameter->DestinationID; Packet.Second.Signals.destinationOffsetHigh=Parameter->DestinAddrHi; Packet.destinationOffsetLow=Parameter->DestinAddrLo; Packet.Fourth.Quad=0; Packet.Fourth.Signals.dataLength=Parameter->Datalength; if (dev->ATRQ_descriptor) free_to_mem_pool(dev->ATRQ_descriptor,128*sizeof(char)); dev->ATRQ_descriptor=(UCHAR far *)alloc_from_mem_pool(128*sizeof(char),16,0); OUTPUT_MORE_IMMEDIATE_DESCRIPT far* ATRQ_DESCRIPT_a=(OUTPUT_MORE_IMMEDIATE_DESCRIPT far *)dev->ATRQ_descriptor; OUTPUT_LAST_DESCRIPT far *ATRQ_DESCRIPT_b=(OUTPUT_LAST_DESCRIPT far *)(dev->ATRQ_descriptor+32); //Change the linear address to physical address ULONG ATRQ_DA_BUFFER = LinearToReal(ATRQ_DESCRIPT_a); ULONG ATRQ_DB_BUFFER = LinearToReal(ATRQ_DESCRIPT_b); ULONG PayloadBuffer = LinearToReal(Parameter->BlockAddr); //Fill the first descriptor ATRQ_DESCRIPT_a->FirstQuad.Quad= 0; ATRQ_DESCRIPT_a->FirstQuad.Bitmap.command= 0; ATRQ_DESCRIPT_a->FirstQuad.Bitmap.key = 2; ATRQ_DESCRIPT_a->FirstQuad.Bitmap.b = 0; ATRQ_DESCRIPT_a->FirstQuad.Bitmap.reqCount=16; ATRQ_DESCRIPT_a->resvered0= 0; ATRQ_DESCRIPT_a->resvered1= 0; ATRQ_DESCRIPT_a->FourthQuad.Quad.ulQuadlet= 0; ATRQ_DESCRIPT_a->FourthQuad.Bitmap.timeStamp= 0; //write the first quatlet to the descriptor head field ATRQ_DESCRIPT_a->First_Quadlet.ulQuadlet=Packet.First.Quad; ATRQ_DESCRIPT_a->Sceond_Quadlet.ulQuadlet=Packet.Second.Quad; ATRQ_DESCRIPT_a->Third_Quadlet.ulQuadlet=Packet.destinationOffsetLow; ATRQ_DESCRIPT_a->Fourth_Quadlet.ulQuadlet=Packet.Fourth.Quad; //Full second descriptor ATRQ_DESCRIPT_b->FirstQuad.Quad=0; ATRQ_DESCRIPT_b->FirstQuad.Bitmap.command=1; ATRQ_DESCRIPT_b->FirstQuad.Bitmap.key=0; ATRQ_DESCRIPT_b->FirstQuad.Bitmap.p=1; ATRQ_DESCRIPT_b->FirstQuad.Bitmap.i=3; ATRQ_DESCRIPT_b->FirstQuad.Bitmap.b=3; ATRQ_DESCRIPT_b->FirstQuad.Bitmap.reqCount=Parameter->Datalength; ATRQ_DESCRIPT_b->dataAddress=PayloadBuffer; ATRQ_DESCRIPT_b->ThirdQuad.BanchAddress=ATRQ_DB_BUFFER; ATRQ_DESCRIPT_b->ThirdQuad.Bitmap.Z=0; ATRQ_DESCRIPT_b->FourthQuad.Bitmap.xferStatus=0; LLC_REG->LLCATRQCommandPtr.Quad.ulQuadlet=ATRQ_DA_BUFFER; LLC_REG->LLCATRQCommandPtr.Reg.Z=3; MEM_WRITE_DWORD(OHCI_SEG,OHCI_OFF+OHCI_ATRQCommandPtr_Reg,LLC_REG->LLCATRQCommandPtr.Quad.ulQuadlet); //clear the control register MEM_WRITE_DWORD(OHCI_SEG,OHCI_OFF+OHCI_ATRQControl_CReg,Interrupt_Clear); LLC_REG->LLCATRQContextControlSet.Reg.run=1; MEM_WRITE_DWORD(OHCI_SEG,OHCI_OFF+OHCI_IntEvent_CReg,Interrupt_Clear); while(!(MEM_READ_DWORD(OHCI_SEG,OHCI_OFF+OHCI_IntEvent_SReg)&0x100000l)); MEM_WRITE_DWORD(OHCI_SEG,OHCI_OFF+OHCI_ATRQControl_SReg,LLC_REG->LLCATRQContextControlSet.Quad.ulQuadlet); Delay(1); //in 125 us setbit(Transmit_status,writeRequestBlock); } 不多说了,好好研究一下这个函数,相信会对你有帮助!! |
|