static int generate_gray_scale(struct SMART_DIM *pSmart)
{
    int cnt = 0, cal_cnt = 0;
    int array_index = 0;

    for (cnt = 0; cnt < S6E63M0_MAX; cnt++) {
        pSmart->GRAY.TABLE[S6E63M0_ARRAY[cnt]].R_Gray =
            ((int *)&(pSmart->RGB_OUTPUT.R_VOLTAGE))[cnt];

        pSmart->GRAY.TABLE[S6E63M0_ARRAY[cnt]].G_Gray =
            ((int *)&(pSmart->RGB_OUTPUT.G_VOLTAGE))[cnt];

        pSmart->GRAY.TABLE[S6E63M0_ARRAY[cnt]].B_Gray =
            ((int *)&(pSmart->RGB_OUTPUT.B_VOLTAGE))[cnt];
    }

    /*
    	below codes use hard coded value.
    	So it is possible to modify on each model.
    	V0, V1,V19,V43,V87,V171,V255
    */
    for (cnt = 0; cnt < S6E63M0_GRAY_SCALE_MAX; cnt++) {

        if (cnt == S6E63M0_ARRAY[0]) {
            /* 0 */
            array_index = 0;
        } else if (cnt == S6E63M0_ARRAY[1]) {
            /* 1 */
            cal_cnt = 0;
        } else if ((cnt > S6E63M0_ARRAY[1])
                   && (cnt < S6E63M0_ARRAY[2])) {
            /* 2 ~ 18 */
            array_index = 2;

            pSmart->GRAY.TABLE[cnt].R_Gray =
                cal_gray_scale_non_linear(
                    pSmart->GRAY.TABLE[S6E63M0_ARRAY
                                       [array_index-1]].R_Gray,
                    pSmart->GRAY.TABLE[S6E63M0_ARRAY
                                       [array_index]].R_Gray,
                    non_linear_V1toV19, V1TOV19_DENOMTR,
                    cal_cnt);

            pSmart->GRAY.TABLE[cnt].G_Gray =
                cal_gray_scale_non_linear(
                    pSmart->GRAY.TABLE[S6E63M0_ARRAY
                                       [array_index-1]].G_Gray,
                    pSmart->GRAY.TABLE[S6E63M0_ARRAY
                                       [array_index]].G_Gray,
                    non_linear_V1toV19, V1TOV19_DENOMTR,
                    cal_cnt);

            pSmart->GRAY.TABLE[cnt].B_Gray =
                cal_gray_scale_non_linear(
                    pSmart->GRAY.TABLE[S6E63M0_ARRAY
                                       [array_index-1]].B_Gray,
                    pSmart->GRAY.TABLE[S6E63M0_ARRAY
                                       [array_index]].B_Gray,
                    non_linear_V1toV19, V1TOV19_DENOMTR,
                    cal_cnt);

            cal_cnt++;
        } else if (cnt == S6E63M0_ARRAY[2]) {
            /* 19 */
            cal_cnt = 0;
        } else if ((cnt > S6E63M0_ARRAY[2])
                   && (cnt < S6E63M0_ARRAY[3])) {
            /* 20 ~ 42 */
            array_index = 3;

            pSmart->GRAY.TABLE[cnt].R_Gray =
                cal_gray_scale_non_linear(
                    pSmart->GRAY.TABLE[S6E63M0_ARRAY
                                       [array_index-1]].R_Gray,
                    pSmart->GRAY.TABLE[S6E63M0_ARRAY
                                       [array_index]].R_Gray,
                    non_linear_V19toV43, V19TOV43_DENOMTR,
                    cal_cnt);

            pSmart->GRAY.TABLE[cnt].G_Gray =
                cal_gray_scale_non_linear(
                    pSmart->GRAY.TABLE[S6E63M0_ARRAY
                                       [array_index-1]].G_Gray,
                    pSmart->GRAY.TABLE[S6E63M0_ARRAY
                                       [array_index]].G_Gray,
                    non_linear_V19toV43, V19TOV43_DENOMTR,
                    cal_cnt);

            pSmart->GRAY.TABLE[cnt].B_Gray =
                cal_gray_scale_non_linear(
                    pSmart->GRAY.TABLE[S6E63M0_ARRAY
                                       [array_index-1]].B_Gray,
                    pSmart->GRAY.TABLE[S6E63M0_ARRAY
                                       [array_index]].B_Gray,
                    non_linear_V19toV43, V19TOV43_DENOMTR,
                    cal_cnt);

            cal_cnt++;
        }  else if (cnt == S6E63M0_ARRAY[3]) {
            /* 43 */
            cal_cnt = 0;
        } else if ((cnt > S6E63M0_ARRAY[3])
                   && (cnt < S6E63M0_ARRAY[4])) {
            /* 44 ~ 86 */
            array_index = 4;

            pSmart->GRAY.TABLE[cnt].R_Gray = cal_gray_scale_linear(
                                                 pSmart->GRAY.TABLE[S6E63M0_ARRAY
                                                         [array_index-1]].R_Gray,
                                                 pSmart->GRAY.TABLE[S6E63M0_ARRAY
                                                         [array_index]].R_Gray,
                                                 V43TOV87_COEFF, V43TOV87_MULITPLE,
                                                 V43TOV87_DENOMTR, cal_cnt);

            pSmart->GRAY.TABLE[cnt].G_Gray = cal_gray_scale_linear(
                                                 pSmart->GRAY.TABLE[S6E63M0_ARRAY
                                                         [array_index-1]].G_Gray,
                                                 pSmart->GRAY.TABLE[S6E63M0_ARRAY
                                                         [array_index]].G_Gray,
                                                 V43TOV87_COEFF, V43TOV87_MULITPLE,
                                                 V43TOV87_DENOMTR, cal_cnt);

            pSmart->GRAY.TABLE[cnt].B_Gray = cal_gray_scale_linear(
                                                 pSmart->GRAY.TABLE[S6E63M0_ARRAY
                                                         [array_index-1]].B_Gray,
                                                 pSmart->GRAY.TABLE[S6E63M0_ARRAY
                                                         [array_index]].B_Gray,
                                                 V43TOV87_COEFF, V43TOV87_MULITPLE,
                                                 V43TOV87_DENOMTR , cal_cnt);

            cal_cnt++;
        } else if (cnt == S6E63M0_ARRAY[4]) {
            /* 87 */
            cal_cnt = 0;
        } else if ((cnt > S6E63M0_ARRAY[4])
                   && (cnt < S6E63M0_ARRAY[5])) {
            /* 88 ~ 170 */
            array_index = 5;

            pSmart->GRAY.TABLE[cnt].R_Gray = cal_gray_scale_linear(
                                                 pSmart->GRAY.TABLE[S6E63M0_ARRAY
                                                         [array_index-1]].R_Gray,
                                                 pSmart->GRAY.TABLE[S6E63M0_ARRAY
                                                         [array_index]].R_Gray,
                                                 V87TOV171_COEFF, V87TOV171_MULITPLE,
                                                 V87TOV171_DENOMTR, cal_cnt);

            pSmart->GRAY.TABLE[cnt].G_Gray = cal_gray_scale_linear(
                                                 pSmart->GRAY.TABLE[S6E63M0_ARRAY
                                                         [array_index-1]].G_Gray,
                                                 pSmart->GRAY.TABLE[S6E63M0_ARRAY
                                                         [array_index]].G_Gray,
                                                 V87TOV171_COEFF, V87TOV171_MULITPLE,
                                                 V87TOV171_DENOMTR, cal_cnt);

            pSmart->GRAY.TABLE[cnt].B_Gray = cal_gray_scale_linear(
                                                 pSmart->GRAY.TABLE[S6E63M0_ARRAY
                                                         [array_index-1]].B_Gray,
                                                 pSmart->GRAY.TABLE[S6E63M0_ARRAY
                                                         [array_index]].B_Gray,
                                                 V87TOV171_COEFF, V87TOV171_MULITPLE,
                                                 V87TOV171_DENOMTR, cal_cnt);
            cal_cnt++;

        } else if (cnt == S6E63M0_ARRAY[5]) {
            /* 171 */
            cal_cnt = 0;
        } else if ((cnt > S6E63M0_ARRAY[5])
                   && (cnt < S6E63M0_ARRAY[6])) {
            /* 172 ~ 254 */
            array_index = 6;

            pSmart->GRAY.TABLE[cnt].R_Gray = cal_gray_scale_linear(
                                                 pSmart->GRAY.TABLE[S6E63M0_ARRAY
                                                         [array_index-1]].R_Gray,
                                                 pSmart->GRAY.TABLE[S6E63M0_ARRAY
                                                         [array_index]].R_Gray,
                                                 V171TOV255_COEFF, V171TOV255_MULITPLE,
                                                 V171TOV255_DENOMTR, cal_cnt);

            pSmart->GRAY.TABLE[cnt].G_Gray = cal_gray_scale_linear(
                                                 pSmart->GRAY.TABLE[S6E63M0_ARRAY
                                                         [array_index-1]].G_Gray,
                                                 pSmart->GRAY.TABLE[S6E63M0_ARRAY
                                                         [array_index]].G_Gray,
                                                 V171TOV255_COEFF, V171TOV255_MULITPLE,
                                                 V171TOV255_DENOMTR, cal_cnt);

            pSmart->GRAY.TABLE[cnt].B_Gray = cal_gray_scale_linear(
                                                 pSmart->GRAY.TABLE[S6E63M0_ARRAY
                                                         [array_index-1]].B_Gray,
                                                 pSmart->GRAY.TABLE[S6E63M0_ARRAY
                                                         [array_index]].B_Gray,
                                                 V171TOV255_COEFF, V171TOV255_MULITPLE,
                                                 V171TOV255_DENOMTR, cal_cnt);

            cal_cnt++;
        } else {
            if (cnt == S6E63M0_ARRAY[6]) {
                pr_debug("%s end\n", __func__);
            } else {
                pr_info(KERN_ERR "%s fail cnt:%d\n",
                        __func__, cnt);
                return -1;
            }
        }

    }

#ifdef SMART_DIMMING_DEBUG
    for (cnt = 0; cnt < S6E63M0_GRAY_SCALE_MAX; cnt++) {
        pr_info("%s %d R:%d G:%d B:%d\n", __func__, cnt,
                pSmart->GRAY.TABLE[cnt].R_Gray,
                pSmart->GRAY.TABLE[cnt].G_Gray,
                pSmart->GRAY.TABLE[cnt].B_Gray);
    }
#endif
    return 0;
}
Example #2
0
static int generate_gray_scale(struct SMART_DIM *pSmart)
{
    int cnt = 0, cal_cnt = 0;
    int array_index = 0;
    struct GRAY_VOLTAGE *ptable =
        (struct GRAY_VOLTAGE *)&(pSmart->GRAY.TABLE);

    for (cnt = 0; cnt < EA8868_MAX; cnt++) {
        pSmart->GRAY.TABLE[EA8868_ARRAY[cnt]].R_Gray =
            ((int *)&(pSmart->RGB_OUTPUT.R_VOLTAGE))[cnt];

        pSmart->GRAY.TABLE[EA8868_ARRAY[cnt]].G_Gray =
            ((int *)&(pSmart->RGB_OUTPUT.G_VOLTAGE))[cnt];

        pSmart->GRAY.TABLE[EA8868_ARRAY[cnt]].B_Gray =
            ((int *)&(pSmart->RGB_OUTPUT.B_VOLTAGE))[cnt];
    }
    /*
    	below codes use hard coded value.
    	So it is possible to modify on each model.
    	V0, V1, V15, V35, V59, V87, V171, V255
    */
    for (cnt = 0; cnt < EA8868_GRAY_SCALE_MAX; cnt++) {

        if (cnt == EA8868_ARRAY[0]) {
            /* 0 */
            array_index = 0;
        } else if (cnt == EA8868_ARRAY[1]) {
            /* 1 */
            cal_cnt = 0;
        } else if ((cnt > EA8868_ARRAY[1]) &&
                   (cnt < EA8868_ARRAY[2])) {
            /* 2 ~ 14 */
            array_index = 2;

            pSmart->GRAY.TABLE[cnt].R_Gray =
                cal_gray_scale_non_linear(
                    ptable[EA8868_ARRAY[array_index-1]].R_Gray,
                    ptable[EA8868_ARRAY[array_index]].R_Gray,
                    non_linear_V1toV15, V1toV15_denominator, cal_cnt);

            pSmart->GRAY.TABLE[cnt].G_Gray =
                cal_gray_scale_non_linear(
                    ptable[EA8868_ARRAY[array_index-1]].G_Gray,
                    ptable[EA8868_ARRAY[array_index]].G_Gray,
                    non_linear_V1toV15, V1toV15_denominator, cal_cnt);

            pSmart->GRAY.TABLE[cnt].B_Gray =
                cal_gray_scale_non_linear(
                    ptable[EA8868_ARRAY[array_index-1]].B_Gray,
                    ptable[EA8868_ARRAY[array_index]].B_Gray,
                    non_linear_V1toV15, V1toV15_denominator, cal_cnt);

            cal_cnt++;
        } else if (cnt == EA8868_ARRAY[2]) {
            /* 15 */
            cal_cnt = 0;
        } else if ((cnt > EA8868_ARRAY[2]) &&
                   (cnt < EA8868_ARRAY[3])) {
            /* 16 ~ 34 */
            array_index = 3;

            pSmart->GRAY.TABLE[cnt].R_Gray =
                cal_gray_scale_non_linear(
                    ptable[EA8868_ARRAY[array_index-1]].R_Gray,
                    ptable[EA8868_ARRAY[array_index]].R_Gray,
                    non_linear_V15toV35, V15toV35_denominator, cal_cnt);

            pSmart->GRAY.TABLE[cnt].G_Gray =
                cal_gray_scale_non_linear(
                    ptable[EA8868_ARRAY[array_index-1]].G_Gray,
                    ptable[EA8868_ARRAY[array_index]].G_Gray,
                    non_linear_V15toV35, V15toV35_denominator, cal_cnt);

            pSmart->GRAY.TABLE[cnt].B_Gray =
                cal_gray_scale_non_linear(
                    ptable[EA8868_ARRAY[array_index-1]].B_Gray,
                    ptable[EA8868_ARRAY[array_index]].B_Gray,
                    non_linear_V15toV35, V15toV35_denominator, cal_cnt);

            cal_cnt++;
        }  else if (cnt == EA8868_ARRAY[3]) {
            /* 35 */
            cal_cnt = 0;
        } else if ((cnt > EA8868_ARRAY[3]) &&
                   (cnt < EA8868_ARRAY[4])) {
            /* 35 ~ 58 */
            array_index = 4;

            pSmart->GRAY.TABLE[cnt].R_Gray = cal_gray_scale_linear(
                                                 ptable[EA8868_ARRAY[array_index-1]].R_Gray,
                                                 ptable[EA8868_ARRAY[array_index]].R_Gray,
                                                 V35toV59_Coefficient, V35toV59_Multiple,
                                                 V35toV59_denominator, cal_cnt);

            pSmart->GRAY.TABLE[cnt].G_Gray = cal_gray_scale_linear(
                                                 ptable[EA8868_ARRAY[array_index-1]].G_Gray,
                                                 ptable[EA8868_ARRAY[array_index]].G_Gray,
                                                 V35toV59_Coefficient, V35toV59_Multiple,
                                                 V35toV59_denominator, cal_cnt);

            pSmart->GRAY.TABLE[cnt].B_Gray = cal_gray_scale_linear(
                                                 ptable[EA8868_ARRAY[array_index-1]].B_Gray,
                                                 ptable[EA8868_ARRAY[array_index]].B_Gray,
                                                 V35toV59_Coefficient, V35toV59_Multiple,
                                                 V35toV59_denominator , cal_cnt);

            cal_cnt++;
        } else if (cnt == EA8868_ARRAY[4]) {
            /* 59 */
            cal_cnt = 0;
        } else if ((cnt > EA8868_ARRAY[4]) &&
                   (cnt < EA8868_ARRAY[5])) {
            /* 60 ~ 86 */
            array_index = 5;

            pSmart->GRAY.TABLE[cnt].R_Gray = cal_gray_scale_linear(
                                                 ptable[EA8868_ARRAY[array_index-1]].R_Gray,
                                                 ptable[EA8868_ARRAY[array_index]].R_Gray,
                                                 V59toV87_Coefficient, V59toV87_Multiple,
                                                 V59toV87_denominator, cal_cnt);

            pSmart->GRAY.TABLE[cnt].G_Gray = cal_gray_scale_linear(
                                                 ptable[EA8868_ARRAY[array_index-1]].G_Gray,
                                                 ptable[EA8868_ARRAY[array_index]].G_Gray,
                                                 V59toV87_Coefficient, V59toV87_Multiple,
                                                 V59toV87_denominator, cal_cnt);

            pSmart->GRAY.TABLE[cnt].B_Gray = cal_gray_scale_linear(
                                                 ptable[EA8868_ARRAY[array_index-1]].B_Gray,
                                                 ptable[EA8868_ARRAY[array_index]].B_Gray,
                                                 V59toV87_Coefficient, V59toV87_Multiple,
                                                 V59toV87_denominator, cal_cnt);
            cal_cnt++;

        } else if (cnt == EA8868_ARRAY[5]) {
            /* 87 */
            cal_cnt = 0;
        } else if ((cnt > EA8868_ARRAY[5]) &&
                   (cnt < EA8868_ARRAY[6])) {
            /* 88 ~ 170 */
            array_index = 6;

            pSmart->GRAY.TABLE[cnt].R_Gray = cal_gray_scale_linear(
                                                 ptable[EA8868_ARRAY[array_index-1]].R_Gray,
                                                 ptable[EA8868_ARRAY[array_index]].R_Gray,
                                                 V87toV171_Coefficient, V87toV171_Multiple,
                                                 V87toV171_denominator, cal_cnt);

            pSmart->GRAY.TABLE[cnt].G_Gray = cal_gray_scale_linear(
                                                 ptable[EA8868_ARRAY[array_index-1]].G_Gray,
                                                 ptable[EA8868_ARRAY[array_index]].G_Gray,
                                                 V87toV171_Coefficient, V87toV171_Multiple,
                                                 V87toV171_denominator, cal_cnt);

            pSmart->GRAY.TABLE[cnt].B_Gray = cal_gray_scale_linear(
                                                 ptable[EA8868_ARRAY[array_index-1]].B_Gray,
                                                 ptable[EA8868_ARRAY[array_index]].B_Gray,
                                                 V87toV171_Coefficient, V87toV171_Multiple,
                                                 V87toV171_denominator, cal_cnt);
            cal_cnt++;

        } else if (cnt == EA8868_ARRAY[6]) {
            /* 171 */
            cal_cnt = 0;
        } else if ((cnt > EA8868_ARRAY[6]) &&
                   (cnt < EA8868_ARRAY[7])) {
            /* 172 ~ 254 */
            array_index = 7;

            pSmart->GRAY.TABLE[cnt].R_Gray = cal_gray_scale_linear(
                                                 ptable[EA8868_ARRAY[array_index-1]].R_Gray,
                                                 ptable[EA8868_ARRAY[array_index]].R_Gray,
                                                 V171toV255_Coefficient, V171toV255_Multiple,
                                                 V171toV255_denominator, cal_cnt);

            pSmart->GRAY.TABLE[cnt].G_Gray = cal_gray_scale_linear(
                                                 ptable[EA8868_ARRAY[array_index-1]].G_Gray,
                                                 ptable[EA8868_ARRAY[array_index]].G_Gray,
                                                 V171toV255_Coefficient, V171toV255_Multiple,
                                                 V171toV255_denominator, cal_cnt);

            pSmart->GRAY.TABLE[cnt].B_Gray = cal_gray_scale_linear(
                                                 ptable[EA8868_ARRAY[array_index-1]].B_Gray,
                                                 ptable[EA8868_ARRAY[array_index]].B_Gray,
                                                 V171toV255_Coefficient, V171toV255_Multiple,
                                                 V171toV255_denominator, cal_cnt);

            cal_cnt++;
        } else {
            if (cnt == EA8868_ARRAY[7]) {
                pr_info("%s end\n", __func__);
            } else {
                pr_err("%s fail cnt:%d\n", __func__, cnt);
                return -1;
            }
        }

    }

#ifdef SMART_DIMMING_DEBUG
    for (cnt = 0; cnt < EA8868_GRAY_SCALE_MAX; cnt++) {
        printk("%s %d R:%d G:%d B:%d\n", __func__, cnt,
               pSmart->GRAY.TABLE[cnt].R_Gray,
               pSmart->GRAY.TABLE[cnt].G_Gray,
               pSmart->GRAY.TABLE[cnt].B_Gray);
    }
#endif

    return 0;
}