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

📄 main.c

📁 Linux 下Scanner 的驱动
💻 C
📖 第 1 页 / 共 3 页
字号:
	{
		n = write(fd_usb,pcur,nbytes);
		printf("remain:%d nbytes:%d n:%d\n",remain,nbytes,n);
		if(n>0)
		{
			remain-=n;
			nbytes-=n;
			pcur+=n;
		}
		if(nbytes==0)break;
	}

	return 1;
}

int csbu()
{
	FILE *pf;
	unsigned char cmd[64];
	int n,bk;

/*	
     printf("image path prefix:%s\n",image_path_prefix);
     
     strcpy(image_path,image_path_prefix);
     printf("image path:%s\n",image_path);
     strcat(image_path,"jpg");
     printf("image path:%s\n",image_path);

     pf=fopen(image_path,"rb");
     fseek(pf,0,SEEK_END);
     *(int*)(cmd+4)=(int)ftell(pf);
     fclose(pf);
	 */

	fd_usb = open("/dev/misc/usb_char", O_RDWR);
	if(fd_usb==-1)
	{
		printf("usbchar: open failed!\n");
		return fd_usb;
	}

	while(1)
	{
		n=cmd_in(cmd);

		switch(cmd[0])
		{
		case CSBU_CMD_CONNECT:
			{
				if(state!=STATE_IDLE)
				{
					cmd[0]=CSBU_BUSY;
					n=cmd_out(cmd);
					break;
				}
				else
				{
					csbu_state=1;
					cmd[0]=CSBU_SUCCESS;
					n=cmd_out(cmd);
				}
				break;
			}
		case CSBU_CMD_DISCONNECT:
			{
				if(csbu_state==2)
				{
					cmd[0]=CSBU_BUSY;
					n=cmd_out(cmd);
					break;
				}
				else
				{
					csbu_state=0;
					cmd[0]=CSBU_SUCCESS;
					n=cmd_out(cmd);
				}
				break;
			}
		case CSBU_CMD_SCROLL_LEFT:
			{
				csbu_state=2;
				cmd[0]=CSBU_WAIT;
				n=cmd_out(cmd);

				bk=idle_left();
				cmd[0]=CSBU_SUCCESS;
				n=cmd_out(cmd);
				csbu_state=1;
				break;
			}
		case CSBU_CMD_SCROLL_RIGHT:
			{
				csbu_state=2;
				cmd[0]=CSBU_WAIT;
				n=cmd_out(cmd);

				bk=idle_right();

				cmd[0]=CSBU_SUCCESS;
				n=cmd_out(cmd);
				csbu_state=1;
				break;
			}
		case CSBU_CMD_COPY:
			{
				csbu_state=2;
				cmd[0]=CSBU_WAIT;
				n=cmd_out(cmd);

				bk=scan_image(SCAN_FILE_JPG,scan_mode,scan_res);

				cmd[0]=CSBU_SUCCESS;

				if(cmd[0]==CSBU_SUCCESS)
				{
					strcpy(image_path,image_path_prefix);
					strcat(image_path,"jpg");
					pf=fopen(image_path,"rb");
					fseek(pf,0,SEEK_END);
					*(int*)(cmd+4)=(int)ftell(pf);
					fclose(pf);

				}

				n=cmd_out(cmd);

				if(cmd[0]==CSBU_SUCCESS)file_out(image_path);
				csbu_state=1;
				break;
			}
		case CSBU_CMD_MEM_COPY:
			{

				csbu_state=2;
				cmd[0]=CSBU_WAIT;
				n=cmd_out(cmd);


				cmd[0]=CSBU_SUCCESS;

				if(cmd[0]==CSBU_SUCCESS)
				{
					strcpy(image_path,image_path_prefix);
					strcat(image_path,"jpg");
					printf("image path:%s\n",image_path);

					pf=fopen(image_path,"rb");
					fseek(pf,0,SEEK_END);
					*(int*)(cmd+4)=(int)ftell(pf);
					fclose(pf);

				}

				n=cmd_out(cmd);

				if(cmd[0]==CSBU_SUCCESS)file_out(image_path);
				csbu_state=1;
				break;
			}
		case CSBU_CMD_CCD_ADJ:
			{
				csbu_state=2;

				cmd[0]=CSBU_SUCCESS;
				n=cmd_out(cmd);

				if(cmd[0]==CSBU_SUCCESS)
				{
					scan_mode&=0xfffffff3;
					scan_mode|=SCAN_MODE_STILL;
					motor_off();

					while(1)
					{
						scan_image(SCAN_FILE_USB,scan_mode,scan_res);
						usleep(1*200);
					}

				}

				csbu_state=1;
				break;
			}
		case CSBU_CMD_START_SET:
			{
				csbu_state=2;

				kOrgDefaultSideEdge=*((DWORD*)(cmd+4));

				pf=fopen("/etc/CSBStart.set","wb");

				if(pf)
				{
					fwrite(&kOrgDefaultSideEdge,1,4,pf);
					fclose(pf);
				}

				cmd[0]=CSBU_SUCCESS;
				n=cmd_out(cmd);



				csbu_state=1;
				break;
			}
		case CSBU_CMD_START_READ:
			{
				csbu_state=2;


				pf=fopen("/etc/CSBStart.set","rb");

				if(pf)
				{
					fread(&kOrgDefaultSideEdge,1,4,pf);
					fclose(pf);
				}

				*((DWORD*)(cmd+4))=kOrgDefaultSideEdge;

				cmd[0]=CSBU_SUCCESS;

				n=cmd_out(cmd);

				csbu_state=1;
				break;
			}

		case CSBU_CMD_STOP:break;
		}
	}
}


        
int main(int argc, char *argv[])
{
	FILE *pf;
	int key,bk,i;
	pid_t csbuid;
	struct timeb tb;
	char info[64];

	/* debug */
	/*
	setting[0]=1;
	setting[2]=1;
	setting[3]=5;
	idle_memcopy();
	*/

	//exit(1);

#ifndef ARM
	scan_image(1,scan_mode,scan_res);

	//scan_image(1,scan_mode,scan_res);
	return 1;
#endif

      bk=init_control_panel();

	if(bk)printf("Init Control panel OK!\n");
	else return -1;



//load setting
	pf=fopen("/etc/CSB.set","rb");
	if(pf)
	{
		fread(hide_setting,1,(HIDE_MENU_TOTAL)*4,pf);
              fread(setting,1,(MENU_TOTAL+1)*4,pf);
		fclose(pf);
	} 

	//read side edge from file
	pf=fopen("/etc/CSBStart.set","rb");
	if(pf)
	{
		fread(& kOrgDefaultSideEdge,1,4,pf);
		fclose(pf);
	}
	else
	{
		pf=fopen("/etc/CSBStart.set","wb");

		if(pf)
		{
			fwrite(&kDefaultSideEdge,1,4,pf);
			fclose(pf);
		}
	}

      

       update_setting_info();
	

	//execl("mount","/proc/bus/usb");

	//create sub process
	if((csbuid=fork())==-1)printf("Fork csbuid Error !\n");

	if(csbuid==0)
	{
		return csbu();
	}

	/*
	 * by Suixin Zhao
	 * 9/4/2006
	 */
	scan_mode |= SCAN_MODE_SCROLL_TO_HOME;
	scan_image(1, scan_mode, scan_res);
	scan_mode = SCAN_MODE_COLOR | SCAN_MODE_SHADING;

	/* in key circle */
	while(1)
	{
		key=get_key();

		if(key!=0)
		{
			if(key<128)
			{
				switch(comb)
				{
				case 2:
					if(key==comb_key[0] || key==comb_key[1])
					{
						comb_rel++;
					}
					ftime(&tb);
					if(comb_rel==2 && tb.time*1000+(time_t)tb.millitm-comb_time>2000)
					{
						printf("combkey checked: %d %d\n",comb_key[0],comb_key[1]);
						comb=0;
						if(comb_key[0]==KEY_MENU&&comb_key[1]==KEY_SET)
						{
							sprintf(info,"VER:%4X.%4X",setting[MENU_TOTAL]>>16,setting[MENU_TOTAL]&0x0000ffff);
							lcd_printf(info);
							usleep(3000*1000);
							lcd_printf(default_info);
						}

						if(comb_key[0]==KEY_COPY&&comb_key[1]==KEY_MEM_COPY)
						{
							kill(csbuid,SIGTERM);

							if (chk_usbd()==0)
							{
								lcd_printf("Exit CSB...");
								exit(0);
							}
							else
							{
								sprintf(info,"VER:%4X.%4X\n Updating...",setting[MENU_TOTAL]>>16,setting[MENU_TOTAL]&0x0000ffff);
								lcd_printf(info);
								//usleep(3000*1000);
								//lcd_printf(default_info);
								exit(1);
							}
						}

						if(comb_key[0]==KEY_COPY&&comb_key[1]==KEY_COLOR )
						{
							kill(csbuid,SIGTERM);

							//burning
							lcd_printf("Still Scan...");
							scan_mode&=0xfffffff3;
							scan_mode|=SCAN_MODE_STILL;
							motor_off();

							while(1)
							{
								scan_image(SCAN_FILE_BMP,scan_mode,scan_res);
								usleep(1*1000);
							}
						}

                       if(comb_key[0]==KEY_LEFT&&comb_key[1]==KEY_RIGHT)
						{
							in_hide=1;
                             comb=0;
                             bk=idle_menu();
                             break;     //newton                      
						}
					    
					}
					break;

				case 1:comb=0;
				case 0:if(sub_funcs[key][state]!=NULL)bk=sub_funcs[key][state]();break;
				}

			}
			else /* key >= 128 */
			{

				switch(comb)
				{
				case 0:
					comb_key[0]=key-128;
					ftime(&tb);
					comb_time=tb.time*1000+(time_t)tb.millitm;
					//printf("comb=0 : key=%d time=%d\n",comb_key[0],(int)comb_time);
					comb=1;
					break;

				case 1:
					ftime(&tb);
					//printf("comb=0 : key=%d time=%d\n",key-128,(int)(tb.time*1000+(time_t)tb.millitm));
					if(tb.time*1000+(time_t)tb.millitm-comb_time<500 && (key-128)!=comb_key[0])
					{
						comb_key[1]=key-128;
						if(comb_key[1]<comb_key[0])
						{
							comb_rel=comb_key[0];
							comb_key[0]=comb_key[1];
							comb_key[1]=comb_rel;
						}
						comb=2;
						comb_rel=0;
					}
					else comb=0;
					break;
				}
			}
		}
		while(csbu_state)usleep(20*1000);
	}

	return 1;
};


