void mt_gpio_self_test(void) { int i, val; for (i = 0; i < MT_GPIO_EXT_MAX; i++) { s32 res,old; GPIOMSG("GPIO-%3d test\n", i); /*direction test*/ old = mt_get_gpio_dir(i); if (old == 0 || old == 1) { GPIOLOG(" dir old = %d\n", old); } else { GPIOERR(" test dir fail: %d\n", old); break; } if ((res = mt_set_gpio_dir(i, GPIO_DIR_OUT)) != RSUCCESS) { GPIOERR(" set dir out fail: %d\n", res); break; } else if ((res = mt_get_gpio_dir(i)) != GPIO_DIR_OUT) { GPIOERR(" get dir out fail: %d\n", res); break; } else { /*output test*/ s32 out = mt_get_gpio_out(i); if (out != 0 && out != 1) { GPIOERR(" get out fail = %d\n", old); break; } for (val = 0; val < GPIO_OUT_MAX; val++) { if ((res = mt_set_gpio_out(i,0)) != RSUCCESS) { GPIOERR(" set out[%d] fail: %d\n", val, res); break; } else if ((res = mt_get_gpio_out(i)) != 0) { GPIOERR(" get out[%d] fail: %d\n", val, res); break; } } if ((res = mt_set_gpio_out(i,out)) != RSUCCESS) { GPIOERR(" restore out fail: %d\n", res); break; } } if ((res = mt_set_gpio_dir(i, GPIO_DIR_IN)) != RSUCCESS) { GPIOERR(" set dir in fail: %d\n", res); break; } else if ((res = mt_get_gpio_dir(i)) != GPIO_DIR_IN) { GPIOERR(" get dir in fail: %d\n", res); break; } else { GPIOLOG(" input data = %d\n", res); } if ((res = mt_set_gpio_dir(i, old)) != RSUCCESS) { GPIOERR(" restore dir fail: %d\n", res); break; } for (val = 0; val < GPIO_PULL_EN_MAX; val++) { if ((res = mt_set_gpio_pull_enable(i,val)) != RSUCCESS) { GPIOERR(" set pullen[%d] fail: %d\n", val, res); break; } else if ((res = mt_get_gpio_pull_enable(i)) != val) { GPIOERR(" get pullen[%d] fail: %d\n", val, res); break; } } if ((res = mt_set_gpio_pull_enable(i, old)) != RSUCCESS) { GPIOERR(" restore pullen fail: %d\n", res); break; } /*pull select test*/ old = mt_get_gpio_pull_select(i); if (old == 0 || old == 1) GPIOLOG(" pullsel old = %d\n", old); else { GPIOERR(" pullsel fail: %d\n", old); break; } for (val = 0; val < GPIO_PULL_MAX; val++) { if ((res = mt_set_gpio_pull_select(i,val)) != RSUCCESS) { GPIOERR(" set pullsel[%d] fail: %d\n", val, res); break; } else if ((res = mt_get_gpio_pull_select(i)) != val) { GPIOERR(" get pullsel[%d] fail: %d\n", val, res); break; } } if ((res = mt_set_gpio_pull_select(i, old)) != RSUCCESS) { GPIOERR(" restore pullsel fail: %d\n", res); break; } /*data inversion*/ old = mt_get_gpio_inversion(i); if (old == 0 || old == 1) GPIOLOG(" inv old = %d\n", old); else { GPIOERR(" inv fail: %d\n", old); break; } for (val = 0; val < GPIO_DATA_INV_MAX; val++) { if ((res = mt_set_gpio_inversion(i,val)) != RSUCCESS) { GPIOERR(" set inv[%d] fail: %d\n", val, res); break; } else if ((res = mt_get_gpio_inversion(i)) != val) { GPIOERR(" get inv[%d] fail: %d\n", val, res); break; } } if ((res = mt_set_gpio_inversion(i, old)) != RSUCCESS) { GPIOERR(" restore inv fail: %d\n", res); break; } /*mode control*/ // if((i<=GPIOEXT6) || (i >= GPIOEXT9)){ old = mt_get_gpio_mode(i); if ((old >= GPIO_MODE_00) && (val < GPIO_MODE_MAX)) { GPIOLOG(" mode old = %d\n", old); } else { GPIOERR(" get mode fail: %d\n", old); break; } for (val = 0; val < GPIO_MODE_MAX; val++) { if ((res = mt_set_gpio_mode(i, val)) != RSUCCESS) { GPIOERR("set mode[%d] fail: %d\n", val, res); break; } else if ((res = mt_get_gpio_mode(i)) != val) { GPIOERR("get mode[%d] fail: %d\n", val, res); break; } } if ((res = mt_set_gpio_mode(i,old)) != RSUCCESS) { GPIOERR(" restore mode fail: %d\n", res); break; } // } } GPIOLOG("GPIO test done\n"); }
/*---------------------------------------------------------------------------*/ static long mt_gpio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { struct mt_gpio_obj_t *obj = mt_gpio; long res; unsigned long pin; GPIOFUC(); if (obj == NULL) { GPIOERR("NULL pointer"); return -EFAULT; } switch(cmd) { case GPIO_IOCQMODE: { pin = (unsigned long)arg; res = GIO_INVALID_OBJ(obj) ? (-EACCES) : mt_get_gpio_mode(pin); break; } case GPIO_IOCTMODE0: { pin = (unsigned long)arg; res = GIO_INVALID_OBJ(obj) ? (-EACCES) : mt_set_gpio_mode(pin, GPIO_MODE_00); break; } case GPIO_IOCTMODE1: { pin = (unsigned long)arg; res = GIO_INVALID_OBJ(obj) ? (-EACCES) : mt_set_gpio_mode(pin, GPIO_MODE_01); break; } case GPIO_IOCTMODE2: { pin = (unsigned long)arg; res = GIO_INVALID_OBJ(obj) ? (-EACCES) : mt_set_gpio_mode(pin, GPIO_MODE_02); break; } case GPIO_IOCTMODE3: { pin = (unsigned long)arg; res = GIO_INVALID_OBJ(obj) ? (-EACCES) : mt_set_gpio_mode(pin, GPIO_MODE_03); break; } case GPIO_IOCQDIR: { pin = (unsigned long)arg; res = GIO_INVALID_OBJ(obj) ? (-EACCES) : mt_get_gpio_dir(pin); break; } case GPIO_IOCSDIRIN: { pin = (unsigned long)arg; res = GIO_INVALID_OBJ(obj) ? (-EACCES) : mt_set_gpio_dir(pin, GPIO_DIR_IN); break; } case GPIO_IOCSDIROUT: { pin = (unsigned long)arg; res = GIO_INVALID_OBJ(obj) ? (-EACCES) : mt_set_gpio_dir(pin, GPIO_DIR_OUT); break; } case GPIO_IOCQPULLEN: { pin = (unsigned long)arg; res = GIO_INVALID_OBJ(obj) ? (-EACCES) : mt_get_gpio_pull_enable(pin); break; } case GPIO_IOCSPULLENABLE: { pin = (unsigned long)arg; res = GIO_INVALID_OBJ(obj) ? (-EACCES) : mt_set_gpio_pull_enable(pin, TRUE); break; } case GPIO_IOCSPULLDISABLE: { pin = (unsigned long)arg; res = GIO_INVALID_OBJ(obj) ? (-EACCES) : mt_set_gpio_pull_enable(pin, FALSE); break; } case GPIO_IOCQPULL: { pin = (unsigned long)arg; res = GIO_INVALID_OBJ(obj) ? (-EACCES) : mt_get_gpio_pull_select(pin); break; } case GPIO_IOCSPULLDOWN: { pin = (unsigned long)arg; res = GIO_INVALID_OBJ(obj) ? (-EACCES) : mt_set_gpio_pull_select(pin, GPIO_PULL_DOWN); break; } case GPIO_IOCSPULLUP: { pin = (unsigned long)arg; res = GIO_INVALID_OBJ(obj) ? (-EACCES) : mt_set_gpio_pull_select(pin, GPIO_PULL_UP); break; } case GPIO_IOCQINV: { pin = (unsigned long)arg; res = GIO_INVALID_OBJ(obj) ? (-EACCES) : mt_get_gpio_inversion(pin); break; } case GPIO_IOCSINVENABLE: { pin = (unsigned long)arg; res = GIO_INVALID_OBJ(obj) ? (-EACCES) : mt_set_gpio_inversion(pin, TRUE); break; } case GPIO_IOCSINVDISABLE: { pin = (unsigned long)arg; res = GIO_INVALID_OBJ(obj) ? (-EACCES) : mt_set_gpio_inversion(pin, FALSE); break; } case GPIO_IOCQDATAIN: { pin = (unsigned long)arg; res = GIO_INVALID_OBJ(obj) ? (-EFAULT) : mt_get_gpio_in(pin); break; } case GPIO_IOCQDATAOUT: { pin = (unsigned long)arg; res = GIO_INVALID_OBJ(obj) ? (-EACCES) : mt_get_gpio_out(pin); break; } case GPIO_IOCSDATALOW: { pin = (unsigned long)arg; res = GIO_INVALID_OBJ(obj) ? (-EACCES) : mt_set_gpio_out(pin, GPIO_OUT_ZERO); break; } case GPIO_IOCSDATAHIGH: { pin = (unsigned long)arg; res = GIO_INVALID_OBJ(obj) ? (-EACCES) : mt_set_gpio_out(pin, GPIO_OUT_ONE); break; } default: { res = -EPERM; break; } } if (res == -EACCES) GPIOERR(" cmd = 0x%8X, invalid pointer\n", cmd); else if (res < 0) GPIOERR(" cmd = 0x%8X, err = %ld\n", cmd, res); return res; }