nouel
驱动牛犊
驱动牛犊
  • 注册日期2003-02-25
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2173回复:13

请教大牛们一个问题,急!

楼主#
更多 发布于:2003-03-05 11:39



           如果我想要把1394卡设成S400的
           除了改变csr.h里面的参数以外,还需要做些别的
           什么改动?另外,csr.h里面有哪些参数需要修改?
ARRON
驱动老牛
驱动老牛
  • 注册日期2002-03-18
  • 最后登录2010-05-02
  • 粉丝0
  • 关注0
  • 积分28分
  • 威望21点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-03-05 23:38
这是个甚么文件呀? :D
nouel
驱动牛犊
驱动牛犊
  • 注册日期2003-02-25
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-03-06 09:15





           啊,忘了说明了,是在linux下面设置
           1394卡按照哪种速率工作的方法 :)
ARRON
驱动老牛
驱动老牛
  • 注册日期2002-03-18
  • 最后登录2010-05-02
  • 粉丝0
  • 关注0
  • 积分28分
  • 威望21点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-03-06 10:06
你的意思是只让它工作在400M下?
nouel
驱动牛犊
驱动牛犊
  • 注册日期2003-02-25
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-03-06 19:23




           是呀,这样能做到吗?
ARRON
驱动老牛
驱动老牛
  • 注册日期2002-03-18
  • 最后登录2010-05-02
  • 粉丝0
  • 关注0
  • 积分28分
  • 威望21点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-03-07 10:49
可是总线配置时的各种包都是以基本速率传输的呀
evergreen
驱动牛犊
驱动牛犊
  • 注册日期2002-04-16
  • 最后登录2007-09-24
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
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 */
evergreen
驱动牛犊
驱动牛犊
  • 注册日期2002-04-16
  • 最后登录2007-09-24
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
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 */
nouel
驱动牛犊
驱动牛犊
  • 注册日期2003-02-25
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-03-10 09:30
我觉得不用改什么。只要你的节点有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
*/
#define CSR_FCP_END               0x1500
#define CSR_TOPOLOGY_MAP          0x1600
#define CSR_TOPOLOGY_MAP_END      0x1A00
#define CSR_SPEED_MAP             0x2600
#define CSR_SPEED_MAP_END         0x3600



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 */


这样改就可以吗?
evergreen
驱动牛犊
驱动牛犊
  • 注册日期2002-04-16
  • 最后登录2007-09-24
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
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开始就都是初始元件空间了)。
nouel
驱动牛犊
驱动牛犊
  • 注册日期2003-02-25
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-03-18 18:53
如果你的卡的能力就不到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开始就都是初始元件空间了)。




         这个我知道了,但是还有问题,
         如果,不改偏移地址的话,我是没法接收2048字节长度的
         包的阿,改动后可以接收2048字节的数据包,但是
         我测试驱动的时候发现,如果我每个包都是正好2048字节
         长度,那测量出的传输率就高,如果不是,比如每个1024字节,传输率就低,前者比后者大约高出50%。
evergreen
驱动牛犊
驱动牛犊
  • 注册日期2002-04-16
  • 最后登录2007-09-24
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2003-03-24 10:36
我就很奇怪!!!!你改了人家寄存器的偏移地址,从道理上讲就是一点都不通的,你把标准都改变了,还觉得对吗?就像你的车速上不去,你把自己的车牌变了,有用吗?不仅没用,警察还得找你。一个道理。
你的包长改变了,可能是设置了别的寄存器。
再说,“如果我每个包都是正好2048字节长度,那测量出的传输率就高,如果不是,比如每个1024字节,传输率就低,前者比后者大约高出50%。”这不是废话吗!
nouel
驱动牛犊
驱动牛犊
  • 注册日期2003-02-25
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2003-03-24 17:25





            ?不是亚,如果你把每次发送的包长改成
            2048,如果不把csr中的response偏址
            做相应改动的话,接收会有问题啊
            比如按照csr.h中的设置,response只有1024
            字节的地址返回,如果我发送2048,那
            我接收到的response最长就只有1024字节
            我就没法发2048字节的包了啊,
            而且生成驱动的时候,都需要访问控制/状态寄存器
            csr的呀,这跟标准有关系吗?
            标准有规定csr.h中的偏址不能改动?
cathyLH
驱动牛犊
驱动牛犊
  • 注册日期2002-04-04
  • 最后登录2004-08-28
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
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);
}
不多说了,好好研究一下这个函数,相信会对你有帮助!!
游客

返回顶部