📄 application.c
字号:
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <fcntl.h> #define CLK_BASE 13000000struct reg_info{ unsigned long cccr_info; unsigned long ccsr_info; unsigned long clkcfg_info;}; int check_cpu_speed (int fd);void set_cpu_speed (int fd,int mode_select);int main (){ int choice=0; int mode_select = 0; int temp_value = 0; int fd = open("/dev/mycpu", O_RDWR); if (fd != -1) { printf ("Device open success\n\n"); do { printf ("please enter a letter stand for your choice\n"); printf ("1-----------------Looking the cpu frequence\n"); printf ("2-----------------Changing the cpu frequence\n"); printf ("3-----------------Exit the programm\n"); scanf ("%d",&choice); printf ("\n"); switch(choice) { case 1: temp_value=check_cpu_speed(fd); printf("the cpu frequnece is %d.%02dMHZ\n\n",temp_value/1000000,(temp_value % 1000000) / 10000 ); break; case 2: printf ("please enter the mode you want to select\n"); printf ("1---------Run mode\n"); printf ("2---------Turbo mode\n"); printf ("3---------Half Turbo mode\n"); printf ("4---------13M mode\n"); scanf ("%d",&mode_select); set_cpu_speed(fd,mode_select); break; case 3: printf ("the programm is over!!\n"); break; default: printf("incorrect letter entered,please "); printf("enter it again!!\n"); break; } } while (choice != 3); } else printf ("Device open failure\n"); close(fd); return 0;}void set_cpu_speed (int fd,int mode_select){ unsigned long temp = 0; float n_value = 0; int l_value = 0; struct reg_info my_reg_info; struct reg_info ddd; unsigned long temp_n_value; switch(mode_select) { case 1: do { printf ("Run-mode frequency (R) = 13-MHz processor-oscillator frequency * L\n"); printf ("Note:L should be between 2 and 30\n"); printf ("Please enter the L's value:"); scanf ("%d",&l_value); if (l_value >= 2 && l_value <= 30 ) { if(ioctl(fd, 1,&my_reg_info) == -1) { printf("read cpu failure\n"); return ; } else { my_reg_info.cccr_info = my_reg_info.cccr_info | 0x4000000; my_reg_info.cccr_info = my_reg_info.cccr_info & 0x3fffffff; my_reg_info.cccr_info = (my_reg_info.ccsr_info & 0xffffffe0) + l_value; my_reg_info.clkcfg_info = my_reg_info.clkcfg_info | 0x2; my_reg_info.clkcfg_info = my_reg_info.clkcfg_info & 0xfffffffa; if ( ioctl(fd,2,&my_reg_info) == -1) printf ("set cpu failure!\n"); else printf("set cpu success!\n"); } } else printf ("entered the wrong number,please reenter\n\n"); }while(l_value < 2 || l_value > 30 ); break; case 2 : printf ("Turbo-mode frequency (T) = 13-MHz processor-oscillator frequency * L * N\n"); printf ("Note:L should be between 2 and 30,N should be 1 , 1.5 , 2 , 2.5 , 3\n"); printf ("Please enter the L's value:"); scanf ("%d",&l_value); printf ("\nPlease enter the N's value:"); scanf ("%f",&n_value); if (l_value >= 2 && l_value <= 30 && (2 * n_value) >= 2 && (2 * n_value <= 6) ) { if(ioctl(fd, 1,&my_reg_info) == -1) { printf("\nread cpu failure\n"); return ; } else { //printf("\nl_value: %d,%x\n",l_value,l_value); //printf("\nmy_reg_info.ccsr_info: %x\n",my_reg_info.ccsr_info); my_reg_info.cccr_info = my_reg_info.cccr_info | 0x4000000; my_reg_info.cccr_info = my_reg_info.cccr_info & 0x3fffffff; temp = (my_reg_info.ccsr_info & 0xffffffe0) + l_value; //printf(" temp: %x\n",temp); temp_n_value = (unsigned long)n_value*2; temp_n_value = temp_n_value * 128; my_reg_info.cccr_info = (temp & 0xfffffc7f) + temp_n_value; //printf(" cccr_info : %x\n", my_reg_info.cccr_info); //printf ("n_value: %x\n",temp_n_value); my_reg_info.clkcfg_info = my_reg_info.clkcfg_info | 0x3; my_reg_info.clkcfg_info = my_reg_info.clkcfg_info & 0xfffffffb; //my_reg_info.clkcfg_info = my_reg_info.clkcfg_info & 0xfffffffb; //printf("\n\n set cccr_info :%x\n", my_reg_info.cccr_info); //printf("\n\n set cccr_clkcfg :%x\n", my_reg_info.clkcfg_info); if ( ioctl(fd,1,&ddd) == -1) printf ("\nset cpu failure!\n"); else printf("\nset cpu success!\n"); //printf("\n**************************************8\n"); //printf("\n\n set cccr_info ddd :%x\n", ddd.ccsr_info); //printf("\n\n set cccr_clkcfg ddd :%x\n", ddd.clkcfg_info); if ( ioctl(fd,2,&my_reg_info) == -1) printf ("\nset cpu failure!\n"); else printf("\nset cpu success!\n"); if ( ioctl(fd,1,&my_reg_info) == -1) printf ("\nset cpu failure!\n"); else printf("\nset cpu success!\n"); //printf("\n**************************************8\n"); //printf("\n\n set cccr_info :%x\n", my_reg_info.ccsr_info); //printf("\n\n set cccr_clkcfg :%x\n", my_reg_info.clkcfg_info); } } else printf ("entered the wrong number,please reenter\n\n"); break; case 3: if(ioctl(fd, 1,&my_reg_info) == -1) { printf("\nread cpu failure\n"); return ; } else { printf("\nIN\n"); my_reg_info.cccr_info = my_reg_info.cccr_info | 0x4000000; my_reg_info.cccr_info = my_reg_info.cccr_info & 0x3fffffff; my_reg_info.clkcfg_info = my_reg_info.clkcfg_info | 0x7; //my_reg_info.clkcfg_info = my_reg_info.clkcfg_info & 0xfffffffe; my_reg_info.cccr_info = (temp & 0xfffffc7f) + 128*6; printf("clkcfg :%x", my_reg_info.clkcfg_info); if ( ioctl(fd,2,&my_reg_info) == -1) printf ("\nHalf Turbo mode set failure!\n"); else printf("\nHalf Turbo mode set success!\n"); } break; default: if(ioctl(fd, 1,&my_reg_info) == -1) { printf("\nread cpu failure\n"); return ; } else { //my_reg_info.cccr_info = my_reg_info.cccr_info | 0x4000000; my_reg_info.clkcfg_info = my_reg_info.clkcfg_info | 0x2; my_reg_info.cccr_info = my_reg_info.cccr_info | 0x80000000; my_reg_info.cccr_info = my_reg_info.cccr_info & 0xbfffffff; if ( ioctl(fd,2,&my_reg_info) == -1) printf ("\n13M mode set failure!\n"); else printf("\n13M mode set success!\n"); } break; }}int check_cpu_speed (int fd){ int l_value = 0; int n_value = 0; int mode_value = 0; struct reg_info my_reg_info; if(ioctl(fd, 1,&my_reg_info)== -1) { printf("read cpu failure\n"); return 0; } else { if( (my_reg_info.ccsr_info >> 31) == 0 ) { n_value = (my_reg_info.ccsr_info>>7) & 0x7; mode_value = my_reg_info.clkcfg_info & 0x5; l_value = my_reg_info.ccsr_info & 0x1f; switch (mode_value) { case 0: printf ("you select the run mode\n"); if(l_value <= 2 ) return CLK_BASE * 2; else return l_value * CLK_BASE; break; case 1: printf ("you select the Turbo mode\n"); if(n_value <= 2 ) { if (l_value <= 2 ) return CLK_BASE * 2; else return l_value * CLK_BASE; } else { if (l_value <= 2) return CLK_BASE * n_value; else return CLK_BASE * l_value * n_value/2; } break; default: printf ("you select the Half Turbo mode \n"); if(n_value <= 2 ) { if (l_value <= 2 ) return CLK_BASE ; else return l_value * CLK_BASE/2; } else { if (l_value <= 2) return CLK_BASE * n_value/2; else return CLK_BASE * l_value * n_value/4; } break; } } else { printf ("you select the 13M mode\n"); return CLK_BASE; } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -