⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 application.c

📁 LINUX操作系统下
💻 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 + -