tizen 2.4 release
[kernel/u-boot-tm1.git] / nand_fdl / fdl-2 / src / fdl_cmd_proc.c
1 #include "fdl_cmd_proc.h"
2
3
4 #define PARTITION_SIZE_LENGTH  (4)
5 #ifndef MAX_PARTITION_NAME_SIZE
6 #define MAX_PARTITION_NAME_SIZE (72)
7 #endif
8 #ifndef MAX_UTF_PARTITION_NAME_LEN
9 #define MAX_UTF_PARTITION_NAME_LEN (36)
10 #endif
11 //TODO:
12 #ifdef CONFIG_EMMC_BOOT
13 #define PART_NAME_FORMAT_UTF
14 #endif
15
16 /**
17         just convert partition name wchar to char with violent.
18 */
19 static __inline char* _nformatconvert(wchar_t *wchar)
20 {
21         static char buf[MAX_PARTITION_NAME_SIZE]={0};
22         unsigned int i=0;
23         while((NULL != wchar[i]) && (i<(MAX_PARTITION_NAME_SIZE-1)))
24         {
25                 buf[i] = wchar[i]&0xFF;
26                 i++;
27         }
28         buf[i]=0;
29
30         return buf;
31 }
32
33 static void _decode_packet_data(PACKET_T *packet, wchar_t* partition_name, unsigned long* size, unsigned long* checksum)
34 {
35         int i;
36         unsigned short *data = (unsigned short *) (packet->packet_body.content);
37         *size = *(unsigned long *) ((unsigned char *)data + MAX_PARTITION_NAME_SIZE);
38         if(NULL != checksum)
39                 *checksum = *(unsigned long *) ((unsigned char *)data + MAX_PARTITION_NAME_SIZE+4);
40
41         for(i=0;i<MAX_UTF_PARTITION_NAME_LEN;i++)
42         {
43                 partition_name[i] = *(data+i);
44         }
45
46         return;
47 }
48
49 int FDL2_Download_Start (PACKET_T *packet, void *arg)
50 {
51         wchar_t partition_name[MAX_UTF_PARTITION_NAME_LEN]={0};
52         unsigned long size,nv_checksum;
53         void *name;
54
55         printf("Enter %s \n", __FUNCTION__);
56
57         _decode_packet_data(packet, partition_name, &size, &nv_checksum);
58 #ifdef PART_NAME_FORMAT_UTF
59         name = partition_name;
60 #else
61         name = _nformatconvert(partition_name);
62 #endif
63
64         return fdl2_download_start(name,size,nv_checksum);
65 }
66
67 int FDL2_Download_Midst(PACKET_T *packet, void *arg)
68 {
69         return fdl2_download_midst(packet->packet_body.size, (char *)(packet->packet_body.content));
70 }
71
72 int FDL2_Download_End (PACKET_T *packet, void *arg)
73 {
74         printf("Enter %s \n", __FUNCTION__);
75         return fdl2_download_end();
76 }
77
78 int FDL2_Read_Start(PACKET_T *packet, void *arg)
79 {
80         wchar_t partition_name[MAX_UTF_PARTITION_NAME_LEN]={0};
81         unsigned long size;
82         void *name;
83
84         printf("Enter %s \n", __FUNCTION__);
85
86         _decode_packet_data(packet, partition_name, &size, NULL);
87 #ifdef PART_NAME_FORMAT_UTF
88         name = partition_name;
89 #else
90         name = _nformatconvert(partition_name);
91 #endif
92         return fdl2_read_start(name, size);
93 }
94
95 int FDL2_Read_Midst(PACKET_T *packet, void *arg)
96 {
97         unsigned long *data = (unsigned long *) (packet->packet_body.content);
98         unsigned long size = *data;
99         unsigned long off = *(data + 1);
100         int           ret;
101
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);
105                 return FALSE;
106         }
107
108         ret = fdl2_read_midst(size, off, (unsigned char *)(packet->packet_body.content));
109         if(ret)
110         {
111                 packet->packet_body.type = BSL_REP_READ_FLASH;
112                 packet->packet_body.size = size;
113                 FDL_SendPacket (packet);
114                 return TRUE;
115         }
116         else
117         {
118                 //The Error Cause has been send to Tool
119                 return FALSE;
120         }
121 }
122
123 int FDL2_Read_End(PACKET_T *packet, void *arg)
124 {
125         printf("Enter %s \n", __FUNCTION__);
126         return fdl2_read_end();
127 }
128
129 int FDL2_Erase(PACKET_T *packet, void *arg)
130 {
131         wchar_t partition_name[MAX_UTF_PARTITION_NAME_LEN]={0};
132         unsigned long size;
133         void *name;
134
135         printf("Enter %s \n", __FUNCTION__);
136
137         _decode_packet_data(packet, partition_name, &size, NULL);
138 #ifdef PART_NAME_FORMAT_UTF
139         name = partition_name;
140 #else
141         name = _nformatconvert(partition_name);
142 #endif
143         return fdl2_erase(name, size);
144 }
145
146 /**
147         Packet body content:
148                 Partition Name(72Byte)+SIZE(4Byte)+...
149 */
150 int FDL2_Repartition (PACKET_T *pakcet, void *arg)
151 {
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);
155
156         if(0 != (size%(MAX_PARTITION_NAME_SIZE + PARTITION_SIZE_LENGTH)))
157         {
158                 printf("%s:recvd packet size(%d) is error \n", __FUNCTION__,size);
159                 FDL_SendAckPacket (BSL_INCOMPATIBLE_PARTITION);
160                 return 0;
161         }
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);
165 }
166
167