1 #include "fdl_cmd_proc.h"
4 #define PARTITION_SIZE_LENGTH (4)
5 #ifndef MAX_PARTITION_NAME_SIZE
6 #define MAX_PARTITION_NAME_SIZE (72)
8 #ifndef MAX_UTF_PARTITION_NAME_LEN
9 #define MAX_UTF_PARTITION_NAME_LEN (36)
12 #ifdef CONFIG_EMMC_BOOT
13 #define PART_NAME_FORMAT_UTF
17 just convert partition name wchar to char with violent.
19 static __inline char* _nformatconvert(wchar_t *wchar)
21 static char buf[MAX_PARTITION_NAME_SIZE]={0};
23 while((NULL != wchar[i]) && (i<(MAX_PARTITION_NAME_SIZE-1)))
25 buf[i] = wchar[i]&0xFF;
33 static void _decode_packet_data(PACKET_T *packet, wchar_t* partition_name, unsigned long* size, unsigned long* checksum)
36 unsigned short *data = (unsigned short *) (packet->packet_body.content);
37 *size = *(unsigned long *) ((unsigned char *)data + MAX_PARTITION_NAME_SIZE);
39 *checksum = *(unsigned long *) ((unsigned char *)data + MAX_PARTITION_NAME_SIZE+4);
41 for(i=0;i<MAX_UTF_PARTITION_NAME_LEN;i++)
43 partition_name[i] = *(data+i);
49 int FDL2_Download_Start (PACKET_T *packet, void *arg)
51 wchar_t partition_name[MAX_UTF_PARTITION_NAME_LEN]={0};
52 unsigned long size,nv_checksum;
55 printf("Enter %s \n", __FUNCTION__);
57 _decode_packet_data(packet, partition_name, &size, &nv_checksum);
58 #ifdef PART_NAME_FORMAT_UTF
59 name = partition_name;
61 name = _nformatconvert(partition_name);
64 return fdl2_download_start(name,size,nv_checksum);
67 int FDL2_Download_Midst(PACKET_T *packet, void *arg)
69 return fdl2_download_midst(packet->packet_body.size, (char *)(packet->packet_body.content));
72 int FDL2_Download_End (PACKET_T *packet, void *arg)
74 printf("Enter %s \n", __FUNCTION__);
75 return fdl2_download_end();
78 int FDL2_Read_Start(PACKET_T *packet, void *arg)
80 wchar_t partition_name[MAX_UTF_PARTITION_NAME_LEN]={0};
84 printf("Enter %s \n", __FUNCTION__);
86 _decode_packet_data(packet, partition_name, &size, NULL);
87 #ifdef PART_NAME_FORMAT_UTF
88 name = partition_name;
90 name = _nformatconvert(partition_name);
92 return fdl2_read_start(name, size);
95 int FDL2_Read_Midst(PACKET_T *packet, void *arg)
97 unsigned long *data = (unsigned long *) (packet->packet_body.content);
98 unsigned long size = *data;
99 unsigned long off = *(data + 1);
102 if (size > MAX_PKT_SIZE) {
103 printf("%s:Size:0x%x beyond MAX_PKT_SIZE(0x%x)\n", __FUNCTION__,size,MAX_PKT_SIZE);
104 FDL_SendAckPacket (BSL_REP_DOWN_SIZE_ERROR);
108 ret = fdl2_read_midst(size, off, (unsigned char *)(packet->packet_body.content));
111 packet->packet_body.type = BSL_REP_READ_FLASH;
112 packet->packet_body.size = size;
113 FDL_SendPacket (packet);
118 //The Error Cause has been send to Tool
123 int FDL2_Read_End(PACKET_T *packet, void *arg)
125 printf("Enter %s \n", __FUNCTION__);
126 return fdl2_read_end();
129 int FDL2_Erase(PACKET_T *packet, void *arg)
131 wchar_t partition_name[MAX_UTF_PARTITION_NAME_LEN]={0};
135 printf("Enter %s \n", __FUNCTION__);
137 _decode_packet_data(packet, partition_name, &size, NULL);
138 #ifdef PART_NAME_FORMAT_UTF
139 name = partition_name;
141 name = _nformatconvert(partition_name);
143 return fdl2_erase(name, size);
148 Partition Name(72Byte)+SIZE(4Byte)+...
150 int FDL2_Repartition (PACKET_T *pakcet, void *arg)
152 unsigned short total_partition_num = 0;
153 unsigned short size = pakcet->packet_body.size;
154 unsigned short *data = (unsigned short *) (pakcet->packet_body.content);
156 if(0 != (size%(MAX_PARTITION_NAME_SIZE + PARTITION_SIZE_LENGTH)))
158 printf("%s:recvd packet size(%d) is error \n", __FUNCTION__,size);
159 FDL_SendAckPacket (BSL_INCOMPATIBLE_PARTITION);
162 total_partition_num = size/(MAX_PARTITION_NAME_SIZE + PARTITION_SIZE_LENGTH);
163 printf("Enter %s,Partition total num:%d \n", __FUNCTION__,total_partition_num);
164 return fdl2_repartition(data, total_partition_num);