tweaks from 2008 (gpsp09-2xb_3)
[gpsp.git] / gp2x / cpu_speed.c
1
2 /*  CPU/LCD/RAM-Tuner for GP2X Version 2.0
3     Copyright (C) 2006 god_at_hell
4     original CPU-Overclocker (c) by Hermes/PS2Reality
5   the gamma-routine was provided by theoddbot
6
7     This program is free software; you can redistribute it and/or modify
8     it under the terms of the GNU General Public License as published by
9     the Free Software Foundation; either version 2 of the License, or
10     (at your option) any later version.
11
12     This program is distributed in the hope that it will be useful,
13     but WITHOUT ANY WARRANTY; without even the implied warranty of
14     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15     GNU General Public License for more details.
16
17     You should have received a copy of the GNU General Public License
18     along with this program; if not, write to the Free Software
19     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
20
21 */
22
23 #include <stdio.h>
24 #include <stdlib.h>
25 #include <string.h>
26 #include <sys/types.h>
27 #include <sys/stat.h>
28 #include <sys/mman.h>
29 #include <fcntl.h>
30 #include <math.h>
31 #include <time.h>
32 #include <unistd.h>
33
34 #include "display.h"
35 #include "cpuctrl.h"
36 #include "gp2xminilib.h"
37 #include "speedtest.h"
38 #include "cmdline.h"
39 #include "daemon.h"
40
41 int cpuspeed_exit = 0;
42
43 unsigned COLORFONDO=0xB00000; // background-color
44 unsigned WHITE=0xFFFFFF;
45 unsigned TEXTBACK=0x0000B0;
46
47 unsigned gp2x_nKeys=0;
48 int oldtime=0;
49 char pageshift;
50 short menupoint;
51 unsigned char cad[256];
52 short cpusettings[2],dispsettings[3],ramsettings[10];
53 extern int daemonsettings[8];
54 extern unsigned MDIV,PDIV,SCALE;
55
56 void cleardisp()
57 {
58     ClearScreen(COLORFONDO);
59     sprintf(cad,"gpSP2X v0.9008 with CPU_SPEED");
60     v_putcad(1,1,WHITE,COLORFONDO,cad);
61     v_putcad(28,5,WHITE,COLORFONDO,"Item Help");
62     v_putcad(2,26,WHITE,COLORFONDO,"Start:Quit Stick:UP/DOWN");
63     
64     DrawBox(WHITE);
65 }
66
67 void itemhelp(char item[])
68 {
69   if(strcmp(item, "menu") == 0)
70   {
71     v_putcad(26,8,0xffffff,COLORFONDO,"Enter submenu");
72     v_putcad(26,9,0xffffff,COLORFONDO,"with B.");
73   }
74   if(strcmp(item, "cpuclk") == 0)
75   {
76     v_putcad(26,8,0xffffff,COLORFONDO,"Choose a");
77     v_putcad(26,9,0xffffff,COLORFONDO,"clockspeed");
78     v_putcad(26,10,0xffffff,COLORFONDO,"with R/L or");
79     v_putcad(26,11,0xffffff,COLORFONDO,"Vol UP/Down.");
80     v_putcad(26,13,0xffffff,COLORFONDO,"Valid speeds");
81     v_putcad(26,14,0xffffff,COLORFONDO,"are:");
82     v_putcad(26,15,0xffffff,COLORFONDO,"33 to 340Mhz");
83   }
84   if(strcmp(item, "cpudiv") == 0)
85   {
86     v_putcad(26,8,0xffffff,COLORFONDO,"Choose with");
87     v_putcad(26,9,0xffffff,COLORFONDO,"R/L.");
88     v_putcad(26,11,0xffffff,COLORFONDO,"The CPU-clock");
89     v_putcad(26,12,0xffffff,COLORFONDO,"will be");
90     v_putcad(26,13,0xffffff,COLORFONDO,"divided by");
91     v_putcad(26,14,0xffffff,COLORFONDO,"this value.");
92     v_putcad(26,16,0xffffff,COLORFONDO,"Valid values");
93     v_putcad(26,17,0xffffff,COLORFONDO,"are from");
94     v_putcad(26,18,0xffffff,COLORFONDO,"1 to 8");
95   }
96   if(strcmp(item, "test") == 0)
97   {
98     v_putcad(26,8,0xffffff,COLORFONDO,"Change with");
99     v_putcad(26,9,0xffffff,COLORFONDO,"R/L.");
100     v_putcad(26,11,0xffffff,COLORFONDO,"The test");
101     v_putcad(26,12,0xffffff,COLORFONDO,"checks how");
102     v_putcad(26,13,0xffffff,COLORFONDO,"high you can");
103     v_putcad(26,14,0xffffff,COLORFONDO,"clock the");
104     v_putcad(26,15,0xffffff,COLORFONDO,"CPU.");
105     v_putcad(26,17,0xffffff,COLORFONDO,"Check the");
106     v_putcad(26,18,0xffffff,COLORFONDO,"Readme for");
107     v_putcad(26,19,0xffffff,COLORFONDO,"more infos.");
108   }
109   if(strcmp(item, "gotest") == 0)
110   {
111     v_putcad(26,8,0xffffff,COLORFONDO,"Start the");
112     v_putcad(26,9,0xffffff,COLORFONDO,"test with B.");
113   }
114   if(strcmp(item, "clockgen") == 0)
115   {
116     v_putcad(26,8,0xffffff,COLORFONDO,"Change the");
117     v_putcad(26,9,0xffffff,COLORFONDO,"clockgen with");
118     v_putcad(26,10,0xffffff,COLORFONDO,"R/L.");
119     v_putcad(26,12,0xffffff,COLORFONDO,"FPLL is for");
120     v_putcad(26,13,0xffffff,COLORFONDO,"FW 1.0");
121     v_putcad(26,14,0xffffff,COLORFONDO,"UPLL for the");
122     v_putcad(26,15,0xffffff,COLORFONDO,"rest.");
123   }
124   if(strcmp(item, "timing") == 0)
125   {
126     v_putcad(26,8,0xffffff,COLORFONDO,"Choose the");
127     v_putcad(26,9,0xffffff,COLORFONDO,"LCD-Timing");
128     v_putcad(26,10,0xffffff,COLORFONDO,"with R/L.");
129     v_putcad(26,12,0xffffff,COLORFONDO,"Valid are");
130     v_putcad(26,13,0xffffff,COLORFONDO,"values from");
131     v_putcad(26,14,0xffffff,COLORFONDO,"-20 to 36");
132     v_putcad(26,15,0xffffff,COLORFONDO,"for FPLL");
133     v_putcad(26,16,0xffffff,COLORFONDO,"and -6 to 10");
134     v_putcad(26,17,0xffffff,COLORFONDO,"for UPLL");
135   }
136   if(strcmp(item, "gamma") == 0)
137   {
138     v_putcad(26,8,0xffffff,COLORFONDO,"Change gamma");
139     v_putcad(26,9,0xffffff,COLORFONDO,"with R/L or");
140     v_putcad(26,10,0xffffff,COLORFONDO,"Vol UP/DOWN");
141     v_putcad(26,12,0xffffff,COLORFONDO,"Valid are");
142     v_putcad(26,13,0xffffff,COLORFONDO,"values from");
143     v_putcad(26,14,0xffffff,COLORFONDO,"0.01 to 10.00");
144   }
145   if(strcmp(item, "CAS") == 0)
146   {
147     v_putcad(26,8,0xffffff,COLORFONDO,"Choose the");
148     v_putcad(26,9,0xffffff,COLORFONDO,"CAS Latency");
149     v_putcad(26,10,0xffffff,COLORFONDO,"with R/L");
150     v_putcad(26,12,0xffffff,COLORFONDO,"Valid are");
151     v_putcad(26,13,0xffffff,COLORFONDO,"2 or 3 cycles");
152     v_putcad(26,15,0xffffff,COLORFONDO,"Delay between");
153     v_putcad(26,16,0xffffff,COLORFONDO,"registration");
154     v_putcad(26,17,0xffffff,COLORFONDO,"of a READ");
155     v_putcad(26,18,0xffffff,COLORFONDO,"command and");
156     v_putcad(26,19,0xffffff,COLORFONDO,"outputdata.");
157     v_putcad(27,21,0x0000DD,COLORFONDO,"!INSTABLE!");
158   }
159   if(strcmp(item, "tRC") == 0)
160   {
161     v_putcad(26,8,0xffffff,COLORFONDO,"Change with");
162     v_putcad(26,9,0xffffff,COLORFONDO,"R/L.");
163     v_putcad(26,11,0xffffff,COLORFONDO,"Valid are");
164     v_putcad(26,12,0xffffff,COLORFONDO,"1 to 16");
165     v_putcad(26,13,0xffffff,COLORFONDO,"cycles.");
166     v_putcad(26,15,0xffffff,COLORFONDO,"ACTIVE to");
167     v_putcad(26,16,0xffffff,COLORFONDO,"ACTIVE/");
168     v_putcad(26,17,0xffffff,COLORFONDO,"AUTOREFRESH");
169     v_putcad(26,18,0xffffff,COLORFONDO,"command");
170     v_putcad(26,19,0xffffff,COLORFONDO,"period delay.");
171   }
172   if(strcmp(item, "tRAS") == 0)
173   {
174     v_putcad(26,8,0xffffff,COLORFONDO,"Change with");
175     v_putcad(26,9,0xffffff,COLORFONDO,"R/L.");
176     v_putcad(26,11,0xffffff,COLORFONDO,"Valid are");
177     v_putcad(26,12,0xffffff,COLORFONDO,"1 to 16");
178     v_putcad(26,13,0xffffff,COLORFONDO,"cycles.");
179     v_putcad(26,15,0xffffff,COLORFONDO,"Delay between");
180     v_putcad(26,16,0xffffff,COLORFONDO,"the ACTIVE");
181     v_putcad(26,17,0xffffff,COLORFONDO,"and PRECHARGE");
182     v_putcad(26,18,0xffffff,COLORFONDO,"commands.");
183   }
184   if(strcmp(item, "tWR") == 0)
185   {
186     v_putcad(26,8,0xffffff,COLORFONDO,"Change with");
187     v_putcad(26,9,0xffffff,COLORFONDO,"R/L.");
188     v_putcad(26,11,0xffffff,COLORFONDO,"Valid are");
189     v_putcad(26,12,0xffffff,COLORFONDO,"1 to 16");
190     v_putcad(26,13,0xffffff,COLORFONDO,"cycles.");
191     v_putcad(26,15,0xffffff,COLORFONDO,"Write");
192     v_putcad(26,16,0xffffff,COLORFONDO,"recovery time");
193     v_putcad(26,17,0xffffff,COLORFONDO,"in cycles.");
194   }
195   if(strcmp(item, "tMRD") == 0)
196   {
197     v_putcad(26,8,0xffffff,COLORFONDO,"Change with");
198     v_putcad(26,9,0xffffff,COLORFONDO,"R/L.");
199     v_putcad(26,11,0xffffff,COLORFONDO,"Valid are");
200     v_putcad(26,12,0xffffff,COLORFONDO,"1 to 16");
201     v_putcad(26,13,0xffffff,COLORFONDO,"cycles.");
202     v_putcad(26,15,0xffffff,COLORFONDO,"LOAD MODE");
203     v_putcad(26,16,0xffffff,COLORFONDO,"REGISTER");
204     v_putcad(26,17,0xffffff,COLORFONDO,"command cycle");
205     v_putcad(26,18,0xffffff,COLORFONDO,"time.");
206   }
207   if(strcmp(item, "tRFC") == 0)
208   {
209     v_putcad(26,8,0xffffff,COLORFONDO,"Change with");
210     v_putcad(26,9,0xffffff,COLORFONDO,"R/L.");
211     v_putcad(26,11,0xffffff,COLORFONDO,"Valid are");
212     v_putcad(26,12,0xffffff,COLORFONDO,"1 to 16");
213     v_putcad(26,13,0xffffff,COLORFONDO,"cycles.");
214     v_putcad(26,15,0xffffff,COLORFONDO,"AUTOREFRESH");
215     v_putcad(26,16,0xffffff,COLORFONDO,"command");
216     v_putcad(26,17,0xffffff,COLORFONDO,"period.");
217   }
218   if(strcmp(item, "tRP") == 0)
219   {
220     v_putcad(26,8,0xffffff,COLORFONDO,"Change with");
221     v_putcad(26,9,0xffffff,COLORFONDO,"R/L.");
222     v_putcad(26,11,0xffffff,COLORFONDO,"Valid are");
223     v_putcad(26,12,0xffffff,COLORFONDO,"1 to 16");
224     v_putcad(26,13,0xffffff,COLORFONDO,"cycles.");
225     v_putcad(26,15,0xffffff,COLORFONDO,"PRECHARGE");
226     v_putcad(26,16,0xffffff,COLORFONDO,"command");
227     v_putcad(26,17,0xffffff,COLORFONDO,"period.");
228   }
229   if(strcmp(item, "tRCD") == 0)
230   {
231     v_putcad(26,8,0xffffff,COLORFONDO,"Change with");
232     v_putcad(26,9,0xffffff,COLORFONDO,"R/L.");
233     v_putcad(26,11,0xffffff,COLORFONDO,"Valid are");
234     v_putcad(26,12,0xffffff,COLORFONDO,"1 to 16");
235     v_putcad(26,13,0xffffff,COLORFONDO,"cycles.");
236     v_putcad(26,15,0xffffff,COLORFONDO,"RAS to CAS");
237     v_putcad(26,16,0xffffff,COLORFONDO,"Delay in");
238     v_putcad(26,17,0xffffff,COLORFONDO,"cycles.");
239   }
240   if(strcmp(item, "REFPERD") == 0)
241   {
242     v_putcad(26,8,0xffffff,COLORFONDO,"Choose the");
243     v_putcad(26,9,0xffffff,COLORFONDO,"RAM Refresh");
244     v_putcad(26,9,0xffffff,COLORFONDO,"Period");
245     v_putcad(26,10,0xffffff,COLORFONDO,"with R/L");
246     v_putcad(26,12,0xffffff,COLORFONDO,"Valid are");
247     v_putcad(26,13,0xffffff,COLORFONDO,"1 to 65535 ");
248     v_putcad(26,14,0xffffff,COLORFONDO,"cycles.");
249     v_putcad(26,16,0xffffff,COLORFONDO,"Max. cycles");
250     v_putcad(26,17,0xffffff,COLORFONDO,"between");
251     v_putcad(26,18,0xffffff,COLORFONDO,"AUTOREFRESH");
252     v_putcad(26,19,0xffffff,COLORFONDO,"commands.");
253     v_putcad(26,21,0xFFFF,COLORFONDO,"Default ~250");
254   }
255   if(strcmp(item, "DCLK_Div") == 0)
256   {
257     v_putcad(26,8,0xffffff,COLORFONDO,"Choose with");
258     v_putcad(26,9,0xffffff,COLORFONDO,"R/L.");
259     v_putcad(26,11,0xffffff,COLORFONDO,"The CPU-clock");
260     v_putcad(26,12,0xffffff,COLORFONDO,"will be");
261     v_putcad(26,13,0xffffff,COLORFONDO,"divided by");
262     v_putcad(26,14,0xffffff,COLORFONDO,"this value.");
263     v_putcad(26,15,0xffffff,COLORFONDO,"Valid values");
264     v_putcad(26,17,0xffffff,COLORFONDO,"are from");
265     v_putcad(26,18,0xffffff,COLORFONDO,"1 to 8");
266     v_putcad(26,20,0xffffff,COLORFONDO,"RAM-Clock =");
267     v_putcad(26,21,0xffffff,COLORFONDO,"CPU-Clock / 2");
268   }
269 }
270
271 short cpumenu()
272 {
273   unsigned sysfreq=0, cpufreq, cpu_div;
274   
275   short test = 1;
276   
277   if(cpusettings[0] == -1)
278   {
279     //get the setted values from system
280     cpu_div = get_920_Div();
281     sysfreq=get_freq_920_CLK();
282     sysfreq*=cpu_div+1;
283     cpufreq=sysfreq/1000000;
284   }
285   else
286   {
287     //use old settings
288     cpufreq = cpusettings[0];
289     cpu_div = cpusettings[1];
290   }
291   
292   menupoint = 0;
293   
294   do
295   { 
296     cleardisp();
297     
298     //cpu menu
299     v_putcad(12,2,WHITE,COLORFONDO,"CPU Clock Setup");
300     sprintf(cad,"CPU Frequency = %uMhz",cpufreq);
301     if(menupoint==0){v_putcad(2,5,0xffffff,TEXTBACK,cad);itemhelp("cpuclk");}
302     else v_putcad(2,5,0xffff,COLORFONDO,cad);
303     sprintf(cad,"CPU Divider: %u",cpu_div+1);
304     if(menupoint==1){v_putcad(2,7,0xffffff,TEXTBACK,cad);itemhelp("cpudiv");}
305     else v_putcad(2,7,0xffff,COLORFONDO,cad);
306     v_putcad(2,12,0xffff00,COLORFONDO,"CPU Speedtest");
307     if(test==0) sprintf(cad,"Test 2: Primnumber");
308     if(test==1) sprintf(cad,"Test 1: Walking Ant");
309     if(menupoint==2){v_putcad(2,15,0xffffff,TEXTBACK,cad);itemhelp("test");}
310     else v_putcad(2,15,0xffff,COLORFONDO,cad);
311     if(menupoint==3){v_putcad(8,17,0xffffff,TEXTBACK,"GO!!!");itemhelp("gotest");}
312     else v_putcad(8,17,0xffff,COLORFONDO,"GO!!!");
313
314     gp2x_video_flip();
315
316     while(1)
317     {
318       gp2x_nKeys=gp2x_joystick_read();
319
320       if((gp2x_nKeys & GP2X_START))
321       {
322         while(1)
323         {
324           gp2x_nKeys=gp2x_joystick_read();
325           if(!(gp2x_nKeys & GP2X_START)) break;
326         }
327         cpusettings[0] = cpufreq;
328         cpusettings[1] = cpu_div;
329         return 0;
330       }
331
332       if((gp2x_nKeys & GP2X_DOWN))
333       {
334         menupoint++;
335         if(menupoint>3) menupoint=0;
336         delay_us(200000);
337         break;
338       }
339
340       if((gp2x_nKeys & GP2X_UP))
341       {
342         menupoint--;
343         if(menupoint<0) menupoint=3;
344         delay_us(200000);
345         break;
346       }
347
348       if((gp2x_nKeys & GP2X_R))
349       {
350         if (menupoint == 0)
351         {
352           cpufreq+=10;
353           if (cpufreq > 340) cpufreq = 33;
354         }
355         if (menupoint == 1)
356         {
357           cpu_div++;
358           if (cpu_div == 8) cpu_div = 0;
359         }
360         if (menupoint == 2)
361         {
362           test++;
363           if (test == 2) test = 0;
364         }
365         delay_us(200000);
366         break;
367       }
368
369       if((gp2x_nKeys & GP2X_L))
370       {
371         if (menupoint == 0)
372         {
373           cpufreq-=10;
374           if (cpufreq < 33) cpufreq = 340;
375         }
376         if (menupoint == 1)
377         {
378           cpu_div--;
379           if (cpu_div == -1) cpu_div = 7;
380         }
381         if (menupoint == 2)
382         {
383           cpu_div--;
384           if (cpu_div == -1) cpu_div = 1;
385         }
386         delay_us(200000);
387         break;
388       }
389       
390       if((gp2x_nKeys & GP2X_VOL_DOWN))
391       {
392         if (menupoint == 0)
393         {
394           cpufreq++;
395           if (cpufreq == 340) cpufreq = 33;
396         }
397         delay_us(200000);
398         break;
399       }
400             
401       if((gp2x_nKeys & GP2X_VOL_UP))
402       {
403         if (menupoint == 0)
404         {
405           cpufreq--;
406           if (cpufreq == 32) cpufreq = 340;
407         }
408         delay_us(200000);
409         break;
410       }
411       
412       if((gp2x_nKeys & GP2X_B))
413       {
414         if (menupoint == 3) speedtest(test);
415         delay_us(200000);
416         break;
417       }
418     }
419   }
420   while(1);
421 }
422
423 short lcdmenu()
424 {
425   short clockgen, LCDClk;
426   float gamma;
427   
428   if(dispsettings[0] == -1)
429   {
430     //get the setted values from system
431     clockgen = get_Clkgen();
432     LCDClk = get_LCDClk(clockgen);
433     gamma = 1.0;
434   }
435   else
436   {
437     //use old settings
438     clockgen = dispsettings[0];
439     LCDClk = dispsettings[1];
440     gamma = dispsettings[2]/100;
441   }
442   
443   menupoint = 0;
444   
445   do
446   { 
447     cleardisp();
448     
449     //display menu
450     v_putcad(9,2,WHITE,COLORFONDO,"Display Setting Setup");
451     if (clockgen == 0)
452     {
453       sprintf(cad,"Clockgen = FPLL");
454       if(menupoint==0){v_putcad(2,5,0xffffff,TEXTBACK,cad);itemhelp("clockgen");}
455       else v_putcad(2,5,0xffff,COLORFONDO,cad);
456     }
457     else
458     {
459       sprintf(cad,"Clockgen = UPLL");
460       if(menupoint==0){v_putcad(2,5,0xffffff,TEXTBACK,cad);itemhelp("clockgen");}
461       else v_putcad(2,5,0xffff,COLORFONDO,cad);
462     }
463     sprintf(cad,"Timing: %i",LCDClk);
464     if(menupoint==1){v_putcad(2,7,0xffffff,TEXTBACK,cad);itemhelp("timing");}
465     else v_putcad(2,7,0xffff,COLORFONDO,cad);
466     sprintf(cad,"Gamma: %.2f",gamma);
467     if(menupoint==2){v_putcad(2,9,0xffffff,TEXTBACK,cad);itemhelp("gamma");}
468     else v_putcad(2,9,0xffff,COLORFONDO,cad); 
469
470     gp2x_video_flip();
471
472     while(1)
473     {
474       gp2x_nKeys=gp2x_joystick_read();
475
476       if((gp2x_nKeys & GP2X_START))
477       {
478         while(1)
479         {
480           gp2x_nKeys=gp2x_joystick_read();
481           if(!(gp2x_nKeys & GP2X_START)) break;
482         }
483         dispsettings[0] = clockgen;
484         dispsettings[1] = LCDClk;
485         dispsettings[2] = (int)(gamma*100);
486         return 0;
487       }
488
489       if((gp2x_nKeys & GP2X_DOWN))
490       {
491         menupoint++;
492         if(menupoint>2) menupoint=0;
493         delay_us(200000);
494         break;
495       }
496
497       if((gp2x_nKeys & GP2X_UP))
498       {
499         menupoint--;
500         if(menupoint<0) menupoint=2;
501         delay_us(200000);
502         break;
503       }
504
505       if((gp2x_nKeys & GP2X_R))
506       {
507         if (menupoint == 0)
508         {
509           clockgen++;
510           if (clockgen == 2) clockgen = 0;
511         }
512         if (menupoint == 1)
513         {
514           LCDClk++;
515           if (clockgen == 0)
516           {
517             if (LCDClk == 37) LCDClk = -20;
518             set_add_FLCDCLK(LCDClk);
519           }
520           else
521           {
522             if (LCDClk == 11) LCDClk = -6;
523             set_add_ULCDCLK(LCDClk);
524           }
525         }
526         if (menupoint == 2)
527         {
528           gamma += 0.2;
529           if (gamma > 10) gamma = 0.2;
530           set_gamma(gamma);
531         }
532         delay_us(200000);
533         break;
534       }
535
536       if((gp2x_nKeys & GP2X_L))
537       {
538         if (menupoint == 0)
539         {
540           clockgen--;
541           if (clockgen == -1) clockgen = 1;
542         }
543         if (menupoint == 1)
544         {
545           LCDClk--;
546           if(clockgen == 0)
547           {
548             if (LCDClk == -21) LCDClk = 36;
549             set_add_FLCDCLK(LCDClk);
550           }
551           else
552           {
553             if (LCDClk == -7) LCDClk = 10;
554             set_add_ULCDCLK(LCDClk);
555           }
556         }
557         if (menupoint == 2)
558         {
559           gamma -= 0.2;
560           if (gamma < 0.01) gamma = 10;
561           set_gamma(gamma);
562         }
563         delay_us(200000);
564         break;
565       }
566       
567       if((gp2x_nKeys & GP2X_VOL_DOWN))
568       {
569         if (menupoint == 2)
570         {
571           gamma += 0.01;
572           if (gamma > 10) gamma = 0.01;
573           set_gamma(gamma);
574         }
575         delay_us(200000);
576         break;
577       }
578             
579       if((gp2x_nKeys & GP2X_VOL_UP))
580       {
581         if (menupoint == 2)
582         {
583           gamma -= 0.01;
584           if (gamma < 0.01) gamma = 10;
585           set_gamma(gamma);
586         }
587         delay_us(200000);
588         break;
589       }
590     }
591   }
592   while(1);
593 }
594
595 short rammenu()
596 {
597   short CAS,tRC,tRAS,tWR,tMRD,tRFC,tRP,tRCD,DCLK_Div;
598   int REFPERD;
599   
600   if(ramsettings[0] == -1)
601   {
602     //get the setted values from system
603     CAS = get_CAS();
604     tRC = get_tRC();
605     tRAS = get_tRAS();
606     tWR = get_tWR();
607     tMRD = get_tMRD();
608     tRFC = get_tRFC();
609     tRP = get_tRP();
610     tRCD = get_tRCD();
611     REFPERD = get_REFPERD();
612     DCLK_Div = get_DCLK_Div();
613   }
614   else
615   {
616     //use old settings
617     CAS = ramsettings[0];
618     tRC = ramsettings[1];
619     tRAS = ramsettings[2];
620     tWR = ramsettings[3];
621     tMRD = ramsettings[4];
622     tRFC = ramsettings[5];
623     tRP = ramsettings[6];
624     tRCD = ramsettings[7];
625     REFPERD = ramsettings[8];
626     DCLK_Div = ramsettings[9];
627   }
628   
629   pageshift = 0;
630   menupoint = 0;
631   
632   do
633   { 
634     cleardisp();
635     
636     //ram menu
637     v_putcad(11,2,WHITE,COLORFONDO,"RAM Setting Setup");
638     if(pageshift == 0)
639     { 
640       sprintf(cad,"CAS: %u",CAS+2);
641       if(menupoint==0){v_putcad(2,5,0xffffff,TEXTBACK,cad);itemhelp("CAS");}
642       else v_putcad(2,5,0xffff,COLORFONDO,cad);
643     }
644     else v_putcad(13,5,0xffff,COLORFONDO,"^");
645     sprintf(cad,"tRC: %u",tRC+1);
646     if(menupoint==1){v_putcad(2,7-pageshift,0xffffff,TEXTBACK,cad);itemhelp("tRC");}
647     else v_putcad(2,7-pageshift,0xffff,COLORFONDO,cad);
648     sprintf(cad,"tRAS: %u",tRAS+1);
649     if(menupoint==2){v_putcad(2,9-pageshift,0xffffff,TEXTBACK,cad);itemhelp("tRAS");}
650     else v_putcad(2,9-pageshift,0xffff,COLORFONDO,cad);
651     sprintf(cad,"tWR: %u",tWR+1);
652     if(menupoint==3){v_putcad(2,11-pageshift,0xffffff,TEXTBACK,cad);itemhelp("tWR");}
653     else v_putcad(2,11-pageshift,0xffff,COLORFONDO,cad);
654     sprintf(cad,"tMRD: %u",tMRD+1);
655     if(menupoint==4){v_putcad(2,13-pageshift,0xffffff,TEXTBACK,cad);itemhelp("tMRD");}
656     else v_putcad(2,13-pageshift,0xffff,COLORFONDO,cad);
657     sprintf(cad,"tRFC: %u",tRFC+1);
658     if(menupoint==5){v_putcad(2,15-pageshift,0xffffff,TEXTBACK,cad);itemhelp("tRFC");}
659     else v_putcad(2,15-pageshift,0xffff,COLORFONDO,cad);
660     sprintf(cad,"tRP: %u",tRP+1);
661     if(menupoint==6){v_putcad(2,17-pageshift,0xffffff,TEXTBACK,cad);itemhelp("tRP");}
662     else v_putcad(2,17-pageshift,0xffff,COLORFONDO,cad);
663     sprintf(cad,"tRCD: %u",tRCD+1);
664     if(menupoint==7){v_putcad(2,19-pageshift,0xffffff,TEXTBACK,cad);itemhelp("tRCD");}
665     else v_putcad(2,19-pageshift,0xffff,COLORFONDO,cad);
666     sprintf(cad,"Refresh Period: %u",REFPERD+1);
667     if(menupoint==8){v_putcad(2,21-pageshift,0xffffff,TEXTBACK,cad);itemhelp("REFPERD");}
668     else v_putcad(2,21-pageshift,0xffff,COLORFONDO,cad);
669     if(pageshift == 1)
670     { 
671       sprintf(cad,"RAM Divider: %u",DCLK_Div+1);
672       if(menupoint==9){v_putcad(2,23,0xffffff,TEXTBACK,cad);itemhelp("DCLK_Div");}
673       else v_putcad(2,23,0xffff,COLORFONDO,cad);
674     }
675     else v_putcad(13,23,0xffff,COLORFONDO,"v");
676     
677
678     gp2x_video_flip();
679
680     while(1)
681     {
682       gp2x_nKeys=gp2x_joystick_read();
683
684       if((gp2x_nKeys & GP2X_START))
685       {
686         while(1)
687         {
688           gp2x_nKeys=gp2x_joystick_read();
689           if(!(gp2x_nKeys & GP2X_START)) break;
690         }
691         ramsettings[0] = CAS;
692         ramsettings[1] = tRC;
693         ramsettings[2] = tRAS;
694         ramsettings[3] = tWR;
695         ramsettings[4] = tMRD;
696         ramsettings[5] = tRFC;
697         ramsettings[6] = tRP;
698         ramsettings[7] = tRCD;
699         ramsettings[8] = REFPERD;
700         ramsettings[9] = DCLK_Div;
701         return 0;
702       }
703
704       if((gp2x_nKeys & GP2X_DOWN))
705       {
706         menupoint++;
707         if(menupoint==9) pageshift = 1;
708         if(menupoint>9) {menupoint=0; pageshift = 0;} 
709         delay_us(200000);
710         break;
711       }
712
713       if((gp2x_nKeys & GP2X_UP))
714       {
715         menupoint--;
716         if(menupoint==0) pageshift = 0;
717         if(menupoint<0) { menupoint=9; pageshift = 1;}  
718         delay_us(200000);
719         break;
720       }
721
722       if((gp2x_nKeys & GP2X_R))
723       {
724         if (menupoint == 0)
725         {
726           CAS++;
727           if (CAS == 2) CAS = 0;
728         }
729         if (menupoint == 1)
730         {
731           tRC++;
732           if (tRC == 16) tRC = 0;
733         }
734         if (menupoint == 2)
735         {
736           tRAS++;
737           if (tRAS == 16) tRAS = 0;
738         }
739         if (menupoint == 3)
740         {
741           tWR++;
742           if (tWR == 16) tWR = 0;
743         }
744         if (menupoint == 4)
745         {
746           tMRD++;
747           if (tMRD == 16) tMRD = 0;
748         }
749         if (menupoint == 5)
750         {
751           tRFC++;
752           if (tRFC == 16) tRFC = 0;
753         }
754         if (menupoint == 6)
755         {
756           tRP++;
757           if (tRP == 16) tRP = 0;
758         }
759         if (menupoint == 7)
760         {
761           tRCD++;
762           if (tRCD == 16) tRCD = 0;
763         }
764         if (menupoint == 8)
765         {
766           REFPERD += 10;
767           if (REFPERD == 0xffff) REFPERD = 0;
768         }
769         if (menupoint == 9)
770         {
771           DCLK_Div++;
772           if (DCLK_Div == 8) DCLK_Div = 0;
773         }
774         delay_us(200000);
775         break;
776       }
777
778       if((gp2x_nKeys & GP2X_L))
779       {
780         if (menupoint == 0)
781         {
782           CAS--;
783           if (CAS == -1) CAS = 1;
784         }
785         if (menupoint == 1)
786         {
787           tRC--;
788           if (tRC == -1) tRC = 15;
789         }
790         if (menupoint == 2)
791         {
792           tRAS--;
793           if (tRAS == -1) tRAS = 15;
794         }
795         if (menupoint == 3)
796         {
797           tWR--;
798           if (tWR == -1) tWR = 15;
799         }
800         if (menupoint == 4)
801         {
802           tMRD--;
803           if (tMRD == -1) tMRD = 15;
804         }
805         if (menupoint == 5)
806         {
807           tRFC--;
808           if (tRFC == -1) tRFC = 15;
809         }
810         if (menupoint == 6)
811         {
812           tRP--;
813           if (tRP == -1) tRP = 15;
814         }
815         if (menupoint == 7)
816         {
817           tRCD--;
818           if (tRCD == -1) tRCD = 15;
819         }
820         if (menupoint == 8)
821         {
822           REFPERD -= 10;
823           if (REFPERD == -1) REFPERD = 0xfffe;
824         }
825         if (menupoint == 9)
826         {
827           DCLK_Div--;
828           if (DCLK_Div == -1) DCLK_Div = 7;
829         }
830         delay_us(200000);
831         break;
832       }
833     }
834   }
835   while(1);
836 }
837
838 int exit_cpu_speed(char* runfile)
839 {
840   gp2x_deinit();
841   cpuspeed_exit = 1;
842 #if 0
843   system("sync");
844   if(strcmp(runfile, "gp2xmenu") == 0) chdir("/usr/gp2x");
845   execl(runfile,NULL);
846   exit(0);
847 #endif
848
849
850 /****************************************************************************************************************************************/
851 //  MAIN
852 /****************************************************************************************************************************************/
853
854 int main_cpuspeed(int argc, char *argv[])
855 {
856   unsigned sysfreq=0;
857   int cpufreq, n;
858   short run = 0;
859   int start_daemon = 0;
860   short mainmenupoint = 0;
861   ramsettings[0] = -1;
862   ramsettings[1] = -1;
863   ramsettings[2] = -1;
864   ramsettings[3] = -1;
865   ramsettings[4] = -1;
866   ramsettings[5] = -1;
867   ramsettings[6] = -1;
868   ramsettings[7] = -1;
869   ramsettings[8] = -1;
870   ramsettings[9] = -1;
871   dispsettings[0] = -1;
872   dispsettings[1] = -100;
873   dispsettings[2] = -1;
874   cpusettings[0] = -1;
875   cpusettings[1] = -1;
876   daemonsettings[0] = -1;
877   daemonsettings[1] = 260;
878   daemonsettings[2] = 5;
879   daemonsettings[3] = 5;
880   daemonsettings[4] = GP2X_L | GP2X_R;
881   daemonsettings[5] = GP2X_VOL_DOWN;
882   daemonsettings[6] = GP2X_VOL_UP;
883   daemonsettings[7] = 1;
884   
885   char *runfile;
886
887   FILE *settings;
888   char sets[41][40];
889   char* comps[25] = {
890       "CPU-Clock\n","CPU-Div\n","FPLL\n","UPLL\n","Gamma\n","CAS\n","tRC\n",
891       "tRAS\n","tWR\n","tMRD\n","tRFC\n","tRP\n","tRCD\n","Refresh-Period\n","RAM-Div\n","Run\n",
892       "Daemon-Min\n","Daemon-Max\n","Daemon-Step\n","Daemon-Delay\n","Daemon-Hotkey\n","Daemon-Incr-Key\n","Daemon-Decr-Key\n",
893       "Daemon-OSD\n","Daemon-Run\n"
894   };
895   
896   gp2x_init(16,44100,16,1,50);
897   cpuctrl_init();  // ATENCION: si no se hace esto, cuelgue seguro (aprovecho la definicion de rlyeh y debe ir despues de gp2x_init)
898   
899   settings = fopen ("./cpu_speed.cfg", "r");
900   
901   if (settings == NULL)
902     {
903     printf("No file found\n");
904     }
905     else
906     {
907     char *ReturnCode;
908     for(n=0; n<40; n++)
909     {
910       ReturnCode = fgets(sets[n],40,settings);
911       if (ReturnCode == NULL)
912       { 
913         sets[40][0] = (char)n;
914         break;
915       }
916     }
917     
918     for(n=0; n<(int)sets[40][0]; n=n+2)
919     {
920       if(strcmp(sets[n],comps[0]) == 0)
921       {
922         if(atoi(sets[n+1]) > 33)
923         if(atoi(sets[n+1]) < 341)
924         cpusettings[0] = atoi(sets[n+1]);
925       }
926       if(strcmp(sets[n],comps[1]) == 0)
927       {
928         if(atoi(sets[n+1]) > 0)
929         if(atoi(sets[n+1]) < 9)
930         cpusettings[1] = atoi(sets[n+1])-1;
931       }
932       if(strcmp(sets[n],comps[2]) == 0)
933       {
934         if(atoi(sets[n+1]) > -21)
935         if(atoi(sets[n+1]) < 37)
936         dispsettings[0] = 0;
937         dispsettings[1] = atoi(sets[n+1]);
938         
939       }
940       if(strcmp(sets[n],comps[3]) == 0)
941       {
942         if(atoi(sets[n+1]) > -7)
943         if(atoi(sets[n+1]) < 11)
944         dispsettings[0] = 1;
945         dispsettings[1] = atoi(sets[n+1]);
946       }
947       if(strcmp(sets[n],comps[4]) == 0)
948       {
949         if(atof(sets[n+1]) > 0)
950         if(atof(sets[n+1]) <= 10)
951         dispsettings[2] = (int)(atof(sets[n+1])*100);
952       }
953       if(strcmp(sets[n],comps[5]) == 0)
954       {
955         if(atoi(sets[n+1]) > 1)
956         if(atoi(sets[n+1]) < 4)
957         ramsettings[0] = atoi(sets[n+1])-2;
958       }
959       if(strcmp(sets[n],comps[6]) == 0)
960       {
961         if(atoi(sets[n+1]) > 0)
962         if(atoi(sets[n+1]) < 17)
963         ramsettings[1] = atoi(sets[n+1])-1;
964       }
965       if(strcmp(sets[n],comps[7]) == 0)
966       {
967         if(atoi(sets[n+1]) > 0)
968         if(atoi(sets[n+1]) < 17)
969         ramsettings[2] = atoi(sets[n+1])-1;
970       }
971       if(strcmp(sets[n],comps[8]) == 0)
972       {
973         if(atoi(sets[n+1]) > 0)
974         if(atoi(sets[n+1]) < 17)
975         ramsettings[3] = atoi(sets[n+1])-1;
976       }
977       if(strcmp(sets[n],comps[9]) == 0)
978       {
979         if(atoi(sets[n+1]) > 0)
980         if(atoi(sets[n+1]) < 17)
981         ramsettings[4] = atoi(sets[n+1])-1;
982       }
983       if(strcmp(sets[n],comps[10]) == 0)
984       {
985         if(atoi(sets[n+1]) > 0)
986         if(atoi(sets[n+1]) < 17)
987         ramsettings[5] = atoi(sets[n+1])-1;
988       }
989       if(strcmp(sets[n],comps[11]) == 0)
990       {
991         if(atoi(sets[n+1]) > 0)
992         if(atoi(sets[n+1]) < 17)
993         ramsettings[6] = atoi(sets[n+1])-1;
994       }
995       if(strcmp(sets[n],comps[12]) == 0)
996       {
997         if(atoi(sets[n+1]) > 0)
998         if(atoi(sets[n+1]) < 17)
999         ramsettings[7] = atoi(sets[n+1])-1;
1000       }
1001       if(strcmp(sets[n],comps[13]) == 0)
1002       {
1003         if(atoi(sets[n+1]) > 0)
1004         if(atoi(sets[n+1]) < 65536)
1005         ramsettings[8] = atoi(sets[n+1])-1;
1006       }
1007       if(strcmp(sets[n],comps[14]) == 0)
1008       {
1009         if(atoi(sets[n+1]) > 0)
1010         if(atoi(sets[n+1]) < 9)
1011         ramsettings[9] = atoi(sets[n+1])-1;
1012       }
1013       if(strcmp(sets[n],comps[15]) == 0)
1014       {
1015         run = 1;
1016         runfile = sets[n+1];
1017       }
1018       if(strcmp(sets[n],comps[16]) == 0)
1019       {
1020         if(atoi(sets[n+1]) >= 33)
1021         if(atoi(sets[n+1]) <= 340)
1022         daemonsettings[0] = atoi(sets[n+1]);
1023       }
1024       if(strcmp(sets[n],comps[17]) == 0)
1025       {
1026         if(atoi(sets[n+1]) >= 33)
1027         if(atoi(sets[n+1]) <= 340)
1028         daemonsettings[1] = atoi(sets[n+1]);
1029       }
1030       if(strcmp(sets[n],comps[18]) == 0)
1031       {
1032         if(atoi(sets[n+1]) >= daemonsettings[1])
1033         if(atoi(sets[n+1]) <= 340)
1034         daemonsettings[2] = atoi(sets[n+1]);
1035       }
1036       if(strcmp(sets[n],comps[19]) == 0)
1037       {
1038         daemonsettings[3] = (int)(atof(sets[n+1])*10+0.5);
1039         if(daemonsettings[3] < 1)
1040             daemonsettings[3] = 5;
1041       }
1042       if(strcmp(sets[n],comps[20]) == 0)
1043       {
1044         daemonsettings[4] = parse_key_sequence(sets[n+1]);
1045       }
1046       if(strcmp(sets[n],comps[21]) == 0)
1047       {
1048         daemonsettings[5] = parse_key_sequence(sets[n+1]);
1049       }
1050       if(strcmp(sets[n],comps[22]) == 0)
1051       {
1052         daemonsettings[6] = parse_key_sequence(sets[n+1]);
1053       }
1054       if(strcmp(sets[n],comps[23]) == 0)
1055       {
1056         daemonsettings[7] = (sets[n+1][1] == 'n' ? 1 : 0);
1057       }
1058       if(strcmp(sets[n],comps[24]) == 0)
1059       {
1060         start_daemon = 1;
1061       }
1062     }
1063   }
1064   
1065   if(run == 1)
1066   {
1067     if (cpusettings[0] > -1) set_FCLK(cpusettings[0]);
1068     if (cpusettings[1] > -1) set_920_Div(cpusettings[1]);
1069     if (dispsettings[0] == 0)
1070     if (dispsettings[1] > -100) set_add_FLCDCLK(dispsettings[1]);
1071     if (dispsettings[0] == 1)
1072     if (dispsettings[1] > -100) set_add_ULCDCLK(dispsettings[1]);
1073     if (dispsettings[2] > -1) set_gamma((float)(dispsettings[2]/100));
1074     if (ramsettings[0] > -1) set_CAS(ramsettings[0]);
1075     if (ramsettings[1] > -1) set_tRC(ramsettings[1]);
1076     if (ramsettings[2] > -1) set_tRAS(ramsettings[2]);
1077     if (ramsettings[3] > -1) set_tWR(ramsettings[3]);
1078     if (ramsettings[4] > -1) set_tMRD(ramsettings[4]);
1079     if (ramsettings[5] > -1) set_tRFC(ramsettings[5]);
1080     if (ramsettings[6] > -1) set_tRP(ramsettings[6]);
1081     if (ramsettings[7] > -1) set_tRCD(ramsettings[7]);
1082     if (ramsettings[8] > -1) set_REFPERD(ramsettings[8]);
1083     if (ramsettings[9] > -1) set_DCLK_Div(ramsettings[9]);
1084     exit_cpu_speed(runfile);
1085     return 0;
1086   }
1087
1088   sysfreq=get_freq_920_CLK();
1089   sysfreq*=get_920_Div()+1;
1090   cpufreq=sysfreq/1000000;
1091   
1092 #if 0
1093   if(argc > 1)
1094   {
1095     if(strcmp(argv[1], "0") == 0) fallback(argc, argv);
1096     else if(strcmp(argv[1], "1") == 0) fallback(argc, argv);
1097     else if(strcmp(argv[1], "--help") == 0) cmdhelp();
1098     else if(strcmp(argv[1], "--daemon") == 0) cmd_daemon(argc, argv);
1099     else if(strcmp(argv[1], "--kill-daemon") == 0) kill_running_daemon() || printf("no daemon running\r\n");
1100     else if(strcmp(argv[1], "--kill") == 0) kill_running_daemon() || printf("no daemon running\r\n");
1101     else cmdline(argc, argv);
1102     gp2x_deinit();
1103     return 0;
1104   }
1105 #endif
1106   
1107   if(start_daemon)
1108       start_daemon_by_settings();
1109   
1110   set_gamma(1.0);
1111   
1112   do
1113   { 
1114     cleardisp();
1115     
1116     //main menu
1117     v_putcad(27,26,WHITE,COLORFONDO,"Y:Save to SD");
1118     v_putcad(2,27,WHITE,COLORFONDO,"Select: Set setting and quit");
1119     itemhelp("menu");
1120     if(mainmenupoint==0) v_putcad(2,6,0xffffff,TEXTBACK,"> CPU Clock");
1121     else v_putcad(2,6,0xffff,COLORFONDO,"> CPU Clock");
1122     if(mainmenupoint==1) v_putcad(2,8,0xffffff,TEXTBACK,"> Display Settings");
1123     else v_putcad(2,8,0xffff,COLORFONDO,"> Display Settings");
1124     if(mainmenupoint==2) v_putcad(2,10,0xffffff,TEXTBACK,"> RAM Settings");
1125     else v_putcad(2,10,0xffff,COLORFONDO,"> RAM Settings");
1126     if(mainmenupoint==3) v_putcad(2,12,0xffffff,TEXTBACK,"> Daemon");
1127     else v_putcad(2,12,0xffff,COLORFONDO,"> Daemon");
1128     v_putcad(2,17,0xffff00,COLORFONDO,"Information:");
1129     sprintf(cad,"Sys.-Frq: %u Hz",sysfreq);
1130     v_putcad(2,19,0xffffff,COLORFONDO,cad);
1131     sprintf(cad,"UCLK-Frq:  %u Hz",get_freq_UCLK());
1132     v_putcad(2,20,0xffffff,COLORFONDO,cad);
1133     sprintf(cad,"ACLK-Frq: %u Hz",get_freq_ACLK());
1134     v_putcad(2,21,0xffffff,COLORFONDO,cad);
1135     gp2x_video_flip();
1136
1137     while(1)
1138     {
1139       gp2x_nKeys=gp2x_joystick_read();
1140
1141       if((gp2x_nKeys & GP2X_START))
1142       {
1143         while(1)
1144         {
1145           gp2x_nKeys=gp2x_joystick_read();
1146           if(!(gp2x_nKeys & GP2X_START)) break;
1147         }
1148         exit_cpu_speed("gp2xmenu");
1149         return 0;
1150       }
1151
1152       if((gp2x_nKeys & GP2X_SELECT))
1153       {
1154         if (cpusettings[0] > -1)
1155         {
1156           set_FCLK(cpusettings[0]);
1157           set_920_Div(cpusettings[1]);
1158         }
1159         if (ramsettings[0] > -1)
1160         {
1161           set_CAS(ramsettings[0]);
1162           set_tRC(ramsettings[1]);
1163           set_tRAS(ramsettings[2]);
1164           set_tWR(ramsettings[3]);
1165           set_tMRD(ramsettings[4]);
1166           set_tRFC(ramsettings[5]);
1167           set_tRP(ramsettings[6]);
1168           set_tRCD(ramsettings[7]);
1169           set_REFPERD(ramsettings[8]);
1170           set_DCLK_Div(ramsettings[9]);
1171         }
1172         while(1)
1173         {
1174           gp2x_nKeys=gp2x_joystick_read();
1175           if(!(gp2x_nKeys & GP2X_START)) break;
1176         }
1177         exit_cpu_speed("gp2xmenu");
1178         return 0;
1179       }
1180
1181       if((gp2x_nKeys & GP2X_DOWN))
1182       {
1183         mainmenupoint=mainmenupoint+1;
1184         if(mainmenupoint>3) mainmenupoint=0;  
1185         delay_us(200000);
1186         break;
1187       }
1188
1189       if((gp2x_nKeys & GP2X_UP))
1190       {
1191         mainmenupoint=mainmenupoint-1;
1192         if(mainmenupoint<0) mainmenupoint=3;  
1193         delay_us(200000);
1194         break;
1195       }
1196
1197       if((gp2x_nKeys & GP2X_Y))
1198       {
1199         settings = fopen("./cpu_speed.cfg", "w");
1200         if(cpusettings[0] > -1)
1201         {
1202           fprintf(settings,"CPU-Clock\n%u\n", cpusettings[0]);
1203           fprintf(settings,"CPU-Div\n%i\n", cpusettings[1]+1);
1204         }
1205         if(dispsettings[0] > -1)
1206         {
1207           if(dispsettings[0] == 0) fprintf(settings,"FPLL\n%i\n", dispsettings[1]);
1208           if(dispsettings[0] == 1) fprintf(settings,"UPLL\n%i\n", dispsettings[1]);
1209         fprintf(settings,"Gamma\n%.2f\n", (float)(dispsettings[2]/100));
1210         }
1211         if(ramsettings[0] > -1)
1212         {
1213         fprintf(settings,"CAS\n%i\n", ramsettings[0]+2);
1214         fprintf(settings,"tRC\n%i\n", ramsettings[1]+1);
1215         fprintf(settings,"tRAS\n%i\n", ramsettings[2]+1);
1216         fprintf(settings,"tWR\n%i\n", ramsettings[3]+1);
1217         fprintf(settings,"tMRD\n%i\n", ramsettings[4]+1);
1218         fprintf(settings,"tRFC\n%i\n", ramsettings[5]+1);
1219         fprintf(settings,"tRP\n%i\n", ramsettings[6]+1);
1220         fprintf(settings,"tRCD\n%i\n", ramsettings[7]+1);
1221         fprintf(settings,"Refresh-Period\n%i\n", ramsettings[8]+1);
1222         fprintf(settings,"RAM-Div\n%i\n", ramsettings[9]+1);
1223         }
1224         if(daemonsettings[0] > -1)
1225         {
1226             fprintf(settings,"Daemon-Min\n%i\n", daemonsettings[0]);
1227             fprintf(settings,"Daemon-Max\n%i\n", daemonsettings[1]);
1228             fprintf(settings,"Daemon-Step\n%i\n", daemonsettings[2]);
1229             fprintf(settings,"Daemon-Delay\n%.1f\n", daemonsettings[3]/10.f);
1230         
1231             char test[256];
1232             sprintf(test,"");
1233             formatkey(test,daemonsettings[4]);
1234             fprintf(settings,"Daemon-Hotkey\n%s\n",test);
1235             sprintf(test,"");
1236             formatkey(test,daemonsettings[5]);
1237             fprintf(settings,"Daemon-Incr-Key\n%s\n",test);
1238             sprintf(test,"");
1239             formatkey(test,daemonsettings[6]);
1240             fprintf(settings,"Daemon-Decr-Key\n%s\n",test);
1241         
1242             fprintf(settings,"Daemon-OSD\n%s\n",(daemonsettings[7]?"On":"Off"));
1243             if(!access("/tmp/cpu_daemon.pid",R_OK))
1244                 fprintf(settings,"Daemon-Run\nOn\n");
1245         
1246         }
1247         
1248         
1249         fclose(settings);
1250         system("sync");
1251         while(1)
1252         {
1253           gp2x_nKeys=gp2x_joystick_read();
1254           if(!(gp2x_nKeys & GP2X_Y)) break;
1255         } 
1256         break;
1257       }
1258
1259
1260       if((gp2x_nKeys & GP2X_B))
1261       {
1262         if(mainmenupoint==0) cpumenu();
1263         if(mainmenupoint==1) lcdmenu();
1264         if(mainmenupoint==2) rammenu();
1265         if(mainmenupoint==3) daemonmenu();
1266         while(1)
1267         {
1268           gp2x_nKeys=gp2x_joystick_read();
1269           if(!(gp2x_nKeys & GP2X_B)) break;
1270         } 
1271         break;
1272       }
1273     }
1274   }
1275   while(cpuspeed_exit == 0);  
1276 }