怎样理解这一个结构体?
以下是一个设置wifi usb dongle的channel的函数
zd1205_ioctl_setfreq(struct net_device *dev, struct iw_freq *frq)
{
struct zd1205_private *macp = dev->priv;
int chan = -1;
int fflag=0;
if ( (frq->e == 0) && (frq->m <= 1000) ) {
/* Setting by channel number */
chan = frq->m;
fflag=1;
} else {
/* Setting by frequency - search the table */
int mult = 1;
int i;
for (i = 0; i < (6 - frq->e); i++)
mult *= 10;
if(PURE_A_MODE != mMacMode ) {
for (i = 0; i < NUM_CHANNELS; i++)
if (frq->m == (channel_frequency * mult)) {
chan = i+1;
fflag=1;
break;
}
}
else {
for (i = 0; i < NUM_CHANNELS_11A; i++)
if (frq->m == (channel_frequency_11A[i*2+1] * mult)) {
chan = channel_frequency_11A[i*2];
fflag=1;
break;
}
}
}
。。。}
以下是结构体iw_freq的定义
/*
* A frequency
* For numbers lower than 10^9, we encode the number in 'm' and
* set 'e' to 0
* For number greater than 10^9, we divide it by the lowest power
* of 10 to get 'm' lower than 10^9, with 'm'= f / (10^'e')...
* The power of 10 is in 'e', the result of the division is in 'm'.
*/
struct iw_freq
{
__s32 m; /* Mantissa */
__s16 e; /* Exponent */
__u8 i; /* List index (when in range struct) */
__u8 flags; /* Flags (fixed/auto) */
};
问题就在这个iw_freq里,上面那段英文怎么都看不懂,所以函数zd1205_ioctl_setfreq()里的if语句也看不懂。
有哪位高手能点拨一下?!万分感谢!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
以下是结构体iw_freq的定义
/*
* A frequency
* For numbers lower than 10^9, we encode the number in 'm' and
* set 'e' to 0
* For number greater than 10^9, we divide it by the lowest power
* of 10 to get 'm' lower than 10^9, with 'm'= f / (10^'e')...
* The power of 10 is in 'e', the result of the division is in 'm'.
*/
这个具体驱动尝试帮你翻译一下:
1、如果频率f<10的9次方,就把m置成f的值,并把e置成0;
2、如果频率f>10的9次方,就把 f 的值除以 10 的e次方,这里的e是对应数据结构中的变量值, 也就是 the power of 10(对应到代码中,e=几,对应的the power of 10就是10的几次方), 除完后的值保存在 m 中(这时的m < 10的9次方)。
这里的把m置成f的值以及第二种情况置成除法后的值应该理解成按一定规则编码成一个值保存在m中,因为对应if语句的意思应该这个值是小于等于1000的。
所以对应于你说的if语句,前半部分就是指的第1种情况,else对应的就是第2种情况了。
你就当这个是具体的硬件规范要求或者说规范就可以了,碰到时就这么用就OK了。
谢谢,那为什么第一种叫Setting by channel number ,第二种叫Setting by frequency - search the table ??
复制代码
单从上面的结构体的解释即程序中,看不出结构体另两个参数的具体用做什么目的。结构体的解释(英文翻译)LS的兄弟说的很详细了。
在freq小于10的9次方的情况下,m实际上就是channel number了——即直接指定了信道;对于freq大与10的9次方的情况,channel的指定需要根据freq表来确定,所以要search 表channel_frequency_11A[]。
LZ可以想象一下,对于freq小于10的9次方的情况,信道的确定是很容易的,固定的公示可以算出来;但是大于的情况就显得要复杂些了,因为没有既定的公示计算,所以把对应的值存放于一个表中,只好通过freq的查找来确定信道了。
谢谢!终于明白了!!
呵呵,分给2楼的兄弟了啊
俺也没份啊。
也想给兄弟你啊,但不知道怎么给,告诉我一下
哈哈,我经常充当绿叶,没事了,你的分这么少,兄弟加油,努力进步!
感动!谢了!dreamice兄