float32 IfxScuCcu_setGtmFrequency(float32 gtmFreq) { uint16 l_SEndInitPW; Ifx_SCU_CCUCON1 ccucon1 = SCU_CCUCON1; float32 inputFreq = IfxScuCcu_getSourceFrequency(); uint32 gtmDiv = (uint32)__roundf(inputFreq / gtmFreq); gtmDiv = __maxu(gtmDiv, 1); /*gtmDiv = gtmDiv & 0x2U;*//* only even dividers */ if ((gtmDiv >= 7) && (gtmDiv < 14) && ((gtmDiv & 1) == 1)) { gtmDiv = gtmDiv - 1; } if (gtmDiv == 14) { gtmDiv = 12; } l_SEndInitPW = IfxScuWdt_getSafetyWatchdogPassword(); IfxScuWdt_clearSafetyEndinit(l_SEndInitPW); ccucon1.B.GTMDIV = gtmDiv; ccucon1.B.UP = 1U; SCU_CCUCON1.U = ccucon1.U; IfxScuWdt_setSafetyEndinit(l_SEndInitPW); return IfxScuCcu_getGtmFrequency(); }
float32 IfxScuCcu_setSriFrequency(float32 sriFreq) { float32 freq = 0; float32 source = IfxScuCcu_getSourceFrequency(); Ifx_SCU_CCUCON0 ccucon0; uint16 l_SEndInitPW; uint32 sriDiv = (uint32)__roundf(source / sriFreq); sriDiv = __maxu(sriDiv, 1); if ((sriDiv >= 7) && (sriDiv < 14) && ((sriDiv & 1) == 1)) { sriDiv = sriDiv - 1; } if (sriDiv == 14) { sriDiv = 12; } l_SEndInitPW = IfxScuWdt_getSafetyWatchdogPassword(); IfxScuWdt_clearSafetyEndinit(l_SEndInitPW); ccucon0.U = SCU_CCUCON0.U; ccucon0.B.SRIDIV = sriDiv; ccucon0.B.UP = 1; SCU_CCUCON0.U = ccucon0.U; IfxScuWdt_setSafetyEndinit(l_SEndInitPW); while (SCU_CCUCON0.B.LCK != 0U) {} freq = IfxScuCcu_getSriFrequency(); return freq; }
static float gammaf_positive (float x, int *exp2_adj) { int local_signgam; if (x < 0.5f) { *exp2_adj = 0; return __ieee754_expf (__ieee754_lgammaf_r (x + 1, &local_signgam)) / x; } else if (x <= 1.5f) { *exp2_adj = 0; return __ieee754_expf (__ieee754_lgammaf_r (x, &local_signgam)); } else if (x < 2.5f) { *exp2_adj = 0; float x_adj = x - 1; return (__ieee754_expf (__ieee754_lgammaf_r (x_adj, &local_signgam)) * x_adj); } else { float eps = 0; float x_eps = 0; float x_adj = x; float prod = 1; if (x < 4.0f) { /* Adjust into the range for applying Stirling's approximation. */ float n = __ceilf (4.0f - x); x_adj = math_narrow_eval (x + n); x_eps = (x - (x_adj - n)); prod = __gamma_productf (x_adj - n, x_eps, n, &eps); } /* The result is now gamma (X_ADJ + X_EPS) / (PROD * (1 + EPS)). Compute gamma (X_ADJ + X_EPS) using Stirling's approximation, starting by computing pow (X_ADJ, X_ADJ) with a power of 2 factored out. */ float exp_adj = -eps; float x_adj_int = __roundf (x_adj); float x_adj_frac = x_adj - x_adj_int; int x_adj_log2; float x_adj_mant = __frexpf (x_adj, &x_adj_log2); if (x_adj_mant < (float) M_SQRT1_2) { x_adj_log2--; x_adj_mant *= 2.0f; } *exp2_adj = x_adj_log2 * (int) x_adj_int; float ret = (__ieee754_powf (x_adj_mant, x_adj) * __ieee754_exp2f (x_adj_log2 * x_adj_frac) * __ieee754_expf (-x_adj) * __ieee754_sqrtf (2 * (float) M_PI / x_adj) / prod); exp_adj += x_eps * __ieee754_logf (x_adj); float bsum = gamma_coeff[NCOEFF - 1]; float x_adj2 = x_adj * x_adj; for (size_t i = 1; i <= NCOEFF - 1; i++) bsum = bsum / x_adj2 + gamma_coeff[NCOEFF - 1 - i]; exp_adj += bsum / x_adj; return ret + ret * __expm1f (exp_adj); } }