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;
}