免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4283 | 回复: 11
打印 上一主题 下一主题

怎样理解这一个结构体? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-10-27 23:12 |只看该作者 |倒序浏览
5可用积分
以下是一个设置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语句也看不懂。

有哪位高手能点拨一下?!万分感谢!

最佳答案

查看完整内容

以下是结构体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、如果频率f10的9次 ...

论坛徽章:
0
2 [报告]
发表于 2008-10-27 23:12 |只看该作者

回复 #1 todayrw 的帖子

以下是结构体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了。

论坛徽章:
0
3 [报告]
发表于 2008-10-28 09:07 |只看该作者
谢谢,那为什么第一种叫Setting by channel number ,第二种叫Setting by frequency - search the table ??

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
4 [报告]
发表于 2008-10-28 09:17 |只看该作者

  1. zd1205_ioctl_setfreq(struct net_device *dev, struct iw_freq *frq)
  2. {
  3.         struct zd1205_private *macp = dev->priv;
  4.         int chan = -1;
  5.         int fflag=0;

  6. if ( (frq->e == 0) && (frq->m <= 1000) ) { [color=Red]/* 如果freq小于10的9次方,e ==0;并且m为编码后的数据。 后面视具体的操作了*/[/color]
  7.                 /* Setting by channel number */
  8.                 chan = frq->m;
  9.                 fflag=1;
  10.         } else {[color=Red] /* 这里是freq大于10的9次方的情况,为了使m比10的9次方小,所以用 'm'= f / (10^'e'), e在这里是程序里设定的一个指数;实际上m也是作为存放编码后的值的 */[/color]
  11.                 /* Setting by frequency - search the table */
  12.                 int mult = 1;
  13.                 int i;

  14.                 for (i = 0; i < (6 - frq->e); i++)
  15.                         mult *= 10;

  16.                 if(PURE_A_MODE != mMacMode ) {
  17.                         for (i = 0; i < NUM_CHANNELS; i++)
  18.                                 if (frq->m == (channel_frequency * mult)) {
  19.                                         chan = i+1;
  20.                                         fflag=1;
  21.                                         break;
  22.                                 }
  23.                 }
  24.                 else {
  25.                         for (i = 0; i < NUM_CHANNELS_11A; i++)
  26.                     if (frq->m == (channel_frequency_11A[i*2+1] * mult)) {
  27.                         chan = channel_frequency_11A[i*2];
  28.                                         fflag=1;
  29.                                         break;
  30.                                 }
  31.                 }

  32.         }
  33. 。。。}
复制代码


单从上面的结构体的解释即程序中,看不出结构体另两个参数的具体用做什么目的。结构体的解释(英文翻译)LS的兄弟说的很详细了。

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
5 [报告]
发表于 2008-10-28 09:23 |只看该作者
原帖由 todayrw 于 2008-10-28 09:07 发表
谢谢,那为什么第一种叫Setting by channel number ,第二种叫Setting by frequency - search the table ??


在freq小于10的9次方的情况下,m实际上就是channel number了——即直接指定了信道;对于freq大与10的9次方的情况,channel的指定需要根据freq表来确定,所以要search 表channel_frequency_11A[]。

LZ可以想象一下,对于freq小于10的9次方的情况,信道的确定是很容易的,固定的公示可以算出来;但是大于的情况就显得要复杂些了,因为没有既定的公示计算,所以把对应的值存放于一个表中,只好通过freq的查找来确定信道了。

论坛徽章:
0
6 [报告]
发表于 2008-10-28 09:39 |只看该作者
谢谢!终于明白了!!

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
7 [报告]
发表于 2008-10-28 10:08 |只看该作者
原帖由 todayrw 于 2008-10-28 09:39 发表
谢谢!终于明白了!!



呵呵,分给2楼的兄弟了啊
俺也没份啊。

论坛徽章:
0
8 [报告]
发表于 2008-10-28 12:35 |只看该作者
也想给兄弟你啊,但不知道怎么给,告诉我一下

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
9 [报告]
发表于 2008-10-28 14:53 |只看该作者
原帖由 todayrw 于 2008-10-28 12:35 发表
也想给兄弟你啊,但不知道怎么给,告诉我一下


哈哈,我经常充当绿叶,没事了,你的分这么少,兄弟加油,努力进步!

论坛徽章:
0
10 [报告]
发表于 2008-10-28 15:06 |只看该作者
感动!谢了!dreamice兄
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP