| package parser |
| |
| import ( |
| "fmt" |
| "strings" |
| "unicode" |
| ) |
| |
| type template func(string, *string, *string, *uint32, *uint32) int |
| |
| // extractPadFuncFromComment |
| // line : string from file with pad config map |
| // return : pad function string |
| func extractPadFuncFromComment(line string) string { |
| if !strings.Contains(line, "/*") && !strings.Contains(line, "*/") { |
| return "" |
| } |
| |
| fields := strings.Fields(line) |
| for i, field := range fields { |
| if field == "/*" && len(fields) >= i+2 { |
| return fields[i+1] |
| } |
| } |
| return "" |
| } |
| |
| // tokenCheck |
| func tokenCheck(c rune) bool { |
| return c != '_' && c != '#' && !unicode.IsLetter(c) && !unicode.IsNumber(c) |
| } |
| |
| // useGpioHTemplate |
| // line : string from file with pad config map |
| // *function : the string that means the pad function |
| // *id : pad id string |
| // *dw0 : DW0 register value |
| // *dw1 : DW1 register value |
| // return |
| // error status |
| func useInteltoolLogTemplate(line string, function *string, |
| id *string, dw0 *uint32, dw1 *uint32) int { |
| |
| var val uint64 |
| // 0x0520: 0x0000003c44000600 GPP_B12 SLP_S0# |
| // 0x0438: 0xffffffffffffffff GPP_C7 RESERVED |
| if fields := strings.FieldsFunc(line, tokenCheck); len(fields) >= 4 { |
| fmt.Sscanf(fields[1], "0x%x", &val) |
| *dw0 = uint32(val & 0xffffffff) |
| *dw1 = uint32(val >> 32) |
| *id = fields[2] |
| *function = fields[3] |
| // Sometimes the configuration file contains compound functions such as |
| // SUSWARN#/SUSPWRDNACK. Since the template does not take this into account, |
| // need to collect all parts of the pad function back into a single word |
| for i := 4; i < len(fields); i++ { |
| *function += "/" + fields[i] |
| } |
| // clear RO Interrupt Select (INTSEL) |
| *dw1 &= 0xffffff00 |
| } |
| return 0 |
| } |
| |
| // useGpioHTemplate |
| // line : string from file with pad config map |
| // *function : the string that means the pad function |
| // *id : pad id string |
| // *dw0 : DW0 register value |
| // *dw1 : DW1 register value |
| // return |
| // error status |
| func useGpioHTemplate(line string, function *string, |
| id *string, dw0 *uint32, dw1 *uint32) int { |
| |
| // /* RCIN# */ _PAD_CFG_STRUCT(GPP_A0, 0x44000702, 0x00000000), |
| // _PAD_CFG_STRUCT(GPP_A0, 0x44000702, 0x00000000), /* RCIN# */ |
| // _PAD_CFG_STRUCT(GPP_A0, 0x44000702, 0x00000000) |
| fields := strings.FieldsFunc(line, tokenCheck) |
| for i, field := range fields { |
| if field == "_PAD_CFG_STRUCT" { |
| if len(fields) < 4 { |
| /* the number of definitions does not match the format */ |
| return -1 |
| } |
| |
| if !strings.Contains(fields[i+2], "0x") || !strings.Contains(fields[i+3], "0x") { |
| /* definitions inside the macro do not match the pattern */ |
| return -1 |
| } |
| *id = fields[i+1] |
| fmt.Sscanf(fields[i+2], "0x%x", dw0) |
| fmt.Sscanf(fields[i+3], "0x%x", dw1) |
| *function = extractPadFuncFromComment(line) |
| return 0 |
| } |
| } |
| return -1 |
| } |
| |
| // useYourTemplate |
| func useYourTemplate(line string, function *string, |
| id *string, dw0 *uint32, dw1 *uint32) int { |
| |
| // ADD YOUR TEMPLATE HERE |
| *function = "" |
| *id = "" |
| *dw0 = 0 |
| *dw1 = 0 |
| |
| fmt.Printf("ADD YOUR TEMPLATE!\n") |
| return -1 |
| } |
| |
| // registerInfoTemplate |
| // line : (in) string from file with pad config map |
| // *name : (out) register name |
| // *offset : (out) offset name |
| // *value : (out) register value |
| // return |
| // error status |
| func registerInfoTemplate(line string, name *string, offset *uint32, value *uint32) int { |
| // 0x0088: 0x00ffffff (HOSTSW_OWN_GPP_F) |
| // 0x0100: 0x00000000 (GPI_IS_GPP_A) |
| if fields := strings.FieldsFunc(line, tokenCheck); len(fields) == 3 { |
| *name = fields[2] |
| fmt.Sscanf(fields[1], "0x%x", value) |
| fmt.Sscanf(fields[0], "0x%x", offset) |
| return 0 |
| } |
| return -1 |
| } |