龙芯开源社区

 找回密码
 注册新用户(newuser)
楼主: alexzyy

2f 的频率调节 --降频测试+超频

[复制链接]
发表于 2008-8-1 20:53:45 | 显示全部楼层
我在想,系统时钟难道用的RTC吗?使用cpu tick计时的吗?
发表于 2008-8-1 21:43:30 | 显示全部楼层
也就是说楼主成功降频了。

顺便把超频也搞出就好了
 楼主| 发表于 2008-8-2 15:23:28 | 显示全部楼层
看了本论坛上提供的手册,猜测应该可以通过读写时钟芯片的I2C寄存器方式来修改CLOCK
设备地址D2,BYTE 5的5:6可以控制输出频率66/71/83MH,可是换了几个版本的内核发现/sys/bus/i2c目录里什么也没有,试了一下编译一个I2C-DEV模块可是安装的时候出错了:
Aug  2 15:31:55 se kernel: i2c_dev: no version for "struct_module" found: kernel tainted.
Aug  2 15:31:55 se kernel: i2c /dev entries driver
Aug  2 15:31:55 se kernel: /usr/src/linux/drivers/i2c/i2c-dev.c: Driver Initialisation failed
发表于 2008-8-2 22:59:42 | 显示全部楼层
支持降频测试,意义重大!
   对于笔记本应用,在进程数少的时候内核可以作出降频提示,或者自动调节cpu主频,达到最优化的能耗控制,忙时流汗,闲时蓄势,应变自如。让cpu在高速度下空跑或者多余地跳跃,那些大量流过门电路的空耗触发电流会产生不必要的能耗,导致热损。 变频cpu同变频电机具有同样的道理。
   让龙芯cpu工作在400MHz的频率,相当于目前PDA的速度,限制活动进程的数量有可能用于对电能控制要求苛刻的移动嵌入式设备上。像palm PDA就是限制进程数量,使用户的体验简洁及时,类DOS工作方式,龙芯电脑同样不一定都得运行unix模式的操作系统。

[ 本帖最后由 strongchina 于 2008-8-6 10:03 编辑 ]
 楼主| 发表于 2008-8-4 20:54:19 | 显示全部楼层
时钟调整,开始想可能和别的PC机一样是晶振+8254计数器来产生时钟中断,可试了一下修改8254计数器没有效果
再翻2F手册,看到有一个COUNT计数器和COMPARE寄存器,也可以用来产生中断,这个是采用CPU时钟的,如果真的是用这个产生时间中断,如果CPU时钟变慢,估计系统时间也会变慢,然后从源码里翻出来arch/mips/kernel 里的time.c,发现回写COMPARE寄存器的函数,c0_timer_ack,依赖于cycles_per_jiffy,而这个值又是从mips_htp_freq计算来的,可以从godson/2feva/setup.c中看出来, 可惜的是这个符号好象没有EXPORT,没法在新写的模块改写,总是提示符号未找到....
发表于 2008-8-5 09:25:57 | 显示全部楼层
原帖由 alexzyy 于 2008-8-4 20:54 发表
时钟调整,开始想可能和别的PC机一样是晶振+8254计数器来产生时钟中断,可试了一下修改8254计数器没有效果
再翻2F手册,看到有一个COUNT计数器和COMPARE寄存器,也可以用来产生中断,这个是采用CPU时钟的,如 ...


时钟应该可以分为HPT和RTC两种,前者用CPU时钟计时(变频后有变),后者用主板上的时钟源(变频后不变)。

龙芯上应该使用的前一种,现在应该想办法怎样在变频时改HPT时钟。
下面是arch/mips/kernel/time.c部分代码,龙芯走的路径用颜色标出:
374         /* Choose appropriate high precision timer routines.  */
375         if (!cpu_has_counter && !clocksource_mips.read)
376                 /* No high precision timer -- sorry.  */
377                 clocksource_mips.read = null_hpt_read;
378         else if (!mips_hpt_frequency && !mips_timer_state) {
379                 /* A high precision timer of unknown frequency.  */
380                 if (!clocksource_mips.read)
381                         /* No external high precision timer -- use R4k.  */
382                         clocksource_mips.read = c0_hpt_read;
383         } else {
384                 /* We know counter frequency.  Or we can get it.  */
385                 if (!clocksource_mips.read) {
386                         /* No external high precision timer -- use R4k.  */
387                         clocksource_mips.read = c0_hpt_read;
388
389                         if (!mips_timer_state) {
390                                 /* No external timer interrupt -- use R4k.  */
391                                 mips_timer_ack = c0_timer_ack;
392                                 /* Calculate cache parameters.  */
393                                 cycles_per_jiffy =
394                                         (mips_hpt_frequency + HZ / 2) / HZ;
395                                 /*
396                                  * This sets up the high precision
397                                  * timer for the first interrupt.
398                                  */
399                                 c0_hpt_timer_init();
400                         }
401                 }
402                 if (!mips_hpt_frequency)
403                         mips_hpt_frequency = calibrate_hpt();
不知怎样改才能变频不不变时钟,可能可以改mips_hpt_frequency,然后重新设置393-399行。
 楼主| 发表于 2008-8-5 09:42:25 | 显示全部楼层
在考虑修改源 代码,将mips_hpt_frequency EXPORT出来,重编译内核。这样在新的模块里就可以看到这个变量,变频时修改一下它的值,不知道行不行的通
发表于 2008-8-5 20:44:29 | 显示全部楼层
搜到一个文档:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册新用户(newuser)

x
发表于 2008-8-5 22:22:56 | 显示全部楼层

回复 #19 alexzyy 的帖子

比较好的做法还是用外部的时钟源,这样动态变频还可以用于节能,在cpu_idle把时钟设为0,初步测试比较闲的时候CPU的功耗可以省掉高达70%

2.6.24后就有相关的支持了
发表于 2008-8-5 22:24:46 | 显示全部楼层
原帖由 foxsen 于 2008-8-5 22:22 发表
比较好的做法还是用外部的时钟源,这样动态变频还可以用于节能,在cpu_idle把时钟设为0,初步测试比较闲的时候CPU的功耗可以省掉高达70%

2.6.24后就有相关的支持了

但是,如果用外部时钟源的话,高精度时钟就不能用了。

本版积分规则

小黑屋|手机版|Archiver|Lemote Inc.  

GMT+8, 2019-8-23 22:23 , Processed in 0.197624 second(s), 18 queries .

快速回复 返回顶部 返回列表