在AM335x处理器的网络驱动中,文件名称是driver/net/cpsw.c或者driver/net/ethernet/ti/cpsw.c,这个文件中使用到了二个定时器,用于当作interrupt pacing,它所用的定时器编号分别是5和6 ,有如下的宏定义:
#define CPSW_RX_TIMER_REQ 5
#define CPSW_TX_TIMER_REQ 6
现在的问题是能不能将它们修改成:
#define CPSW_RX_TIMER_REQ 4
#define CPSW_TX_TIMER_REQ 7
我修改后测试,网口就不通了,不知道是什么原因?请问有谁清楚这个问题,谢谢!
shixm.zh:
经过自己的努力,最终发现cpsw需要用2个连续编号的定时器,后来来改成Timer4和Timer5,但测试发现发现延时有点偏大,但还能使用,ping大包在12ms左右,如果用Timer6和Timer7,那几乎是不能用的,延时超出1000ms,从这里可以看出,cpsw使用2个定时器来控制收发包,说明这个网络控制器部分在硬件上是否存在着bug?,后来从网上发现的新的驱动,好象已经没有使用定时器这样的硬件资源了。
有没有办法不使用Timer5和Timer6,改成Timer4和Timer7,还需要更一进步的努力,如果有人知道这样的答案,请告诉我,我不胜感激,多谢!
Steven Liu1:
回复 shixm.zh:
你之前使用的SDK版本号或者PSP版本号是多少?
为啥需要修改这个定时器?还是说是为了学习目的?目前实际使用的情况是,我们很少有客户修改这部分的实现代码,一般来说软件上面对于网络驱动的配置,就是三步走,这个帖子里面有说明了:http://www.deyisupport.com/question_answer/dsp_arm/sitara_arm/f/25/t/45981.aspx
shixm.zh:
回复 Steven Liu1:
Hi, Steven Liu
你好,非常感谢你回复,我不确定我的现在用的Linux核是从哪个SDK上移值过来的,但我知道Linux内核的版本是3.1.0,后来我查一下am335x-evm-sdk-src-06.00.00.00这个SDK(内核是3.2.0),虽然网络驱动部分的结构有一点不一样,但同样是有用到了2个定时器,而且也是用的Timer5和Timer6.
我修改的目的是,是因为我的应用设计中设计了要用到Timer5和Timer6二路的PWM输出控制信号,至前一直没有注意到Timer5和Timer6是被网络驱动占用了,不巧的是我的应用设计中刚好用到了这二个定时器,所以才想到想要调整一下网络驱动中二个定时器。
我经过自己的努力,发现网驱动中需要使用2个连续编号的定时器,且只能使用Timer4~Timer7之间,但调测发现,只有Timer5和Timer6的组合效果最佳,网络时延最好,虽然也是有波动的,但通常都在2ms左右,我ping是大包(50000byte/每包),如果修改成Timer4和Timer5网络也能工作,就是时延变大,Ping大包的情况下差不多在12ms左右,如果改成Timer6和Timer7的组合,那几乎是ping不通了,网络时延非常大,差不多是在1000ms以上。
所以我想问为什么这几个不同的定时器,难道相互之间有差异吗?我看了源程序,好象没有看到有专门针对Timer5和Timer6进行设置的地方,所以不清楚有什么肯体的要求没有?
所以我现在最好的方法是将网络驱动中的二个定时器修改成Timer4和Timer7,否则我得改硬件设计。
另外我又看了高版本的SDK,目前网上最新的SDK8.0,在它的驱动中已经没有使用了定时器,是不是这样的?
再次感谢Steven Liu,希望 能帮我找到好的解决办法。
shixm.zh:
回复 shixm.zh:
SDK8.0也有用到定时器,但用的是系统使用的定时器,好象没有再使用Timer5和Timer7。