/* 
  int fd1,nbytes,maxbytes=1024,n,remain,total,bk;
  BYTE buffer[1024*16],*pcur;
  struct pollfd mypoll;	

  //test usb char driver
  for(i=0;i<1024*16;i++)buffer[i]=i%256;

my_start: 

  fd1 = open("/dev/misc/usb_char", O_RDWR);

  nbytes=64;

  if(fd1==-1)printf("usbchar: failed!\n");
  else
  {
    n=0;
    while(n==0)
    {
       n = read(fd1,buffer,64);
       if(n>0)printf("read data :%d\n",n);
    }
      
    pf1=fopen("/test.jpg","rb");
    fseek(pf1,0,SEEK_END);
    *((long*)buffer)=total=ftell(pf1);
    printf("start transfer total=%d!\n",total);
    fseek(pf1,0,SEEK_SET);
    nbytes=fread(buffer+4,1,maxbytes-4,pf1);
    nbytes+=4;
    pcur=buffer;
    remain=total+4;
    
    while(!feof(pf1))
    {
      
      n = write(fd1,pcur,nbytes);
      //printf("write data :%d\n",n);
      
      if(n==-1)mcp_sleep_ms(5);
      else
      {
      	 remain-=n;
         if(n<nbytes)
         {
            nbytes-=n;
            pcur+=n;
         }
         else
         {
      	   pcur=buffer;
      	   nbytes=fread(buffer,1,maxbytes,pf1);
 
      	 }

      }
      
    }
    fclose(pf1);
    
    //nbytes=remain;
    
    while(remain>0)
    {  
    	n = write(fd1,pcur,nbytes);
    	printf("remain:%d nbytes:%d n:%d\n",remain,nbytes,n);
    	if(n>0)
    	{
    	  remain-=n;	
    	  nbytes-=n; 
    	  pcur+=n;		
    	}
    	if(nbytes==0)break;
    }
    
    close(fd1);
    
  }
  
   
  mcp_sleep_ms(200);
  
  goto my_start;
    
  */


/* //buttons test
  


  mypoll.fd=fd_buttons;
  mypoll.events=POLLIN;
 
  
  while(1)
  {   
       while((bk=poll(&mypoll,1,20))!=1);
       printf("poll bk=%d",bk);
       
       bk = read(fd_buttons,&n,sizeof(n));
       
       printf("read key=%d bk=%d\n",n,bk);
       mcp_sleep_ms(100);
       
  }
  
  close(fd_buttons);	
*/ 



/*  
  while(1)
  {   
       
       for(n=0;n<4;n++)
       {
         bk = ioctl(fd_leds,0,n);
         mcp_sleep_ms(500);
         bk = ioctl(fd_leds,1,n);
         mcp_sleep_ms(500);
       }
       
  }

  n = write(fd1,"ABCDEFGHIJKLMNOP\nLMOPQRSTABCDEFGH",33);
  
  close(fd1);

*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -