当前位置: 技术问答>linux和unix
有一段无线网卡驱动程序看不懂,请高手指点!
来源: 互联网 发布时间:2016-05-08
本文导语: 我所做的工作是一个嵌入式系统中进行无线上网卡的驱动程序开发,该系统的DSP为Philips 的TM1300,网卡的MAC芯片型号为RTL8185,射频芯片为RTL8225,驱动程序是在Linux下用C语言开发的,下面是无线网卡驱动程序中的射频...
我所做的工作是一个嵌入式系统中进行无线上网卡的驱动程序开发,该系统的DSP为Philips 的TM1300,网卡的MAC芯片型号为RTL8185,射频芯片为RTL8225,驱动程序是在Linux下用C语言开发的,下面是无线网卡驱动程序中的射频初始化部分的程序片断:
……
write_rtl8225(dev, 0xd, 0x6db); //向偏移地址为0xd的射频芯片寄存器写数据
mdelay(1); //让CPU空转1毫秒
write_rtl8225(dev, 0xe, 0x29); //向偏移地址为0xe的射频芯片寄存器写数据
mdelay(1); //让CPU空转1毫秒
write_rtl8225(dev, 0xf, 0x914); //向偏移地址为0xf的射频芯片寄存器写数据
if(priv->card_type == USB) //若网卡使用的是USB插口
{
force_pci_posting(dev);//***这个函数里面只有一个读寄存器的操作
mdelay(100); //让CPU空转100毫秒
}
……
现在我想请教的是:
(1) 为什么每一个写寄存器操作之后都要有一个停顿,即使用mdelay()函数让CPU空转,这些停顿的依据是什么?
(2) 从上面的程序片断中可以看出每次停顿的时间也不尽相同,有时候停1毫秒(mdelay(1)),有时候停100毫秒(mdelay(100)),我想请问停顿的具体时间怎么确定?它跟那些因素有关?跟DSP芯片的频率有关吗?
请各位高手赐教,不胜感激!
……
write_rtl8225(dev, 0xd, 0x6db); //向偏移地址为0xd的射频芯片寄存器写数据
mdelay(1); //让CPU空转1毫秒
write_rtl8225(dev, 0xe, 0x29); //向偏移地址为0xe的射频芯片寄存器写数据
mdelay(1); //让CPU空转1毫秒
write_rtl8225(dev, 0xf, 0x914); //向偏移地址为0xf的射频芯片寄存器写数据
if(priv->card_type == USB) //若网卡使用的是USB插口
{
force_pci_posting(dev);//***这个函数里面只有一个读寄存器的操作
mdelay(100); //让CPU空转100毫秒
}
……
现在我想请教的是:
(1) 为什么每一个写寄存器操作之后都要有一个停顿,即使用mdelay()函数让CPU空转,这些停顿的依据是什么?
(2) 从上面的程序片断中可以看出每次停顿的时间也不尽相同,有时候停1毫秒(mdelay(1)),有时候停100毫秒(mdelay(100)),我想请问停顿的具体时间怎么确定?它跟那些因素有关?跟DSP芯片的频率有关吗?
请各位高手赐教,不胜感激!
|
外设的CPU或硬件一般都比较慢,对其操作操作太快是不行的。 另外,加上延时可以保证对硬件的操作顺序。
要用多长的延时,要看你的外设硬件的处理速度,可以实验来确定,如果不影响效率的,长一点应该也没有关系
要用多长的延时,要看你的外设硬件的处理速度,可以实验来确定,如果不影响效率的,长一点应该也没有关系
|
datasheet上一般都会有注明哪些寄存器需要延时多长时间的
|
在嵌入式设备上,我们经常也会用到“延迟”。有时候这些延迟不一定在
datasheet上说明,但你会发现加了就能跑,不加就不行。
简单来说,加多少延迟,有时候是经过实验得出的结果,写代码的人当然希望这个
时间越少越好。 你可以检查一下, 这组寄存器是不是 只会被调用一次(譬如
初始化的时候用到,或者不是在传输数据的时候用到),如果是那样的话,不会影响
性能。
datasheet上说明,但你会发现加了就能跑,不加就不行。
简单来说,加多少延迟,有时候是经过实验得出的结果,写代码的人当然希望这个
时间越少越好。 你可以检查一下, 这组寄存器是不是 只会被调用一次(譬如
初始化的时候用到,或者不是在传输数据的时候用到),如果是那样的话,不会影响
性能。
|
一般对模拟部分的操作都需要点延时!!