OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2004-2008 Atheros Communications Inc. | 2 * Copyright (c) 2004-2010 Atheros Communications Inc. |
3 * All rights reserved. | 3 * All rights reserved. |
4 * | 4 * |
5 * This file implements the Atheros PS and patch parser. | 5 * This file implements the Atheros PS and patch parser. |
6 * It implements APIs to parse data buffer with patch and PS information and con
vert it to HCI commands. | 6 * It implements APIs to parse data buffer with patch and PS information and con
vert it to HCI commands. |
7 * | 7 * |
8 * | 8 * |
9 * | 9 * |
10 * ar3kpsparser.c | 10 * ar3kpsparser.c |
11 * | 11 * |
12 * | 12 * |
13 * | 13 * |
14 * The software source and binaries included in this development package are | 14 * The software source and binaries included in this development package are |
15 * licensed, not sold. You, or your company, received the package under one | 15 * licensed, not sold. You, or your company, received the package under one |
16 * or more license agreements. The rights granted to you are specifically | 16 * or more license agreements. The rights granted to you are specifically |
17 * listed in these license agreement(s). All other rights remain with Atheros | 17 * listed in these license agreement(s). All other rights remain with Atheros |
18 * Communications, Inc., its subsidiaries, or the respective owner including | 18 * Communications, Inc., its subsidiaries, or the respective owner including |
19 * those listed on the included copyright notices.. Distribution of any | 19 * those listed on the included copyright notices.. Distribution of any |
20 * portion of this package must be in strict compliance with the license | 20 * portion of this package must be in strict compliance with the license |
21 * agreement(s) terms. | 21 * agreement(s) terms. |
22 * | 22 * |
23 * | 23 * |
24 * | 24 * |
25 */ | 25 */ |
26 | 26 |
27 | 27 |
28 #include "ar3kpsparser.h" | 28 #include "ar3kpsparser.h" |
29 | 29 |
| 30 #include <linux/ctype.h> |
| 31 #include <linux/kernel.h> |
| 32 |
30 #define BD_ADDR_SIZE 6 | 33 #define BD_ADDR_SIZE 6 |
31 #define WRITE_PATCH 8 | 34 #define WRITE_PATCH 8 |
32 #define ENABLE_PATCH 11 | 35 #define ENABLE_PATCH 11 |
33 #define PS_RESET 2 | 36 #define PS_RESET 2 |
34 #define PS_WRITE 1 | 37 #define PS_WRITE 1 |
35 #define PS_VERIFY_CRC 9 | 38 #define PS_VERIFY_CRC 9 |
36 #define CHANGE_BDADDR 15 | 39 #define CHANGE_BDADDR 15 |
37 | 40 |
38 #define HCI_COMMAND_HEADER 7 | 41 #define HCI_COMMAND_HEADER 7 |
39 | 42 |
(...skipping 14 matching lines...) Expand all Loading... |
54 | 57 |
55 /* Constant values used by parser */ | 58 /* Constant values used by parser */ |
56 #define BYTES_OF_PS_DATA_PER_LINE 16 | 59 #define BYTES_OF_PS_DATA_PER_LINE 16 |
57 #define RAMPS_MAX_PS_DATA_PER_TAG 20000 | 60 #define RAMPS_MAX_PS_DATA_PER_TAG 20000 |
58 | 61 |
59 | 62 |
60 /* Number pf PS/Patch entries in an HCI packet */ | 63 /* Number pf PS/Patch entries in an HCI packet */ |
61 #define MAX_BYTE_LENGTH 244 | 64 #define MAX_BYTE_LENGTH 244 |
62 | 65 |
63 #define SKIP_BLANKS(str) while (*str == ' ') str++ | 66 #define SKIP_BLANKS(str) while (*str == ' ') str++ |
64 #define MIN(x, y) (((x) <= (y))? (x):(y)) | |
65 #define MAX(x, y) (((x) >= (y))? (x):(y)) | |
66 | |
67 #define UNUSED(x) (x=x) | |
68 | |
69 #define IS_BETWEEN(x, lower, upper) (((lower) <= (x)) && ((x) <= (upper))) | |
70 #define IS_DIGIT(c) (IS_BETWEEN((c), '0', '9')) | |
71 #define IS_HEX(c) (IS_BETWEEN((c), '0', '9') || IS_BETWEEN((c), 'a', 'f') || I
S_BETWEEN((c), 'A', 'F')) | |
72 #define TO_LOWER(c) (IS_BETWEEN((c), 'A', 'Z') ? ((c) - 'A' + 'a') : (c)) | |
73 #define IS_BLANK(c) ((c) == ' ') | |
74 #define CONV_DEC_DIGIT_TO_VALUE(c) ((c) - '0') | |
75 #define CONV_HEX_DIGIT_TO_VALUE(c) (IS_DIGIT(c) ? ((c) - '0') : (IS_BETWEEN((c),
'A', 'Z') ? ((c) - 'A' + 10) : ((c) - 'a' + 10))) | |
76 #define CONV_VALUE_TO_HEX(v) ((A_UINT8)( ((v & 0x0F) <= 9) ? ((v & 0x0F) + '0')
: ((v & 0x0F) - 10 + 'A') ) ) | |
77 | |
78 | 67 |
79 enum MinBootFileFormatE | 68 enum MinBootFileFormatE |
80 { | 69 { |
81 MB_FILEFORMAT_RADIOTBL, | 70 MB_FILEFORMAT_RADIOTBL, |
82 MB_FILEFORMAT_PATCH, | 71 MB_FILEFORMAT_PATCH, |
83 MB_FILEFORMAT_COEXCONFIG | 72 MB_FILEFORMAT_COEXCONFIG |
84 }; | 73 }; |
85 | 74 |
86 enum RamPsSection | 75 enum RamPsSection |
87 { | 76 { |
(...skipping 388 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
476 stReadStatus.uCharCount++; | 465 stReadStatus.uCharCount++; |
477 } else { | 466 } else { |
478 stReadStatus.uCharCount = 0; | 467 stReadStatus.uCharCount = 0; |
479 } | 468 } |
480 } | 469 } |
481 uReadCount = (ByteCount > BYTES_OF_PS_DATA_PER_LINE)? BYTES_
OF_PS_DATA_PER_LINE: ByteCount; | 470 uReadCount = (ByteCount > BYTES_OF_PS_DATA_PER_LINE)? BYTES_
OF_PS_DATA_PER_LINE: ByteCount; |
482 //AR_DEBUG_PRINTF(ATH_DEBUG_ERR,(" ")); | 471 //AR_DEBUG_PRINTF(ATH_DEBUG_ERR,(" ")); |
483 if((stPS_DataFormat.eDataType == eHex) && stPS_DataFormat.bI
sArray == true) { | 472 if((stPS_DataFormat.eDataType == eHex) && stPS_DataFormat.bI
sArray == true) { |
484 while(uReadCount > 0) { | 473 while(uReadCount > 0) { |
485 PsTagEntry[TagCount].TagData[stReadStatus.uByteCount]
= | 474 PsTagEntry[TagCount].TagData[stReadStatus.uByteCount]
= |
486 (A_UINT8)(CONV_HEX_DIGIT_TO
_VALUE(pCharLine[stReadStatus.uCharCount]) << 4) | 475 (A_UINT8)(hex_to_bin(pCharL
ine[stReadStatus.uCharCount]) << 4) |
487 | (A_UINT8)(CONV_HEX_DIGIT_
TO_VALUE(pCharLine[stReadStatus.uCharCount + 1])); | 476 | (A_UINT8)(hex_to_bin(pCha
rLine[stReadStatus.uCharCount + 1])); |
488 | 477 |
489 PsTagEntry[TagCount].TagData[stReadStatus.uByteCount+
1] = | 478 PsTagEntry[TagCount].TagData[stReadStatus.uByteCount+
1] = |
490 (A_UINT8)(CONV_HEX_DIGIT_TO
_VALUE(pCharLine[stReadStatus.uCharCount + 3]) << 4) | 479 (A_UINT8)(hex_to_bin(pCharL
ine[stReadStatus.uCharCount + 3]) << 4) |
491 | (A_UINT8)(CONV_HEX_DIGIT_
TO_VALUE(pCharLine[stReadStatus.uCharCount + 4])); | 480 | (A_UINT8)(hex_to_bin(pCha
rLine[stReadStatus.uCharCount + 4])); |
492 | 481 |
493 stReadStatus.uCharCount += 6; // read two bytes, plus
a space; | 482 stReadStatus.uCharCount += 6; // read two bytes, plus
a space; |
494 stReadStatus.uByteCount += 2; | 483 stReadStatus.uByteCount += 2; |
495 uReadCount -= 2; | 484 uReadCount -= 2; |
496 } | 485 } |
497 if(ByteCount > BYTES_OF_PS_DATA_PER_LINE) { | 486 if(ByteCount > BYTES_OF_PS_DATA_PER_LINE) { |
498 ByteCount -= BYTES_OF_PS_DATA_PER_LINE; | 487 ByteCount -= BYTES_OF_PS_DATA_PER_LINE; |
499 } | 488 } |
500 else { | 489 else { |
501 ByteCount = 0; | 490 ByteCount = 0; |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
567 | 556 |
568 | 557 |
569 /********************/ | 558 /********************/ |
570 | 559 |
571 | 560 |
572 A_STATUS GetNextTwoChar(A_UCHAR *srcbuffer,A_UINT32 len, A_UINT32 *pos, char * b
uffer) | 561 A_STATUS GetNextTwoChar(A_UCHAR *srcbuffer,A_UINT32 len, A_UINT32 *pos, char * b
uffer) |
573 { | 562 { |
574 unsigned char ch; | 563 unsigned char ch; |
575 | 564 |
576 ch = AthReadChar(srcbuffer,len,pos); | 565 ch = AthReadChar(srcbuffer,len,pos); |
577 if(ch != '\0' && IS_HEX(ch)) { | 566 if(ch != '\0' && isxdigit(ch)) { |
578 buffer[0] = ch; | 567 buffer[0] = ch; |
579 } else | 568 } else |
580 { | 569 { |
581 return A_ERROR; | 570 return A_ERROR; |
582 } | 571 } |
583 ch = AthReadChar(srcbuffer,len,pos); | 572 ch = AthReadChar(srcbuffer,len,pos); |
584 if(ch != '\0' && IS_HEX(ch)) { | 573 if(ch != '\0' && isxdigit(ch)) { |
585 buffer[1] = ch; | 574 buffer[1] = ch; |
586 } else | 575 } else |
587 { | 576 { |
588 return A_ERROR; | 577 return A_ERROR; |
589 } | 578 } |
590 return A_OK; | 579 return A_OK; |
591 } | 580 } |
592 | 581 |
593 A_STATUS AthDoParsePatch(A_UCHAR *patchbuffer, A_UINT32 patchlen) | 582 A_STATUS AthDoParsePatch(A_UCHAR *patchbuffer, A_UINT32 patchlen) |
594 { | 583 { |
595 | 584 |
596 char Byte[3]; | 585 char Byte[3]; |
597 char Line[MAX_BYTE_LENGTH + 1]; | 586 char Line[MAX_BYTE_LENGTH + 1]; |
598 int ByteCount,ByteCount_Org; | 587 int ByteCount,ByteCount_Org; |
599 int count; | 588 int count; |
600 int i,j,k; | 589 int i,j,k; |
601 int data; | 590 int data; |
602 A_UINT32 filepos; | 591 A_UINT32 filepos; |
603 Byte[2] = '\0'; | 592 Byte[2] = '\0'; |
604 j = 0; | 593 j = 0; |
605 filepos = 0; | 594 filepos = 0; |
606 Patch_Count = 0; | 595 Patch_Count = 0; |
607 | 596 |
608 while(NULL != AthGetLine(Line,MAX_BYTE_LENGTH,patchbuffer,patchlen,&filepos)
) { | 597 while(NULL != AthGetLine(Line,MAX_BYTE_LENGTH,patchbuffer,patchlen,&filepos)
) { |
609 if(strlen(Line) <= 1 || !IS_HEX(Line[0])) { | 598 if(strlen(Line) <= 1 || !isxdigit(Line[0])) { |
610 continue; | 599 continue; |
611 } else { | 600 } else { |
612 break; | 601 break; |
613 } | 602 } |
614 } | 603 } |
615 ByteCount = A_STRTOL(Line, NULL, 16); | 604 ByteCount = A_STRTOL(Line, NULL, 16); |
616 ByteCount_Org = ByteCount; | 605 ByteCount_Org = ByteCount; |
617 | 606 |
618 while(ByteCount > MAX_BYTE_LENGTH){ | 607 while(ByteCount > MAX_BYTE_LENGTH){ |
619 | 608 |
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
789 Crc |= RAM_PATCH_REGION; | 778 Crc |= RAM_PATCH_REGION; |
790 if(Tag_Count > 0) | 779 if(Tag_Count > 0) |
791 Crc |= RAM_PS_REGION; | 780 Crc |= RAM_PS_REGION; |
792 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("PS Thread Started CRC %x Patch Count %d Tag
Count %d \n",Crc,Patch_Count,Tag_Count)); | 781 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("PS Thread Started CRC %x Patch Count %d Tag
Count %d \n",Crc,Patch_Count,Tag_Count)); |
793 | 782 |
794 if(Patch_Count || Tag_Count ){ | 783 if(Patch_Count || Tag_Count ){ |
795 NumcmdEntry+=(2 + Patch_Count + Tag_Count); /* CRC Packet + PS Reset Packet
+ Patch List + PS List*/ | 784 NumcmdEntry+=(2 + Patch_Count + Tag_Count); /* CRC Packet + PS Reset Packet
+ Patch List + PS List*/ |
796 if(Patch_Count > 0) { | 785 if(Patch_Count > 0) { |
797 NumcmdEntry++; /* Patch Enable Command */ | 786 NumcmdEntry++; /* Patch Enable Command */ |
798 } | 787 } |
799 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("Num Cmd Entries %d Size %d \r\n",Nu
mcmdEntry,sizeof(PSCmdPacket) * NumcmdEntry)); | 788 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("Num Cmd Entries %d Size %d \r\n",Nu
mcmdEntry,(A_UINT32)sizeof(PSCmdPacket) * NumcmdEntry)); |
800 (*HciPacketList) = A_MALLOC(sizeof(PSCmdPacket) * NumcmdEntry); | 789 (*HciPacketList) = A_MALLOC(sizeof(PSCmdPacket) * NumcmdEntry); |
801 if(NULL == *HciPacketList) { | 790 if(NULL == *HciPacketList) { |
802 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("memory allocation failed \r\n"))
; | 791 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("memory allocation failed \r\n"))
; |
803 } | 792 } |
804 AthPSCreateHCICommand(PS_VERIFY_CRC,Crc,*HciPacketList,numPackets); | 793 AthPSCreateHCICommand(PS_VERIFY_CRC,Crc,*HciPacketList,numPackets); |
805 if(Patch_Count > 0){ | 794 if(Patch_Count > 0){ |
806 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("*** Write Patch**** \r\n")); | 795 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("*** Write Patch**** \r\n")); |
807 AthPSCreateHCICommand(WRITE_PATCH,Patch_Count,*HciPacketList,num
Packets); | 796 AthPSCreateHCICommand(WRITE_PATCH,Patch_Count,*HciPacketList,num
Packets); |
808 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("*** Enable Patch**** \r\n")); | 797 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("*** Enable Patch**** \r\n")); |
809 AthPSCreateHCICommand(ENABLE_PATCH,0,*HciPacketList,numPackets); | 798 AthPSCreateHCICommand(ENABLE_PATCH,0,*HciPacketList,numPackets); |
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
971 int i; | 960 int i; |
972 if(*HciPacketList == NULL) { | 961 if(*HciPacketList == NULL) { |
973 return A_ERROR; | 962 return A_ERROR; |
974 } | 963 } |
975 for(i = 0; i < numPackets;i++) { | 964 for(i = 0; i < numPackets;i++) { |
976 A_FREE((*HciPacketList)[i].Hcipacket); | 965 A_FREE((*HciPacketList)[i].Hcipacket); |
977 } | 966 } |
978 A_FREE(*HciPacketList); | 967 A_FREE(*HciPacketList); |
979 return A_OK; | 968 return A_OK; |
980 } | 969 } |
OLD | NEW |