tizen 2.4 release
[kernel/u-boot-tm1.git] / nvitem / nvitem_channel.c
1 \r
2 #include "nvitem_common.h"\r
3 #include "nvitem_channel.h"\r
4 \r
5 #ifndef WIN32\r
6 #define CHANNEL_HEADER_TAG      0x7e7f\r
7 #define CHANNEL_HEADER_TYPE     0xaa55\r
8 \r
9 typedef struct{\r
10         uint16 tag;
11         uint16 type;
12         uint32 length;
13         uint32 frame_num;
14         uint32 reserved;
15 }CHANNEL_PACKET_HEADER;\r
16 \r
17 #define _REV_BUFSIZE    4096\r
18 static uint8                                     _revBuf[_REV_BUFSIZE];\r
19 static CHANNEL_PACKET_HEADER    *_revHeader;\r
20 static uint8                                    *_revBody;\r
21 #define _SEND_BUFSIZE   4096\r
22 static uint8                                    _sendBuf[_SEND_BUFSIZE];\r
23 static CHANNEL_PACKET_HEADER    *_sendHeader;\r
24 static uint8                                    *_sendBody;\r
25 \r
26 \r
27 static SDIO_HANDLE channel_fd = 0;\r
28 \r
29 void channel_open(void)\r
30 {\r
31         _revHeader = (CHANNEL_PACKET_HEADER*)_revBuf;\r
32         _revBody = &_revBuf[sizeof(CHANNEL_PACKET_HEADER)];\r
33         _sendHeader = (CHANNEL_PACKET_HEADER*)_sendBuf;\r
34         _sendBody = &_sendBuf[sizeof(CHANNEL_PACKET_HEADER)];\r
35         channel_fd =  sdio_open();\r
36         return;\r
37 }\r
38 \r
39 \r
40 BOOLEAN channel_read(uint8* buf, uint32 size, uint32* hasRead)\r
41 {\r
42         uint32 ifSuccess;\r
43         uint32 retRead;\r
44 \r
45         *hasRead = 0;\r
46         if(0 != gpio_get_value(CP_AP_RTS)){\r
47                 return 0;\r
48         }\r
49         do\r
50         {\r
51                 gpio_set_value(AP_CP_RDY, 1); // r\r
52                 gpio_set_value(AP_CP_RTS, 1);\r
53                 while(0 == gpio_get_value(CP_AP_RDY));\r
54 \r
55                 retRead = sdio_read(channel_fd,_revBuf,_REV_BUFSIZE);\r
56 \r
57                 printf("channel_read-0 retRead %x\n", retRead);         \r
58                 if((sizeof(CHANNEL_PACKET_HEADER)+size) > retRead){\r
59                         ifSuccess = 0;\r
60                 }\r
61                 else if(\r
62                         (CHANNEL_HEADER_TAG != _revHeader->tag)\r
63                         ||(CHANNEL_HEADER_TYPE != _revHeader->type)\r
64                         ||(_revHeader->length < size)\r
65                 ){\r
66                         ifSuccess = 0;\r
67                 }\r
68                 else{\r
69                         memcpy(buf,_revBody,size);\r
70                         *hasRead = size;\r
71                         ifSuccess = 1;\r
72                 }\r
73 \r
74                 printf("channel_read-0 ifSuccess %x\n", ifSuccess);             \r
75 \r
76                 if(ifSuccess) {\r
77                         gpio_set_value(AP_CP_RDY, 1);\r
78                         gpio_set_value(AP_CP_RTS, 0);\r
79                         while(1 == gpio_get_value(CP_AP_RDY));\r
80                         return 1;\r
81                 } else {\r
82                         gpio_set_value(AP_CP_RDY, 1);\r
83                         gpio_set_value(AP_CP_RTS, 0);\r
84                         while(1 == gpio_get_value(CP_AP_RDY));\r
85                         return 0;\r
86                 }\r
87         }while(0);\r
88 }\r
89 \r
90 BOOLEAN channel_write(uint8* buf, uint32 size, uint32* hasWrite)\r
91 {\r
92         uint32 ifSuccess;\r
93         uint32 retWrite;\r
94 \r
95         do{\r
96                 // prepare frame\r
97                 _sendHeader->tag = CHANNEL_HEADER_TAG;\r
98                 _sendHeader->type = CHANNEL_HEADER_TYPE;\r
99                 _sendHeader->length = size;\r
100                 _sendHeader->frame_num = 0;\r
101                 _sendHeader->reserved = 0xabcdef00;     // I don't understand how to use this member.  Jaons.Wu\r
102                 memcpy(_sendBody,buf,size);\r
103 \r
104                 gpio_set_value(AP_CP_RDY, 0); // w\r
105                 gpio_set_value(AP_CP_RTS, 1);\r
106                 while(0 == gpio_get_value(CP_AP_RDY));\r
107 \r
108                 retWrite = sdio_write(channel_fd,_sendBuf,_SEND_BUFSIZE);\r
109                 if((sizeof(CHANNEL_PACKET_HEADER)+size) > retWrite){\r
110                         ifSuccess = 0;\r
111                 }\r
112                 else{\r
113                         ifSuccess = 1;\r
114                 }\r
115                 if(ifSuccess) {\r
116                         gpio_set_value(AP_CP_RDY, 1);\r
117                         gpio_set_value(AP_CP_RTS, 0);\r
118                         while(1 == gpio_get_value(CP_AP_RDY));\r
119                         return 1;\r
120                 } else {\r
121                         gpio_set_value(AP_CP_RDY, 0);\r
122                         gpio_set_value(AP_CP_RTS, 0);\r
123                         while(1 == gpio_get_value(CP_AP_RDY));\r
124                         return 0;\r
125                 }\r
126         }while(0);\r
127 }\r
128 \r
129 void channel_close(void)\r
130 {\r
131         sdio_close(channel_fd);\r
132         return;\r
133 }\r
134 \r
135 #else\r
136 \r
137 #include <windows.h>\r
138 #include <Winnt.h>\r
139 #include <winioctl.h>\r
140 \r
141 #define FILENAME        "D:\\analyzer\\commonTools\\testCode\\testdata\\packet.bin"\r
142 static HANDLE hDevice;\r
143 #define CHANNEL_BUFSIZE 2048\r
144 static uint8 channelBuf[CHANNEL_BUFSIZE];\r
145 \r
146 \r
147 \r
148 void channel_open(void)\r
149 {\r
150 //      DWORD count;\r
151         unsigned __int32 offsetH,offsetL;\r
152 \r
153         do\r
154         {\r
155                 hDevice = CreateFile(FILENAME,  // drive to open\r
156                         GENERIC_READ|GENERIC_WRITE,                // no access to the drive\r
157                         FILE_SHARE_READ|FILE_SHARE_WRITE, \r
158                         NULL,             // default security attributes\r
159                         OPEN_EXISTING,    // disposition\r
160                         0, //FILE_FLAG_OVERLAPPED,                // file attributes\r
161                         NULL\r
162                 );            // do not copy file attributes\r
163                 if (hDevice == INVALID_HANDLE_VALUE) // cannot open the drive\r
164                 {\r
165                         Sleep(1);\r
166                         continue;\r
167                 }\r
168                 else\r
169                 {\r
170                         return;\r
171                 }\r
172         }while(1);\r
173 //      DeviceIoControl(hDevice,FSCTL_LOCK_VOLUME,   NULL,0,NULL,0,&count,NULL);\r
174 \r
175         offsetH = 0;\r
176         offsetL = 0;\r
177         SetFilePointer(hDevice,offsetL, &offsetH, FILE_BEGIN);\r
178 \r
179         return;\r
180 \r
181 }\r
182 \r
183 BOOLEAN channel_read(uint8* buf, uint32 size, uint32* hasRead)\r
184 {\r
185         DWORD lpNumberOfBytesRead;\r
186         BOOL bResult;\r
187 \r
188 //      DeviceIoControl(hDevice,FSCTL_LOCK_VOLUME,   NULL,0,NULL,0,&count,NULL);\r
189 \r
190         bResult = ReadFile(hDevice, channelBuf, CHANNEL_BUFSIZE, &lpNumberOfBytesRead, 0);\r
191 \r
192         if(1 != bResult)\r
193         {\r
194                 lpNumberOfBytesRead = GetLastError();\r
195                 return FALSE;\r
196         }\r
197 //      DeviceIoControl(hDevice,FSCTL_UNLOCK_VOLUME, NULL,0,NULL,0,&count,NULL);\r
198 \r
199         memcpy(buf,channelBuf,size);\r
200         *hasRead = (size<lpNumberOfBytesRead?size:lpNumberOfBytesRead);\r
201 \r
202         return TRUE;\r
203 }\r
204 \r
205 BOOLEAN channel_write(uint8* buf, uint32 size, uint32* hasWrite)\r
206 {\r
207         return TRUE;\r
208 }\r
209 \r
210 void channel_close(void)\r
211 {\r
212 //      DWORD count;\r
213 //      DeviceIoControl(hDevice,FSCTL_UNLOCK_VOLUME, NULL,0,NULL,0,&count,NULL);\r
214         CloseHandle(hDevice);\r
215         hDevice = 0;\r
216 \r
217         return;\r
218 }\r
219 \r
220 #endif\r
221 \r