tizen 2.4 release
[kernel/u-boot-tm1.git] / nvitem / nvitem_packet.c
1 \r
2 #include "nvitem_common.h"\r
3 #include "nvitem_packet.h"\r
4 #include "nvitem_channel.h"\r
5 \r
6 //----------------------------------------------------------------------\r
7 //                              packet define\r
8 //----------------------------------------------------------------------\r
9 #define _MAGICNUM 0x524d4e56            // "RMNV"\r
10 typedef struct\r
11 {\r
12         uint32  MAGICNUM;\r
13         uint32  ecc;\r
14 \r
15         uint32  idxGrp;\r
16         uint32  idxSub;\r
17         uint32  sizeOfPacket;\r
18 }PACKET_HEAD;\r
19 \r
20 #define PACKETSIZE      1024\r
21 static uint8 packeBuf[sizeof(PACKET_HEAD)+PACKETSIZE];\r
22 \r
23 static PACKET_HEAD*     _packetHead;\r
24 static uint8*                   _packetBody;\r
25 \r
26 static uint32 _idxGrp   = 0;\r
27 static uint32 _idxSub   = 0;\r
28 \r
29 //---------------------------------------------------------\r
30 #define PACKETRSP_SIZE  16\r
31 static uint8 packetRsp[sizeof(PACKET_HEAD)+PACKETRSP_SIZE];\r
32 static PACKET_HEAD*     _packetRspHead;\r
33 static uint8*                   _packetRspBody;\r
34 \r
35 static uint32 __makeEcc(uint8* buf, uint32 len)\r
36 {\r
37         return 0;\r
38 }\r
39 \r
40 void __sendPacketRsp(PACKET_HEAD* header, uint8 rsp)\r
41 {\r
42         uint32 hasWrite;\r
43 //---for test\r
44 #if 0\r
45         static uint32 cnt = 0;\r
46         uint32 _delay;\r
47         _delay = rand()%2;\r
48         if(0 == _delay) cnt++;\r
49         else if(3 >= cnt){_delay = 0;}\r
50         else{cnt = 0;}\r
51         sleep(_delay);  // for test\r
52 #endif\r
53 //---\r
54         memset(packetRsp,0,sizeof(PACKET_HEAD)+PACKETRSP_SIZE);\r
55         memcpy(_packetRspHead,header,sizeof(PACKET_HEAD));\r
56         _packetRspHead->sizeOfPacket    = 1;\r
57         _packetRspHead->ecc                     = __makeEcc(0,0);\r
58         _packetRspBody[0] = rsp;\r
59         channel_write(packetRsp, sizeof(PACKET_HEAD)+PACKETRSP_SIZE, &hasWrite);\r
60 }\r
61 //---------------------------------------------------------\r
62 \r
63 static BOOLEAN __chkEcc(uint8* buf, uint32 len, uint32 ecc)\r
64 {\r
65         return 1;\r
66 }\r
67 \r
68 /*PASS*/\r
69 void _initPacket(void)\r
70 {\r
71         _packetHead = ((PACKET_HEAD*)packeBuf);\r
72         _packetBody = &packeBuf[sizeof(PACKET_HEAD)];\r
73 \r
74         _idxGrp = (uint32)(-1);\r
75         _idxSub = 0;\r
76 \r
77         _packetRspHead = ((PACKET_HEAD*)packetRsp);\r
78         _packetRspBody = &packetRsp[sizeof(PACKET_HEAD)];\r
79 }\r
80 \r
81 /*PASS*/\r
82 uint32 _getPacket(uint8** buf, uint32* size)\r
83 {\r
84         uint32 hasRead;\r
85         //printf("NVITEM:_getPacket\n");\r
86 //------------------------------------------------------------\r
87         if(!channel_read(packeBuf, sizeof(PACKET_HEAD)+PACKETSIZE, &hasRead))\r
88 //------------------------------------------------------------\r
89         {\r
90                 //printf("NVITEM:fail channel_read\n");\r
91                 return _PACKET_FAIL;\r
92         }\r
93         if(hasRead < sizeof(PACKET_HEAD))\r
94         {\r
95                 printf("NVITEM:fail PACKET_HEAD\n");\r
96                 return _PACKET_SKIP;\r
97         }\r
98         if(_MAGICNUM != _packetHead->MAGICNUM){\r
99                 printf("NVITEM:fail _MAGICNUM\n");\r
100                 return _PACKET_SKIP;\r
101         }\r
102         if(!__chkEcc(0,0,0)){\r
103                 printf("NVITEM:fail ECC\n");\r
104                 return _PACKET_SKIP;\r
105         }\r
106         if(hasRead < (sizeof(PACKET_HEAD)+_packetHead->sizeOfPacket))\r
107         {\r
108                 printf("NVITEM:fail SIZE\n");\r
109                 return _PACKET_SKIP;\r
110         }\r
111 //----------------------------------------------------------\r
112 if(0)\r
113 {\r
114         uint32 i;\r
115         printf("----------");\r
116         for(i = 0; i < (sizeof(PACKET_HEAD)+_packetHead->sizeOfPacket); i++)\r
117         {\r
118                 if(!(i%8))\r
119                 {\r
120                         if(!(i%32))\r
121                         {\r
122                                 printf(" \n ");\r
123                         }\r
124                         printf(" | ");\r
125                 }\r
126                 printf("%2x ",packeBuf[i]);\r
127         }\r
128         printf("\n----------\n");\r
129 }\r
130 //----------------------------------------------------------\r
131         if(_idxGrp == _packetHead->idxGrp)\r
132         {\r
133                 if(_idxSub+1 == _packetHead->idxSub)\r
134                 {\r
135                         _idxSub++;\r
136                         *buf    = _packetBody;\r
137                         *size   = _packetHead->sizeOfPacket;\r
138 //                      __sendPacketRsp(_packetHead, 1);\r
139                         printf("NVITEM _getPacket continue read %d size %d grp %d sub %d\n",hasRead,_packetHead->sizeOfPacket,_packetHead->idxGrp,_packetHead->idxSub);\r
140                         return _PACKET_CONTINUE;\r
141                 }\r
142                 else\r
143                 {\r
144                         printf("NVITEM:fail GROUP %d %d %d %d\n",_idxGrp,_idxSub,_packetHead->idxGrp,_packetHead->idxSub);\r
145                         return _PACKET_SKIP;\r
146                 }\r
147         }\r
148         else\r
149         {\r
150                 if(0 == _packetHead->idxSub)\r
151                 {\r
152                         _idxGrp = _packetHead->idxGrp;\r
153                         _idxSub = 0;\r
154                         *buf    = _packetBody;\r
155                         *size   = _packetHead->sizeOfPacket;\r
156 //                      __sendPacketRsp(_packetHead, 1);\r
157                         printf("NVITEM _getPacket start read %d size %d grp %d sub %d\n",hasRead,_packetHead->sizeOfPacket,_packetHead->idxGrp,_packetHead->idxSub);\r
158                         return _PACKET_START;\r
159                 }\r
160                 else\r
161                 {\r
162                         printf("NVITEM:fail SUB %d %d %d %d\n",_idxGrp,_idxSub,_packetHead->idxGrp,_packetHead->idxSub);\r
163                         return _PACKET_SKIP;\r
164                 }\r
165         }\r
166 }\r
167 \r
168 void _sendPacktRsp(uint8 rsp)\r
169 {\r
170         __sendPacketRsp( _packetHead, rsp);\r
171 }