1: int32_t AG903_TIMRMgrSetRotaryEncoderMode(
AG903_TIMRMgrHandle* handle,
AG903_TIMRMgrRotaryEncParam* param)
2: {
3:
AG903_TIMRPrmInModeParam inprm = {0};
4:
AG903_TIMRPrmOutModeParam outprm = {0};
5:
AG903_TIMRPrmResetTriggerParam rstprm = {0};
6: int32_t retval =
AG903_ENONE;
7: int32_t result;
8: uint8_t ch;
9: uint8_t idle;
10:
11: result = TIMRMgr_CheckHandle(handle, &ch);
12:
if(
AG903_ENONE != result) {
13:
return -
AG903_EINVAL;
14: }
15:
if(NULL == param) {
16:
return -
AG903_EINVAL;
17: }
18:
if( (AG903_TIMR_INPUT_RETYPENUM <= param->intype) ||
19: (AG903_TIMR_CNT_TYPENUM <= param->sampling) ) {
20:
return -
AG903_EINVAL;
21: }
22:
if(NULL != param->output) {
23:
if( (
AG903_TIMR_EXTOUT_NUM <= param->output->portch) ||
24: (AG903_TIMR_POL_TYPENUM <= param->output->polarity) ||
25: (AG903_TIMR_OUT_PWM <= param->output->mode) ||
26: ((AG903_TIMR_OUT_PLUSE == param->output->mode)&&(
AG903_TIMR_PLUSEWIDTH_MAX < param->output->plusewidth)) ) {
27:
return -
AG903_EINVAL;
28: }
29: }
30: idle = TIMRMgr_CheckIdle(ch);
31:
if(
true != idle) {
32:
return -
AG903_EBUSY;
33: }
34:
35: inprm.res = TimrResolutionTypeTbl[param->sampling];
36: inprm.lo = TimrInputReTbl[param->intype][0];
37: inprm.ch = TimrInputReTbl[param->intype][1];
38:
AG903_TIMRPrmSetInMode(ch, &inprm);
39:
AG903_TIMRPrmSetPeriod(ch, param->range);
40:
AG903_TIMRPrmSetMatch(ch, param->match);
41:
42:
if(NULL == param->output) {
43: outprm.mod = AG903_TIMR_OUTMOD_DISABLE;
44: }
45:
else {
46: outprm.ovf = 1;
47: outprm.ch = param->output->portch;
48: outprm.pol = param->output->polarity;
49: outprm.mod = TimrOutModeTbl[param->output->mode];
50: }
51:
AG903_TIMRPrmSetOutMode(ch, &outprm);
52:
if(AG903_TIMR_OUTMOD_PLUSE == outprm.mod) {
53:
AG903_TIMRPrmSetPluseWidth(ch, param->output->plusewidth);
54: }
55:
56: rstprm.en = AG903_TIMR_RSTEN_DISABLE;
57:
AG903_TIMRPrmSetResetTrigger(ch, &rstprm);
58:
59: TimrChStat[ch].outmode = outprm.mod;
60: TimrChStat[ch].mode = AG903_TIMR_CTRLMOD_REIN;
61:
62:
return retval;
63: }