diff options
Diffstat (limited to 'libqcdm/src')
-rw-r--r-- | libqcdm/src/commands.c | 101 | ||||
-rw-r--r-- | libqcdm/src/commands.h | 28 | ||||
-rw-r--r-- | libqcdm/src/nv-items.h | 20 |
3 files changed, 146 insertions, 3 deletions
diff --git a/libqcdm/src/commands.c b/libqcdm/src/commands.c index 47b517de..ab61ee51 100644 --- a/libqcdm/src/commands.c +++ b/libqcdm/src/commands.c @@ -873,6 +873,107 @@ qcdm_cmd_nv_set_mode_pref_result (const char *buf, gsize len, GError **error) /**********************************************************************/ +static gboolean +hdr_rev_pref_validate (guint8 dm) +{ + if ( dm == DIAG_NV_HDR_REV_PREF_0 + || dm == DIAG_NV_HDR_REV_PREF_A + || dm == DIAG_NV_HDR_REV_PREF_EHRPD) + return TRUE; + return FALSE; +} + +gsize +qcdm_cmd_nv_get_hdr_rev_pref_new (char *buf, gsize len, GError **error) +{ + char cmdbuf[sizeof (DMCmdNVReadWrite) + 2]; + DMCmdNVReadWrite *cmd = (DMCmdNVReadWrite *) &cmdbuf[0]; + + g_return_val_if_fail (buf != NULL, 0); + g_return_val_if_fail (len >= sizeof (*cmd) + DIAG_TRAILER_LEN, 0); + + memset (cmd, 0, sizeof (*cmd)); + cmd->code = DIAG_CMD_NV_READ; + cmd->nv_item = GUINT16_TO_LE (DIAG_NV_HDR_REV_PREF); + + return dm_encapsulate_buffer (cmdbuf, sizeof (*cmd), sizeof (cmdbuf), buf, len); +} + +QCDMResult * +qcdm_cmd_nv_get_hdr_rev_pref_result (const char *buf, gsize len, GError **error) +{ + QCDMResult *result = NULL; + DMCmdNVReadWrite *rsp = (DMCmdNVReadWrite *) buf; + DMNVItemHdrRevPref *rev; + + g_return_val_if_fail (buf != NULL, NULL); + + if (!check_command (buf, len, DIAG_CMD_NV_READ, sizeof (DMCmdNVReadWrite), error)) + return NULL; + + if (!check_nv_cmd (rsp, DIAG_NV_HDR_REV_PREF, error)) + return NULL; + + rev = (DMNVItemHdrRevPref *) &rsp->data[0]; + + if (!hdr_rev_pref_validate (rev->rev_pref)) { + g_set_error (error, QCDM_COMMAND_ERROR, QCDM_COMMAND_BAD_PARAMETER, + "Unknown HDR revision preference 0x%X", + rev->rev_pref); + return NULL; + } + + result = qcdm_result_new (); + qcdm_result_add_uint8 (result, QCDM_CMD_NV_GET_HDR_REV_PREF_ITEM_REV_PREF, rev->rev_pref); + + return result; +} + +gsize +qcdm_cmd_nv_set_hdr_rev_pref_new (char *buf, + gsize len, + guint8 rev_pref, + GError **error) +{ + char cmdbuf[sizeof (DMCmdNVReadWrite) + 2]; + DMCmdNVReadWrite *cmd = (DMCmdNVReadWrite *) &cmdbuf[0]; + DMNVItemHdrRevPref *req; + + g_return_val_if_fail (buf != NULL, 0); + g_return_val_if_fail (len >= sizeof (*cmd) + DIAG_TRAILER_LEN, 0); + + if (!hdr_rev_pref_validate (rev_pref)) { + g_set_error (error, QCDM_COMMAND_ERROR, QCDM_COMMAND_BAD_PARAMETER, + "Invalid HDR revision preference %d", rev_pref); + return 0; + } + + memset (cmd, 0, sizeof (*cmd)); + cmd->code = DIAG_CMD_NV_WRITE; + cmd->nv_item = GUINT16_TO_LE (DIAG_NV_HDR_REV_PREF); + + req = (DMNVItemHdrRevPref *) &cmd->data[0]; + req->rev_pref = rev_pref; + + return dm_encapsulate_buffer (cmdbuf, sizeof (*cmd), sizeof (cmdbuf), buf, len); +} + +QCDMResult * +qcdm_cmd_nv_set_hdr_rev_pref_result (const char *buf, gsize len, GError **error) +{ + g_return_val_if_fail (buf != NULL, NULL); + + if (!check_command (buf, len, DIAG_CMD_NV_WRITE, sizeof (DMCmdNVReadWrite), error)) + return NULL; + + if (!check_nv_cmd ((DMCmdNVReadWrite *) buf, DIAG_NV_HDR_REV_PREF, error)) + return NULL; + + return qcdm_result_new (); +} + +/**********************************************************************/ + gsize qcdm_cmd_cm_subsys_state_info_new (char *buf, gsize len, GError **error) { diff --git a/libqcdm/src/commands.h b/libqcdm/src/commands.h index 50a6f49a..e17a8677 100644 --- a/libqcdm/src/commands.h +++ b/libqcdm/src/commands.h @@ -300,6 +300,34 @@ QCDMResult *qcdm_cmd_nv_set_mode_pref_result (const char *buf, /**********************************************************************/ +/* Values for QCDM_CMD_NV_GET_HDR_REV_PREF_ITEM_REV_PREF */ +enum { + QCDM_CMD_NV_HDR_REV_PREF_ITEM_REV_PREF_0 = 0x00, + QCDM_CMD_NV_HDR_REV_PREF_ITEM_REV_PREF_A = 0x01, + QCDM_CMD_NV_HDR_REV_PREF_ITEM_REV_PREF_EHRPD = 0x04, +}; + +#define QCDM_CMD_NV_GET_HDR_REV_PREF_ITEM_REV_PREF "rev-pref" + +gsize qcdm_cmd_nv_get_hdr_rev_pref_new (char *buf, + gsize len, + GError **error); + +QCDMResult *qcdm_cmd_nv_get_hdr_rev_pref_result (const char *buf, + gsize len, + GError **error); + +gsize qcdm_cmd_nv_set_hdr_rev_pref_new (char *buf, + gsize len, + guint8 rev_pref, + GError **error); + +QCDMResult *qcdm_cmd_nv_set_hdr_rev_pref_result (const char *buf, + gsize len, + GError **error); + +/**********************************************************************/ + /* Values for QCDM_CMD_CM_SUBSYS_STATE_INFO_ITEM_OPERATING_MODE */ enum { QCDM_CMD_CM_SUBSYS_STATE_INFO_OPERATING_MODE_ONLINE = 5 diff --git a/libqcdm/src/nv-items.h b/libqcdm/src/nv-items.h index 5465d33e..8240866a 100644 --- a/libqcdm/src/nv-items.h +++ b/libqcdm/src/nv-items.h @@ -19,9 +19,10 @@ #define LIBQCDM_NV_ITEMS_H enum { - DIAG_NV_MODE_PREF = 10, /* Mode preference: 1x, HDR, auto */ - DIAG_NV_DIR_NUMBER = 178, /* Mobile Directory Number (MDN) */ - DIAG_NV_ROAM_PREF = 442, /* Roaming preference */ + DIAG_NV_MODE_PREF = 10, /* Mode preference: 1x, HDR, auto */ + DIAG_NV_DIR_NUMBER = 178, /* Mobile Directory Number (MDN) */ + DIAG_NV_ROAM_PREF = 442, /* Roaming preference */ + DIAG_NV_HDR_REV_PREF = 4964, /* HDR mode preference(?): rev0, revA, eHRPD */ }; @@ -63,5 +64,18 @@ struct DMNVItemRoamPref { } __attribute__ ((packed)); typedef struct DMNVItemRoamPref DMNVItemRoamPref; +/* HDR Revision preference values (?) */ +enum { + DIAG_NV_HDR_REV_PREF_0 = 0x00, + DIAG_NV_HDR_REV_PREF_A = 0x01, + DIAG_NV_HDR_REV_PREF_EHRPD = 0x04, +}; + +/* DIAG_NV_HDR_REV_PREF */ +struct DMNVItemHdrRevPref { + guint8 rev_pref; +} __attribute__ ((packed)); +typedef struct DMNVItemHdrRevPref DMNVItemHdrRevPref; + #endif /* LIBQCDM_NV_ITEMS_H */ |