OTA功能,linux下调用xmode协议,升级MCU

linux端,调用 ./test -i fw.bin命令,升级MCU

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
//#include <time.h>
#include <sys/types.h>
#include <termios.h>
#include <errno.h>
#include "uart.h"
#include "main.h"
#include "inband.h"
#include <stdlib.h>
BYTE read_stpuparam();
BYTE upgrade_read_uart(int n);
BYTE upgrade_flash_read_uart(int ptlPageNo,int dataLen);
unsigned short CRC_ADD(unsigned short crc, BYTE *buffer, int length);

BYTE file[BUF],buffer[BUF],recbuffer[BUF],sendbuffer[BUF];
unsigned int nByte,file_length; 
BYTE cmdbootloader[8] = { 0x5c, 0x8d, 0x00,0xcf, 0x00, 0x31, 0x5c, 0xd8 };  //进入bootloader命令  7.6
BYTE test[4] = { 65, 66, 67, 0x00 };
BYTE Rev_Real_DataLen = 0;   //接收到的实际DATA长度
BYTE Rev_Data[32] = { 0 };   //接收到的DATA数据包
BYTE cmdenter[4] = "#cmd";
BYTE cmdflash[4] = "#wfp";
BYTE cmdexit[5] = "#exit";
BYTE cmdend[8]={00, 00, 00, 00, 00, 00, 0xFF, 0xFF};

int uartfd;

