/***************************************************************************//** * @brief axiadc_set_pnsel *******************************************************************************/ int axiadc_set_pnsel(struct axiadc_state *st, int channel, enum adc_pn_sel sel) { unsigned reg; uint32_t version = axiadc_read(st, 0x4000); if (PCORE_VERSION_MAJOR(version) > 7) { reg = axiadc_read(st, ADI_REG_CHAN_CNTRL_3(channel)); reg &= ~ADI_ADC_PN_SEL(~0); reg |= ADI_ADC_PN_SEL(sel); axiadc_write(st, ADI_REG_CHAN_CNTRL_3(channel), reg); } else { reg = axiadc_read(st, ADI_REG_CHAN_CNTRL(channel)); if (sel == ADC_PN_CUSTOM) { reg |= ADI_PN_SEL; } else if (sel == ADC_PN9) { reg &= ~ADI_PN23_TYPE; reg &= ~ADI_PN_SEL; } else { reg |= ADI_PN23_TYPE; reg &= ~ADI_PN_SEL; } axiadc_write(st, ADI_REG_CHAN_CNTRL(channel), reg); } return 0; }
enum adc_pn_sel axiadc_get_pnsel(struct axiadc_state *st, int channel, const char **name) { unsigned val; if (PCORE_VERSION_MAJOR(st->pcore_version) > 7) { const char *ident[] = {"PN9", "PN23A", "UNDEF", "UNDEF", "PN7", "PN15", "PN23", "PN31", "UNDEF", "PN_CUSTOM"}; val = ADI_TO_ADC_PN_SEL(axiadc_read(st, ADI_REG_CHAN_CNTRL_3(channel))); if (name) *name = ident[val]; return val; } else { val = axiadc_read(st, ADI_REG_CHAN_CNTRL(channel));; if (name) { if (val & ADI_PN_SEL) *name = "PN_CUSTOM"; else if (val & ADI_PN23_TYPE) *name = "PN23"; else *name = "PN9"; } return val & (ADI_PN23_TYPE | ADI_PN_SEL); } }