Parcourir la source

Merge branch 'master' of https://gogs.storlead.com/zhangbo/GD32F450_BMC_BaseCode

master
zhangbo il y a 3 ans
Parent
commit
109251edda

BIN
app/AuthLicense/authlicense


BIN
app/NCP81111_Config/ncp81111_cfg


+ 24 - 5
app/UpdateFirmware/main.c

@@ -21,14 +21,17 @@
 int main()
 {
 	int i;
-	uint8_t buf[4*1024] = {0};	//4KB, one sector
-	uint8_t chkBuf[4*1024] = {0};
+	uint8_t *buf;//[64*1024+1] = {0};	//4KB, one sector
+	uint8_t *chkBuf;//[4*1024] = {0};
 	FILE *fp;
 	size_t len, totalSize = 1, writeSize = 0;
 	FILE *fprogress;
 	uint8_t progressStr[10] = {0};
 	uint8_t rate = 0;
 
+	buf = malloc(64*1024);
+	chkBuf = malloc(64*1024);
+
 	fp = fopen("/var/www/goahead/tmp/tmp.uImage", "rb");
 	if(NULL == fp)
 	{
@@ -42,10 +45,23 @@ int main()
 	fseek(fp, 0, SEEK_SET);
 	printf("Image size: %d\n", totalSize);
 
-	
+//用来保存更新的进度
+		fprogress = fopen("/var/www/goahead/tmp/UpdateProgress.log", "w");
+		if(NULL == fp)
+		{
+			printf("Create UpdateProgress.log file fail!\n");
+			//return -1;
+		}
+		sprintf(progressStr, "%d", rate);
+		fputs(progressStr, fprogress);	
+		fclose(fprogress);	
+
+	printf("Chip erase ...\n");
+	sf_chip_erase(5);
+	printf("Chip erase finished!\n");
 
 	do{
-		len = fread(buf, 1, 4*1024, fp);
+		len = fread(buf, 1, 64*1024, fp);
 		if(len <= 0)
 		{
 			close(fp);
@@ -54,7 +70,7 @@ int main()
 		}
 
 		//update Flash
-		sf_sector_erase(5, writeSize);
+		//sf_sector_erase(5, writeSize);
 		sf_write(5, writeSize, buf, len);
 		
 		// sf_read(5, writeSize, chkBuf, len);
@@ -97,5 +113,8 @@ int main()
 	fclose(fprogress);
 
 	fclose(fp);
+
+	free(buf);
+	free(chkBuf);
 	return 0;
 }

BIN
app/UpdateFirmware/updateFW_app


+ 8 - 8
app/bmc/main.c

@@ -246,18 +246,18 @@ void main(void)
     // pthread_create(&gThreadIDs[gThreadIndex],NULL,test_thread,NULL);
 
     /* 看门狗,10s无喂狗就复位 */
-    int fd_iwdg = open("/dev/iwdg", O_RDWR);
-    ioctl(fd_iwdg, START_IWATCHDOG, NULL);       //打开看狗      
+    // int fd_iwdg = open("/dev/iwdg", O_RDWR);
+    // ioctl(fd_iwdg, START_IWATCHDOG, NULL);       //打开看狗      
 
 	while(1)	//在这里实现各线程的健康状态检测,发现出错的线程就重启它。
 	{
-		//喂看门狗
-	    if(ioctl(fd_iwdg, FEED_WATCHDOG, NULL) != 0)
-	    {
-	            printf("---> Feed watchdog failed\n");
-	    }
+		// //喂看门狗
+	 //    if(ioctl(fd_iwdg, FEED_WATCHDOG, NULL) != 0)
+	 //    {
+	 //            printf("---> Feed watchdog failed\n");
+	 //    }
 
-		sleep(1);
+		sleep(10);
 	}
 }
 

+ 9 - 19
app/goahead-3.6.5/src/auth.c

@@ -491,7 +491,6 @@ PUBLIC bool websLoginUser(Webs *wp, char *username, char *password)
     assert(username);
     assert(password);
 
-    printf("websLoginUser, username: %s, password: %s\n", username, password);
     if (!wp->route || !wp->route->verify) {
         return 0;
     }
@@ -501,10 +500,13 @@ PUBLIC bool websLoginUser(Webs *wp, char *username, char *password)
     wp->password = sclone(password);
 
     if (!(wp->route->verify)(wp)) {
-        trace(2, "Password does not match");
+        printf("Password does not match");
         return 0;
     }
-    trace(2, "Login successful for %s", username);
+
+    //这一句打印不能去掉,去掉后在登录网页时goahead会重启。
+    printf("Login successful for %s", username);
+
     websCreateSession(wp);
     websSetSessionVar(wp, WEBS_SESSION_USERNAME, wp->username);
     return 1;
@@ -541,29 +543,18 @@ static void loginServiceProc(Webs *wp)
     cJSON_AddItemToObject(root, "data", data);//根节点下添加
     cJSON_AddStringToObject(root, "msg", "");
     if (websLoginUser(wp, websGetVar(wp, "username", ""), websGetVar(wp, "password", ""))) {
-        /* If the application defines a referrer session var, redirect to that */
         char *referrer;
-        // if ((referrer = websGetSessionVar(wp, "referrer", 0)) != 0) {
-        //     websRedirect(wp, referrer);
-        // } else {
-        //     websRedirectByStatus(wp, HTTP_CODE_OK);
-        // }
-
         cJSON_AddNumberToObject(root, "code", 200);
         websSetSessionVar(wp, "loginStatus", "ok");
     } else {
-        // if (route->askLogin) {
-        //     (route->askLogin)(wp);
-        // }
         websSetSessionVar(wp, "loginStatus", "failed");
-        // websRedirectByStatus(wp, HTTP_CODE_UNAUTHORIZED);
          cJSON_AddNumberToObject(root, "code", 201);
     }
     char *loginStatus = (char*) websGetSessionVar(wp, "loginStatus", 0);
     //printf(">>>>>>>>>>>>>>>>>%s<<<<<<<<<<<11<<<<<<<<<<loginStatus\n", loginStatus);
      pStr = cJSON_PrintUnformatted(root);
 
-    printf("---> cJSON Str: %d \n%s\n", strlen(pStr), pStr);
+    
     websSetStatus(wp, 200);
     websWriteHeaders(wp, -1, 0);    //Set length to -1 if unknown and transfer-chunk-encoding will be employed.
     websWriteEndHeaders(wp);
@@ -572,12 +563,11 @@ static void loginServiceProc(Webs *wp)
     if(ret < 0)
         printf("websWrite error\n");
     
-    ret = websFlush(wp, 0); //wait for all data to be written to the socket 
- //   if(ret != 1)
- //       printf("websFlush error, ret = %d\n", ret);
-    
+    websFlush(wp, 0);
     websDone(wp);
 
+    //这里的打印也不能去掉,猜测是这里的打印起了延时的作用。
+    printf("---> cJSON Str: %d \n%s\n", strlen(pStr), pStr);
     if(pStr)
         wfree(pStr);
     if(root)

+ 4 - 0
app/goahead-3.6.5/src/goahead.h

@@ -7,6 +7,10 @@
 #ifndef _h_GOAHEAD
 #define _h_GOAHEAD 1
 
+/*************** jimbo test IPMC ***************/
+#define TEST_INDEX   0
+ /******************* end  *********************/
+
 /************************************ Overrides *******************************/
 /*
     Override osdep defaults

+ 2 - 2
app/goahead-3.6.5/src/web_interface/src/dashboard.c

@@ -11,7 +11,7 @@
 #include <sys/un.h>
 #include <unistd.h>
 
-uint8_t gIPMBAddr[BLADE_NUMBERS] = {0x82, 0x84, 0x86, 0x88, 0x8A, 0x8C, 0x8E, 0x90, 0x92, 0x94};
+uint8_t gIPMBAddr[BLADE_NUMBERS] = {0x20, 0x84, 0x86, 0x88, 0x8A, 0x8C, 0x8E, 0x90, 0x92, 0x94};
 uint8_t gChassisManageEn = 0;
 /*获取设备信息*/
 void getDeviceInfo(Webs *wp){
@@ -29,7 +29,7 @@ void getDeviceInfo(Webs *wp){
     char IpAddr[16] = {0};
 
     printf("---> getSensorInfo, wp.index = %d\n", wp->index);
-    
+
     //Create session
     LIBIPMI_CreateSession(&UDSSession, DEFAULT_TIMEOUT);
 

+ 117 - 86
app/goahead-3.6.5/src/web_interface/src/fw_update.c

@@ -11,19 +11,39 @@
 #include <unistd.h>
 #include <string.h>
 
+/* IWDG */
+#define IOCTL_MAGIC 'x' 
+#define GENERATE_CMD(__MAGIC__, __MAJOR__, __CMD__) \
+    ((0x3<<30) | (__MAJOR__<<16) | (__MAGIC__<<8) | __CMD__)
+#define MAJOR_IWDG  108
+#define FEED_WATCHDOG                   GENERATE_CMD(IOCTL_MAGIC, MAJOR_IWDG, 0)        
+#define START_IWATCHDOG                 GENERATE_CMD(IOCTL_MAGIC, MAJOR_IWDG, 1)        
+#define STOP_IWATCHDOG                  GENERATE_CMD(IOCTL_MAGIC, MAJOR_IWDG, 2)    
+
 static uint8_t progress = 0;
+static uint8_t target_addr;
 /* 进入固件更新模式
 * 杀死所有其它进程
 */
 void prepareDevice(Webs *wp)
 {
-    printf("Update Firmware: Prepare Device...\n");
-    uint8_t cmd[50] = {0};
-    progress = 0;
-    //kill bmc_app
-    sprintf(cmd, "killall -9 bmc_app"); 
-    sprintf(cmd, "killall -9 damon.sh"); 
-    system(cmd);
+    wp->index = TEST_INDEX;
+    target_addr = gIPMBAddr[wp->index];
+    if(target_addr == 0x20)
+    {
+        printf("Update Firmware: Prepare Device...\n");
+        progress = 0;
+        //kill bmc_app
+        system("killall -9 damon.sh");
+        printf("killall -9 damon.sh\n");
+        system("killall -9 bmc_app");
+        printf("killall -9 bmc_app\n");
+    }
+    else
+    {
+        //Do nothing
+    } 
+
     char *pStr;
     cJSON * root =  cJSON_CreateObject();
     cJSON * data =  cJSON_CreateObject();
@@ -58,17 +78,28 @@ void uploadFirmware(Webs *wp)
     WebsKey         *s;
     WebsUpload      *up;
     char            *upfile;
-    if (scaselessmatch(wp->method, "POST")) {
-        for (s = hashFirst(wp->files); s; s = hashNext(wp->files, s)) {
-            up = s->content.value.symbol;
-            upfile = sfmt("%s/tmp/%s", websGetDocuments(), "tmp.uImage");
-            if (rename(up->filename, upfile) < 0) {
-                error("Cannot rename uploaded file: %s to %s, errno %d", up->filename, upfile, errno);
+
+    wp->index = TEST_INDEX;
+    target_addr = gIPMBAddr[wp->index];
+    if(target_addr == 0x20)
+    {
+        if (scaselessmatch(wp->method, "POST")) {
+            for (s = hashFirst(wp->files); s; s = hashNext(wp->files, s)) {
+                up = s->content.value.symbol;
+                upfile = sfmt("%s/tmp/%s", websGetDocuments(), "tmp.uImage");
+                if (rename(up->filename, upfile) < 0) {
+                    error("Cannot rename uploaded file: %s to %s, errno %d", up->filename, upfile, errno);
+                }
+                wfree(upfile);
             }
-            wfree(upfile);
+          
         }
-      
     }
+    else
+    {
+        //Do nothing
+    }
+
     char *pStr;
     cJSON * root =  cJSON_CreateObject();
     cJSON * data =  cJSON_CreateObject();
@@ -103,9 +134,19 @@ void updateFlash(Webs *wp)
     uint8_t cmd[50] = {0};
     progress = 0;
 
-    //Call updateFW_app
-    sprintf(cmd, "/usr/bin/updateFW_app &"); 
-    system(cmd);
+    wp->index = TEST_INDEX;
+    target_addr = gIPMBAddr[wp->index];
+    if(target_addr == 0x20)
+    {
+        //Call updateFW_app
+        system("/usr/bin/updateFW_app &"); 
+        printf("/usr/bin/updateFW_app &"); 
+    }
+    else
+    {
+        //Do nothing
+    }
+
     char *pStr;
     cJSON * root =  cJSON_CreateObject();
     cJSON * data =  cJSON_CreateObject();
@@ -128,7 +169,7 @@ void updateFlash(Webs *wp)
         cJSON_Delete(root);
     
     websDone(wp);
-    printf("Update Firmware: Prepare Device Ok.\n");
+    printf("Update Firmware: Update Flash ok.\n");
 }
 
 
@@ -141,21 +182,31 @@ void getUpdateProgress(Webs *wp)
     uint8_t progressStr[10] = {0};
     FILE *fp;
 
-    //TODO:
-    fp = fopen("/var/www/goahead/tmp/UpdateProgress.log", "r");
-    if(NULL == fp)
+    wp->index = TEST_INDEX;
+    target_addr = gIPMBAddr[wp->index];
+    if(target_addr == 0x20)
     {
-        printf("Open UpdateProgress.log failed!\n");
-        websError(wp, 200, "Open UpdateProgress.log failed!");
-        return;
-    }
 
-    if(NULL == fgets(progressStr, 10, fp))
+        //TODO:
+        fp = fopen("/var/www/goahead/tmp/UpdateProgress.log", "r");
+        if(NULL == fp)
+        {
+            printf("Open UpdateProgress.log failed!\n");
+            websError(wp, 200, "Open UpdateProgress.log failed!");
+            return;
+        }
+
+        if(NULL == fgets(progressStr, 10, fp))
+        {
+            printf("Read UpdateProgress.log failed!\n");
+            websError(wp, 200, "Read UpdateProgress.log failed!");
+            fclose(fp);
+            return;
+        }
+    }
+    else
     {
-        printf("Read UpdateProgress.log failed!\n");
-        websError(wp, 200, "Read UpdateProgress.log failed!");
-        fclose(fp);
-        return;
+        sprintf(progressStr, "100");
     }
 
     char *pStr;
@@ -192,24 +243,33 @@ void getVerifyStatus(Webs *wp)
     uint8_t verigyStr[13] = {0};
     FILE *fp;
 
-    //TODO:
-    fp = fopen("/var/www/goahead/tmp/Verify.log", "r");
-    if(NULL == fp)
+    wp->index = TEST_INDEX;
+    target_addr = gIPMBAddr[wp->index];
+    if(target_addr == 0x20)
     {
-        printf("Open Verify.log failed!\n");
-        websError(wp, 200, "Open Verify.log failed!");
-        return;
-    }
+        //TODO:
+        fp = fopen("/var/www/goahead/tmp/Verify.log", "r");
+        if(NULL == fp)
+        {
+            printf("Open Verify.log failed!\n");
+            websError(wp, 200, "Open Verify.log failed!");
+            return;
+        }
 
-    if(NULL == fgets(verigyStr, 13, fp))
+        if(NULL == fgets(verigyStr, 13, fp))
+        {
+            printf("Read Verify.log failed!\n");
+            websError(wp, 200, "Read Verify.log failed!");
+            fclose(fp);
+            return;
+        }
+        
+        printf("Update Firmware: %s\n", verigyStr);
+    }
+    else
     {
-        printf("Read Verify.log failed!\n");
-        websError(wp, 200, "Read Verify.log failed!");
-        fclose(fp);
-        return;
+        sprintf(verigyStr, "Verify OK");
     }
-    
-    printf("Update Firmware: %s\n", verigyStr);
 
 
     char *pStr;
@@ -246,53 +306,24 @@ void resetBmc(Webs *wp)
     printf("Update Firmware: Reset BMC...\n");
     websSetStatus(wp, 200);
     websWriteHeaders(wp, -1, 0);
-    //websWriteHeader(wp, "resetBmc");
     websWriteEndHeaders(wp);
-    //websWrite(wp, "%s", pStr);
-    //websFlush(wp, 0);
     websDone(wp);
 
-    usleep(1000);  //wait previous code
-    int fd = open(DEV_NAME, O_RDWR);
-    if(fd == -1)
+    wp->index = TEST_INDEX;
+    target_addr = gIPMBAddr[wp->index];
+    if(target_addr == 0x20)
     {
-        printf("Open %s failed!\n", DEV_NAME);
-    }
+        usleep(1000);  //wait previous code
+        int fd = open(DEV_NAME, O_RDWR);
+        if(fd == -1)
+        {
+            printf("Open %s failed!\n", DEV_NAME);
+        }
 
-    ioctl(fd, RESET_MCU, NULL);    
-    close(fd);
+        ioctl(fd, RESET_MCU, NULL);    
+        close(fd);
+    }
 }
 
 
 
-
-// void getDeviceInfo(Webs *wp){
-   
-//     char *pStr;
-//     cJSON * root =  cJSON_CreateObject();
-//     cJSON * data =  cJSON_CreateObject();
-//     cJSON_AddItemToObject(root, "data", data);//根节点下添加
-//     cJSON_AddStringToObject(root, "msg", "");
-//     cJSON_AddNumberToObject(root, "code", 200);
-//     cJSON_AddStringToObject(data, "buildTime", BuildTime);
-//     cJSON_AddStringToObject(data, "fwVersion", FwVersion);
-//     cJSON_AddStringToObject(data, "macAddr", MacAddr);
-//     cJSON_AddStringToObject(data, "ipAddr", IpAddr);
-//     cJSON_AddStringToObject(data, "netMode", "static");
-
-//     pStr = cJSON_PrintUnformatted(root);
-
-//     printf("---> cJSON Str:\n%s\n", pStr);
-//     websSetStatus(wp, 200);
-//     websWriteHeaders(wp, -1, 0);
-//     websWriteEndHeaders(wp);
-//     websWrite(wp, "%s", pStr);
-//     websFlush(wp, 0);
-//     websDone(wp);
-
-//     if(pStr)
-//         wfree(pStr);
-//     if(root)
-//         cJSON_Delete(root);
-
-// }

+ 1 - 0
app/hal_api/hal_interface_api.h

@@ -35,6 +35,7 @@ int sf_get_id(uint8_t spi, uint8_t *id);
 int sf_sector_erase(uint8_t spi, uint32_t Address);
 int sf_read(uint8_t spi, uint32_t Address, uint8_t *buf, uint32_t size);
 int sf_write(uint8_t spi, uint32_t Address, uint8_t *buf, uint32_t size);
+int sf_chip_erase(uint8_t spi);
 
 /* ADC Interface */
 int stm32_adc_get_value(uint8_t channel, uint16_t *value);

+ 80 - 0
app/hal_api/hal_spi_interface.c

@@ -317,6 +317,86 @@ int sf_sector_erase(uint8_t spi, uint32_t offset)
 	return 0;
 }
 
+/*
+	flash: 	fw flash, spi5
+	cmd:	erase whole chip
+*/
+int sf_chip_erase(uint8_t spi)
+{
+	int fd;
+	int ret;
+	uint8_t dev_name[10] = {0};
+	spi_arg_t spi_arg;
+	uint8_t		status1_reg;
+	uint32_t	timeout = 0;
+	GPIO_TypeDef *NSS_PORT = NULL;
+	uint16_t	NSS_PIN = 0;
+
+	switch(spi)
+	{
+	case 1:
+		break;
+	case 2:
+		NSS_PORT = GPIOI;
+		NSS_PIN = GPIO_PIN_0;
+		break;
+	case 3:
+		break;
+	case 4:
+		break;
+	case 5:
+		NSS_PORT = GPIOF;
+		NSS_PIN = GPIO_PIN_6;
+		break;	
+	case 6:
+		break;
+	default:
+		printf("Invalid bus number %d\n", spi);
+		return -1;
+	}
+
+	sprintf(dev_name, "%s%d", DEV_NAME, spi);
+	fd = open(dev_name, O_RDWR);
+	if(fd == -1)
+	{
+		printf("Open %s failed!\n", dev_name);
+	}
+
+	//Write Enable
+	spi_arg.Size = 1;
+	spi_arg.buf[0] = 0x06;
+	stm32_gpio_write(NSS_PORT, NSS_PIN, GPIO_PIN_RESET);	//NSS low
+	ret = ioctl(fd, SPI_MASTER_TRANSFER, &spi_arg);
+	stm32_gpio_write(NSS_PORT, NSS_PIN, GPIO_PIN_SET);	//NSS high
+	if(ret == -1)
+	{
+		printf("SPI Write Enable failed!\n");
+		return -1;
+	}
+
+	//chip Erase
+	spi_arg.Size = 1;
+	spi_arg.buf[0] = 0x60;
+	stm32_gpio_write(NSS_PORT, NSS_PIN, GPIO_PIN_RESET);	//NSS low
+	ret = ioctl(fd, SPI_MASTER_TRANSFER, &spi_arg);
+	stm32_gpio_write(NSS_PORT, NSS_PIN, GPIO_PIN_SET);	//NSS high
+	if(ret == -1)
+	{
+		printf("SPI sector erase failed!\n");
+		return -1;
+	}
+	
+
+	sleep(10);	//10s
+	stm32_gpio_write(NSS_PORT, NSS_PIN, GPIO_PIN_RESET);	//NSS low
+	sf_wait_spi_ready(fd, 100000);	//100s
+	stm32_gpio_write(NSS_PORT, NSS_PIN, GPIO_PIN_SET);	//NSS high
+
+	close(fd);
+
+	return 0;
+}
+
 int sf_get_id(uint8_t spi, uint8_t *id)
 {
 	int fd;

BIN
app/i2c_scan/i2c-scan


BIN
app/test_app/test_app