// ./test -i fw.bin  升级指令 
void main(int argc, char **argv)
{
	char *uart1 ="/dev/ttyUSB1";  // "/dev/ttyS1";     
	char fd;// uartfd;
	char filename[128];
	printf("the argc = %d \n", argc);
	      if (argc != 3)
        {
                printf("Three parameters must be provided\n");
                exit(1);
        }

        if (strcmp(argv[1], "-i") != 0)
        {
              printf("the second parameter must be -i \n");
                exit(2);
        }
        if (strstr(argv[2],"fw")==NULL)
        {
                printf("Firmware not recognized...\n");
                exit(1);
        }
       printf("the argv[2] is %s \n",argv[2]);  //文件名称 ********************
       fd  = open(argv[2],O_RDONLY);     
       if (fd == -1)
        {
              printf("open fireware error: \n");
              exit(1);
        }

//--------------------------完成指令的判别工作----------------------------

	for (int i = 0; i < argc; i++)
		printf(" the argv[%d]:%s \n", i, argv[i]);

	if ((uartfd = open(uart1, O_RDWR | O_NOCTTY)) < 0)//非阻塞读方式 打开串口
	{
		printf("open %s is failed", uart1);
		exit(1);
	}

	if (set_opt(uartfd, 9600, 8, 'N', 1) != 0) 
	{
		printf("init uart fail \n");
		exit(1);
	}
		write(uartfd, cmdbootloader, 8);   //重启指令
		if(read_stpuparam()==1)	
		printf("----success----!!!!-- \n");		
        sleep(2);
        printf("------boot----------\n");
		write(uartfd, cmdenter, 5);
		upgrade_read_uart(1);

	
//----------------------------------------------------以上可正常执行----------------------------
	     unsigned int ID =0;
         unsigned  int length;
		while (( length = read(fd,buffer,128))>0) //读取升级文件到buffer  
       {	
		 write(uartfd, cmdflash, 5);
		upgrade_read_uart(2);  //进入flash 

		 unsigned  short crc=0;
		 sendbuffer[0] = (ID>>24)&0XFF;  
		 sendbuffer[1] =(ID>>16)&0xff;
		 sendbuffer[2]=((ID>>8)&0xff;
		 sendbuffer[3] =(ID)&0xff;
		 sendbuffer[4] =(length>>8)&0xff; 
		 sendbuffer[5] =(length)&0xff; //数据长度
                 
		 for (int i=0;i<length ;i++)
		 {
			 sendbuffer[6+i] = buffer[i];  //数据
		 }
             crc = CRC_ADD(0,sendbuffer,length+6); //校验

		 sendbuffer[6+length] =(crc>>8)&0xff;
		 sendbuffer[7+length] =crc&0xff;
         printf("=========== %d =====id=%d \n", crc, ID);
          write(uartfd, sendbuffer, 8+length);   //       
		if(upgrade_flash_read_uart(ID,length)==0) // 接收数据有问题????????????????
          exit(1) ;

        usleep(5000);         
		 ID++;
      } //------------升级完成 

	   write(uartfd, cmdend, 8);  //结束
	   if(upgrade_read_uart(3)==0)
	    exit(1);

	// write(uartfd, cmdexit, 6);  //退出
	//  if(upgrade_read_uart()==0)
	//  exit(1);

	   close(fd);  //close the file       
       close(uartfd);
	printf("the end\n");

}

//升级过程中信息交互
BYTE upgrade_flash_read_uart(int ptlPageNo,int dataLen){
int uart_number=0;
int no,length;

	while (1) {
		while ((nByte = read(uartfd, recbuffer, 128)) > 0) {
			printf(" the upgrade_flash_read_uart len:%d \n", nByte);
			for (int i =0 ; i<nByte ;i++)
			printf(" the recbuffer is :%d \n", recbuffer[i]);         
          	for (int i =0 ; i<9 ;i++) //0 页号 长度 
			{
				no =      recbuffer[1]<<24 +  recbuffer[2]<<16 + recbuffer[3]<<8 + recbuffer[4];
				length =  recbuffer[5]<<24 +  recbuffer[6]<<16 + recbuffer[7]<<8 + recbuffer[8];
				
				if((recbuffer[0]==0)&&(no==ptlPageNo)&&(length==dataLen))
					return 1;
				else 
					return 0;
									
			}

			return 1;
		}
           printf("-------------n=%d--\n",uart_number);

		uart_number++;

		if(uart_number>2)
			return 0;


	} //end while(1)
		

}

//设置命令的反馈信息 
BYTE read_stpuparam(){
int n=0;
	while (1) {
		while ((nByte = read(uartfd, recbuffer, 128)) > 0) {
			   recbuffer[nByte + 1] = 0;// '\0';
			if ((recbuffer[0] == 0x5C) && (recbuffer[1] == 0x8D) && (recbuffer[2] == 0x1) &&
				(recbuffer[nByte - 2] == 0x5C) && (recbuffer[nByte-1] == 0xD8))
			{
				In_band_process(recbuffer, nByte);
				Rev_Data[Rev_Real_DataLen + 1] = 0;
				if (Rev_Data[0] == 0)
				{
					printf("Enter bootloader success!\n");
					n = 1;
				}
				else 
					printf("Enter bootloader  fail\n");      				 			   
				nByte = 0;
				memset(Rev_Data, 0, strlen(Rev_Data));
				memset(recbuffer, 0, strlen(recbuffer));

				if (n== 1) 
				return 1;  //读完毕,退出
			}
             else  
			return 0;//exit(0);  如果指令错误,也退出 
		}
		n++;
        printf("-------------n=%d--\n",n);
		if(n>2)
			return 0;
	} //end while(1)
		
}

BYTE upgrade_read_uart(int n) {
	int uart_number = 0;
	while (1) {
		while ((nByte = read(uartfd, recbuffer, 128)) > 0) {
			recbuffer[nByte + 1] = 0;// '\0';
			printf(" upgrade_read_uart len:%d \n", nByte);
			printf(" upgrade_read_uart is :%s \n", recbuffer);
			if ((n == 1) && (strcmp(recbuffer, "ok")==0))
			{
				printf("--------enter---success--------\n");
				//close(uartfd);
				return 1;
			}

			if ((n == 2) && (strstr(recbuffer, "ok,128")!=NULL))
			{
				printf("----cmd-flash-success---------\n");
				//close(uartfd);
				return 1;
			}

            if(n==3)
			{
			printf("---the--flash--end!-------\n");
			for (int i = 0; i<8; i++)
			{
				if (recbuffer[i] != cmdend[i])
					return 0;
			}
			}
			return 1;
		}

		uart_number++;
        printf("-------------n=%d--\n",uart_number);

		if (uart_number>2)
			return 0;

	} //end while(1)
}




unsigned short  CRC_ADD(unsigned short crc, BYTE *buffer, int length)
{
  int i, j;

  for (i = 0; i < length; i++)
  {
    crc+=(BYTE)buffer[i];
    //crc = ;
  }
  crc=~crc;
  return crc;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值