怎样理解这一个结构体?

发布于 2022-09-22 13:03:09 字数 4617 浏览 20 评论 0

以下是一个设置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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

短暂陪伴 2022-09-29 13:03:09

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

荒人说梦 2022-09-29 13:03:09

谢谢,那为什么第一种叫Setting by channel number ,第二种叫Setting by frequency - search the table ??

梦亿 2022-09-29 13:03:09
  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的兄弟说的很详细了。

妄司 2022-09-29 13:03:09

原帖由 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的查找来确定信道了。

柒夜笙歌凉 2022-09-29 13:03:09

谢谢!终于明白了!!

巡山小妖精 2022-09-29 13:03:09

原帖由 todayrw 于 2008-10-28 09:39 发表
谢谢!终于明白了!!

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

孤独患者 2022-09-29 13:03:09

也想给兄弟你啊,但不知道怎么给,告诉我一下

自此以后,行同陌路 2022-09-29 13:03:09

原帖由 todayrw 于 2008-10-28 12:35 发表
也想给兄弟你啊,但不知道怎么给,告诉我一下

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

失去的东西太少 2022-09-29 13:03:09

感动!谢了!dreamice兄

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文