static int wmt_dev_dbg_write(struct file *file, const char *buffer, unsigned long count, void *data){ CHAR buf[256]; CHAR *pBuf; ULONG len = count; INT32 x = 0,y = 0, z=0; CHAR *pToken = NULL; CHAR *pDelimiter = " \t"; WMT_INFO_FUNC("write parameter len = %d\n\r", (int)len); if(len >= osal_sizeof(buf)){ WMT_ERR_FUNC("input handling fail!\n"); len = osal_sizeof(buf) - 1; return -1; } if(copy_from_user(buf, buffer, len)){ return -EFAULT; } buf[len] = '\0'; WMT_INFO_FUNC("write parameter data = %s\n\r", buf); pBuf = buf; pToken = osal_strsep(&pBuf, pDelimiter); x = NULL != pToken ? osal_strtol(pToken, NULL, 16) : 0; pToken = osal_strsep(&pBuf, "\t\n "); if(pToken != NULL){ y = osal_strtol(pToken, NULL, 16); WMT_INFO_FUNC("y = 0x%08x \n\r", y); } else { y = 3000; /*efuse, register read write default value*/ if(0x11 == x || 0x12 == x || 0x13 == x) { y = 0x80000000; } } pToken = osal_strsep(&pBuf, "\t\n "); if(pToken != NULL){ z = osal_strtol(pToken, NULL, 16); } else { z = 10; /*efuse, register read write default value*/ if(0x11 == x || 0x12 == x || 0x13 == x) { z = 0xffffffff; } } WMT_INFO_FUNC("x(0x%08x), y(0x%08x), z(0x%08x)\n\r", x, y, z); if (osal_array_size(wmt_dev_dbg_func) > x && NULL != wmt_dev_dbg_func[x]) { (*wmt_dev_dbg_func[x])(x, y, z); } else { WMT_WARN_FUNC("no handler defined for command id(0x%08x)\n\r", x); } return len; }
static INT32 wmt_conf_parse(P_DEV_WMT pWmtDev, const PINT8 pInBuf, UINT32 size) { PINT8 pch; PINT8 pBuf; PINT8 pLine; PINT8 pKey; PINT8 pVal; PINT8 pPos; INT32 ret = 0; INT32 i = 0; PINT8 pa = NULL; pBuf = osal_malloc(size); if (!pBuf) return -1; osal_memcpy(pBuf, pInBuf, size); pBuf[size] = '\0'; pch = pBuf; /* pch is to be updated by strsep(). Keep pBuf unchanged!! */ #if 0 { PINT8 buf_ptr = pBuf; INT32 k = 0; WMT_INFO_FUNC("%s len=%d", "wmcfg.content:", size); for (k = 0; k < size; k++) { /* if(k%16 == 0) WMT_INFO_FUNC("\n"); */ WMT_INFO_FUNC("%c", buf_ptr[k]); } WMT_INFO_FUNC("--end\n"); } #endif while ((pLine = osal_strsep(&pch, "\r\n")) != NULL) { /* pch is updated to the end of pLine by strsep() and updated to '\0' */ /*WMT_INFO_FUNC("strsep offset(%d), char(%d, '%c' )\n", pLine-pBuf, *pLine, *pLine); */ /* parse each line */ /* WMT_INFO_FUNC("==> Line = (%s)\n", pLine); */ if (!*pLine) continue; pVal = osal_strchr(pLine, '='); if (!pVal) { WMT_WARN_FUNC("mal-format cfg string(%s)\n", pLine); continue; } /* |<-pLine->|'='<-pVal->|'\n' ('\0')| */ *pVal = '\0'; /* replace '=' with '\0' to get key */ /* |<-pKey->|'\0'|<-pVal->|'\n' ('\0')| */ pKey = pLine; if ((pVal - pBuf) < size) pVal++; /*key handling */ pPos = pKey; /*skip space characeter */ while (((*pPos) == ' ') || ((*pPos) == '\t') || ((*pPos) == '\n')) { if ((pPos - pBuf) >= size) break; pPos++; } /*key head */ pKey = pPos; while (((*pPos) != ' ') && ((*pPos) != '\t') && ((*pPos) != '\0') && ((*pPos) != '\n')) { if ((pPos - pBuf) >= size) break; pPos++; } /*key tail */ (*pPos) = '\0'; /*value handling */ pPos = pVal; /*skip space characeter */ while (((*pPos) == ' ') || ((*pPos) == '\t') || ((*pPos) == '\n')) { if ((pPos - pBuf) >= size) break; pPos++; } /*value head */ pVal = pPos; while (((*pPos) != ' ') && ((*pPos) != '\t') && ((*pPos) != '\0') && ((*pPos) != '\n')) { if ((pPos - pBuf) >= size) break; pPos++; } /*value tail */ (*pPos) = '\0'; /* WMT_DBG_FUNC("parse (key: #%s#, value: #%s#)\n", pKey, pVal); */ ret = wmt_conf_parse_pair(pWmtDev, pKey, pVal); WMT_WARN_FUNC("parse (%s, %s, %d)\n", pKey, pVal, ret); if (ret) WMT_WARN_FUNC("parse fail (%s, %s, %d)\n", pKey, pVal, ret); } for (i = 0; i < NUM_WMTCFG_FIELDS; i++) { const struct parse_data *field = &wmtcfg_fields[i]; pa = field->writer(pWmtDev, field); if (pa) { WMT_DBG_FUNC("#%d(%s)=>%s\n", i, field->name, pa); osal_free(pa); } else { WMT_ERR_FUNC("failed to parse '%s'.\n", field->name); } } osal_free(pBuf); return 0; }