HDMI Resolutions testing

if you have another HDMI in your tv try it, I change to another one, and it is feet the screen.

It has been more than 3 months, but the top product of khadas remains without full functionality. This is a big disappointment for users who changed the VIM1 to VIM2.

I am not satisfied with vim support for now, there are still bugs in Android, Linux is missing proper driver support, but things have improved, they are now much better than before.

If i have known all of this when i bought it, i wouldn’t have bought this board, but i am really hoping for proper Linux support with all the drivers needed, but i am afraid that we will need to wait a long time for it to come, if it ever comes.

I know it’s not only their fault, a lot of job is needed from Amlogic and Arm too, problem is that these two companies only support Android, there is no Linux support from them.

I am now using Android Nougat latest image, Nougat images before had a serious bug with systemui stopping, for the first time i can use this board to watch movies and other stuff, it was impossible to use it with previous images.

3 Likes

The VIM2 Vesa resolution patch is the same with VIM. In addition, you need to modify the kernel driver

--- a/drivers/amlogic/display/osd/osd_fb.c
+++ b/drivers/amlogic/display/osd/osd_fb.c
@@ -2581,12 +2581,10 @@ static int osd_probe(struct platform_device *pdev)
                        if (ret)
                                osd_log_info("not found display_size_default\n");
                        else {
-                               fb_def_var[index].xres = var_screeninfo[0];
-                               fb_def_var[index].yres = var_screeninfo[1];
-                               fb_def_var[index].xres_virtual =
-                                       var_screeninfo[2];
-                               fb_def_var[index].yres_virtual =
-                                       var_screeninfo[3];
+                               fb_def_var[index].xres = vinfo->width;
+                               fb_def_var[index].yres = vinfo->height;
+                               fb_def_var[index].xres_virtual = vinfo->width;
+                               fb_def_var[index].yres_virtual = vinfo->height*3;
                                fb_def_var[index].bits_per_pixel =
                                        var_screeninfo[4];
                                osd_log_info("init fbdev bpp is:%d\n",

Have a try. Thanks.

1 Like

Yes, I applied аll VESA patches. But if you do not disable the UI interface scaling, the image begins to twitch strongly.

— a/services/systemcontrol/DisplayMode.cpp
+++ b/services/systemcontrol/DisplayMode.cpp
@@ -1176,9 +1176,6 @@ void DisplayMode::setAutoSwitchFrameRate(int state) {
}

void DisplayMode::updateDefaultUI() {
— char outputmode[MODE_LEN] = {0};
— getBootEnv(UBOOTENV_OUTPUTMODE, outputmode);
— strcpy(mDefaultUI, outputmode);
if (!strncmp(mDefaultUI, “720”, 3)) {
fbset(1280,720,32);
mDisplayWidth= FULL_WIDTH_720;

Thank you, today I will try to apply new fix.

I check it. It does WORK!!!

SORRY, this is google translate…

You can download my ROM.
The resolutions are displayed in a full list regardless of the display.
“640x480p60hz”, “800x480p60hz”, “800x600p60hz”, “1024x600p60hz”, “1024x768p60hz”, “1280x800p60hz”, “1280x1024p60hz”, “1360x768p60hz”, “1366x768p60hz”, “1440x900p60hz”, “1600x900p60hz”, “1600x1200p60hz”, “1920x1200p60hz”.
List scroll down is possible with the keyboard only, mouse or touchscreen does not scroll through the list, be careful!

Аlso you can evaluate the hidden menu of the user interface editor in System UI Tuner (navigation Bar), which allows you to edit the navigation bar (NavBar) directly from the system. Basically, this menu is always hidden, but it happens that on some devices added from the factory. To activate the hidden menu, press and hold the gear in the shutter status bar, it will start to rotate quickly, after 5 seconds, release the gear and get into the menu More settings-system UI Tuner. In the status Bar submenu, you can turn off/on icons such as battery power or make a clock with seconds.


I modified the functionality of the system UI Tuner menu “navigation Bar”, I added keys: volume+ (vol up), volume - (voldown), turn off the sound (mute), previous song (prev), next song (next), music start/pause (play). Someone may object and say that using the “key Code” you can add any button and the picture on it, and why I added your button. So here is I answer: Yes, can be add, on the field 1-2-3 reboots, the button disappear and-button will become invisible. Although such a bug can be used to create a hidden button, it is enough to know its location and it will work. My buttons are considered system buttons and always work. We strongly recommend to modify navbar only when the screen resolution is 1920*1080, otherwise due to the peculiarities of the scale at other resolutions, the interface of the modifier is not removed from the screen, and the flipping function it does not support.

2 Likes

Hi, terry!

I build ROM with VESA resolutions for VIM1 and VIM2.
It work perfect. But it have some bug on 800x480 resolutions for VIM2 only (VIM1 has not this bug).

After first reboot, picture is well

But after second reboot:

third reboot:

fourth reboot again nice:

How to fix this bug on VIM2?

Can you provide some informations for me?

# adb shell
# cat /sys/class/display/mode
# wm size
# fbset
# getbootenv
# logcat
# dmesg
1 Like

Please tell:
Does ABD not work if I use:

arch/arm64/boot/dts/amlogic/kvim.dts
– controller-type = <2>
++ controller-type = <1>
device/khadas/kvim/init.amlogic.usb.rc
– insmod /system/lib/dwc_otg.ko

?

You can use wifi ADB and not usb ADB

# adb connect IP_ADDR
# adb shell
1 Like

Hello, Terry!
My name Alex, I testing DaveMF firmware for my carPC with Innolux AT065TN14 800x480 pixels (it`s my problem at the photos…)

My log:

C:\ADB>adb connect 192.168.0.105
connected to 192.168.0.105:5555

C:\ADB>adb devices
List of devices attached
192.168.0.105:5555      device

C:\ADB>adb shell
kvim2:/ $ su
kvim2:/ # cat /sys/class/display
tmp-mksh: cat: /sys/class/display: Is a directory
1|kvim2:/ # wm size
Physical size: 720x480
kvim2:/ # fbset

mode "720x480-0"
        # D: 0.000 MHz, H: 0.000 kHz, V: 0.000 Hz
        geometry 720 480 720 1440 32
        timings 0 0 0 0 0 0 0
        accel false
        rgba 8/0,8/8,8/16,8/24
endmode

kvim2:/ # getbootenv
[EnableSelinux]: [permissive]
[active_slot]: [_a]
[baudrate]: [115200]
[bcb_cmd]: [get_valid_slot;]
[boot_part]: [boot]
[bootcmd]: [run storeboot]
[bootdelay]: [1]
[cmdline_keys]: [if keyman init 0x1234; then if keyman read usid ${loadaddr} str
; then setenv bootargs ${bootargs} androidboot.serialno=${usid};setenv serial ${
usid};fi;kbi ethmac;setenv bootargs ${bootargs} mac=${eth_mac} androidboot.mac=$
{eth_mac};if keyman read deviceid ${loadaddr} str; then setenv bootargs ${bootar
gs} androidboot.deviceid=${deviceid};fi;fi;]
[combine_key]: [saradc open 0;if saradc get_in_range 0x0 0x1f; then echo Detect
function key;if gpio input GPIOAO_2; then echo Detect combine keys;store init 3;
 fi;fi;]
[cvbs_drv]: [0]
[cvbsmode]: [576cvbs]
[display_bpp]: [16]
[display_color_bg]: [0]
[display_color_fg]: [0xffff]
[display_color_index]: [16]
[display_height]: [1080]
[display_layer]: [osd1]
[display_width]: [1920]
[dtb_mem_addr]: [0x1000000]
[ethaddr]: [00:15:18:01:81:31]
[factory_reset_poweroff_protect]: [echo wipe_data=${wipe_data}; echo wipe_cache=
${wipe_cache};if test ${wipe_data} = failed; then run init_display; run storearg
s;if mmcinfo; then run recovery_from_sdcard;fi;if usb start 0; then run recovery
_from_udisk;fi;run recovery_from_flash;fi; if test ${wipe_cache} = failed; then
run init_display; run storeargs;if mmcinfo; then run recovery_from_sdcard;fi;if
usb start 0; then run recovery_from_udisk;fi;run recovery_from_flash;fi; ]
[fb_addr]: [0x3d800000]
[fb_height]: [1080]
[fb_width]: [1920]
[fdt_high]: [0x20000000]
[firstboot]: [0]
[gatewayip]: [10.18.9.1]
[hdmimode]: [800x480p60hz]
[hostname]: [arm_gxbb]
[init_display]: [osd open;osd clear;imgread pic logo bootup $loadaddr;bmp displa
y $bootup_offset;bmp scale]
[initargs]: [rootfstype=ramfs init=/init console=ttyS0,115200 no_console_suspend
 earlyprintk=aml-uart,0xc81004c0 ramoops.pstore_en=1 ramoops.record_size=0x8000
ramoops.console_size=0x4000 ]
[ipaddr]: [10.18.9.97]
[jtag]: [disable]
[loadaddr]: [1080000]
[netmask]: [255.255.255.0]
[outputmode]: [800x480p60hz]
[preboot]: [run bcb_cmd; run factory_reset_poweroff_protect;run upgrade_check;ru
n init_display;run storeargs;run combine_key;run upgrade_key;run vim2_check;run
wol_init;forceupdate;run switch_bootmode;]
[recovery_from_flash]: [setenv bootargs ${bootargs} aml_dt=${aml_dt} recovery_pa
rt={recovery_part} recovery_offset={recovery_offset};if itest ${upgrade_step} ==
 3; then if ext4load mmc 1:2 ${dtb_mem_addr} /recovery/dtb.img; then echo cache
dtb.img loaded; fi;if ext4load mmc 1:2 ${loadaddr} /recovery/recovery.img; then
echo cache recovery.img loaded; wipeisb; bootm ${loadaddr}; fi;else fi;if imgrea
d kernel ${recovery_part} ${loadaddr} ${recovery_offset}; then wipeisb; bootm ${
loadaddr}; fi;]
[recovery_from_sdcard]: [setenv bootargs ${bootargs} aml_dt=${aml_dt} recovery_p
art={recovery_part} recovery_offset={recovery_offset};if fatload mmc 0 ${loadadd
r} aml_autoscript; then autoscr ${loadaddr}; fi;if fatload mmc 0 ${loadaddr} rec
overy.img; then if fatload mmc 0 ${dtb_mem_addr} dtb.img; then echo sd dtb.img l
oaded; fi;wipeisb; bootm ${loadaddr};fi;]
[recovery_from_udisk]: [setenv bootargs ${bootargs} aml_dt=${aml_dt} recovery_pa
rt={recovery_part} recovery_offset={recovery_offset};if fatload usb 0 ${loadaddr
} aml_autoscript; then autoscr ${loadaddr}; fi;if fatload usb 0 ${loadaddr} reco
very.img; then if fatload usb 0 ${dtb_mem_addr} dtb.img; then echo udisk dtb.img
 loaded; fi;wipeisb; bootm ${loadaddr};fi;]
[recovery_offset]: [0]
[recovery_part]: [recovery]
[sdc_burning]: [sdc_burn ${sdcburncfg}]
[sdcburncfg]: [aml_sdc_burn.ini]
[serverip]: [10.18.9.113]
[storeargs]: [setenv bootargs ${initargs} androidboot.selinux=${EnableSelinux} l
ogo=${display_layer},loaded,${fb_addr},${outputmode} maxcpus=${maxcpus} vout=${o
utputmode},enable hdmimode=${hdmimode} cvbsmode=${cvbsmode} hdmitx=${cecconfig}
ddr_size=${ddr_size} cvbsdrv=${cvbs_drv}  pq=${pq} androidboot.firstboot=${first
boot} jtag=${jtag}; setenv bootargs ${bootargs} androidboot.hardware=amlogic;run
 cmdline_keys;setenv bootargs ${bootargs} androidboot.slot_suffix=${active_slot}
;]
[storeboot]: [if imgread kernel ${boot_part} ${loadaddr}; then bootm ${loadaddr}
; fi;run update;]
[switch_bootmode]: [get_rebootmode;if test ${reboot_mode} = factory_reset; then
run recovery_from_flash;else if test ${reboot_mode} = update; then run update;el
se if test ${reboot_mode} = cold_boot; then else if test ${reboot_mode} = fastbo
ot; then fastboot;fi;fi;fi;fi;]
[try_auto_burn]: [update 700 750;]
[update]: [run usb_burning; run sdc_burning; if mmcinfo; then run recovery_from_
sdcard;fi;if usb start 0; then run recovery_from_udisk;fi;run recovery_from_flas
h;]
[upgrade_check]: [echo upgrade_step=${upgrade_step}; if itest ${upgrade_step} ==
 3; then run init_display; run storeargs; run update;else fi;]
[upgrade_key]: [if gpio input GPIOAO_2; then echo detect upgrade key; sleep 3;if
 gpio input GPIOAO_2; then run update; fi;fi;]
[upgrade_step]: [2]
[usb_burning]: [update 1000]
[vim2_check]: [saradc open 1;if saradc get_in_range 0x1a0 0x220; then echo Produ
ct checking: pass!;else if saradc get_in_range 0x0 0x1cf; then echo Product chec
king: fail!; sleep 5; reboot;fi;fi;]
[wipe_cache]: [successful]
[wipe_data]: [successful]
[wol_init]: [kbi powerstate;kbi trigger wol r;setenv bootargs ${bootargs} wol_en
able=${wol_enable};if test ${power_state} = 1; then kbi trigger wol w 1;gpio set
 GPIODV_2;fi;]
[1080p60hz_deepcolor]: [rgb,8bit]
[colorattribute]: [444,8bit]
[1080p_x]: [0]
[1080p_y]: [0]
[1080p_w]: [1920]
[1080p_h]: [1080]
[is.bestmode]: [false]
[800x480p60hz_deepcolor]: [444,8bit]
[800x480p60hz_x]: [0]
[800x480p60hz_y]: [0]
[800x480p60hz_w]: [800]
[800x480p60hz_h]: [480]
kvim2:/ #

And logcat file in my cloud: logcat-full.txt
Thanks, Regards, Alex.

1 Like

Thank you for test!
:+1:

1|kvim2:/ # wm size
Physical size: 720x480

kvim2:/ # fbset

mode "720x480-0"
        # D: 0.000 MHz, H: 0.000 kHz, V: 0.000 Hz
        geometry 720 480 720 1440 32

The wm size and fb is 720x480
I think you might have missed some code.
You need to provide the modified code for me.
Thanks.

1 Like

I sent on your email.

Thank you!

Where is the kernel printing log (dmesg)? @davemf @Alonso_BV

Sorry for that…

I sent on your email.

Thank you!

Hello!

I tested DaveMF firmware for VIM2 with HSD080IFW1 1024x600. When the screen resolution is 1920x1080 everything is fine, I switch to 1024x600 then reboot and the green screen appears, sometimes when the screen resolution changes the image distorts, only the firmware of the device helped. Tried 1280x800 also works fine, changed to 1024x768, again skewed and a green screen. On the home TV the same as on HSD080IFW1.

Here’s the video youtu.be/-1hD8AsEZtU
With a skewed image - youtu.be/oPokJV1DqOs

Logs:

kvim2:/ $ su
kvim2:/ # cat /sys/class/display
tmp-mksh: cat: /sys/class/display: Is a directory
1|kvim2:/ # wm size
Physical size: 1024x600
kvim2:/ # fbset

mode "1024x600-0"
    # D: 0.000 MHz, H: 0.000 kHz, V: 0.000 Hz
    geometry 1024 600 1024 1800 32
    timings 0 0 0 0 0 0 0
    accel false
    rgba 8/0,8/8,8/16,8/24
endmode

kvim2:/ # getbootenv
[EnableSelinux]: [permissive]
[active_slot]: [_a]
[baudrate]: [115200]
[bcb_cmd]: [get_valid_slot;]
[boot_part]: [boot]
[bootcmd]: [run storeboot]
[bootdelay]: [1]
[cmdline_keys]: [if keyman init 0x1234; then if keyman read usid ${loadaddr} str; then setenv bootargs ${bootargs} androidboot.serialno=${usid};setenv serial ${usid};fi;kbi ethmac;setenv bootargs ${bootargs} mac=${eth_mac} androidboot.mac=${eth_mac};if keyman read deviceid ${loadaddr} str; then setenv bootargs ${bootargs} androidboot.deviceid=${deviceid};fi;fi;]
[combine_key]: [saradc open 0;if saradc get_in_range 0x0 0x1f; then echo Detect function key;if gpio input GPIOAO_2; then echo Detect combine keys;store init 3; fi;fi;]
[cvbs_drv]: [0]
[cvbsmode]: [576cvbs]
[display_bpp]: [16]
[display_color_bg]: [0]
[display_color_fg]: [0xffff]
[display_color_index]: [16]
[display_height]: [1080]
[display_layer]: [osd1]
[display_width]: [1920]
[dtb_mem_addr]: [0x1000000]
[ethaddr]: [00:15:18:01:81:31]
[factory_reset_poweroff_protect]: [echo wipe_data=${wipe_data}; echo wipe_cache=${wipe_cache};if test ${wipe_data} = failed; then run init_display; run storeargs;if mmcinfo; then run recovery_from_sdcard;fi;if usb start 0; then run recovery_from_udisk;fi;run recovery_from_flash;fi; if test ${wipe_cache} = failed; then run init_display; run storeargs;if mmcinfo; then run recovery_from_sdcard;fi;if usb start 0; then run recovery_from_udisk;fi;run recovery_from_flash;fi; ]
[fb_addr]: [0x3d800000]
[fb_height]: [1080]
[fb_width]: [1920]
[fdt_high]: [0x20000000]
[firstboot]: [0]
[gatewayip]: [10.18.9.1]
[hdmimode]: [1024x600p60hz]
[hostname]: [arm_gxbb]
[init_display]: [osd open;osd clear;imgread pic logo bootup $loadaddr;bmp display $bootup_offset;bmp scale]
[initargs]: [rootfstype=ramfs init=/init console=ttyS0,115200 no_console_suspend earlyprintk=aml-uart,0xc81004c0 ramoops.pstore_en=1 ramoops.record_size=0x8000 ramoops.console_size=0x4000 ]
[ipaddr]: [10.18.9.97]
[jtag]: [disable]
[loadaddr]: [1080000]
[netmask]: [255.255.255.0]
[outputmode]: [1024x600p60hz]
[preboot]: [run bcb_cmd; run factory_reset_poweroff_protect;run upgrade_check;run init_display;run storeargs;run combine_key;run upgrade_key;run vim2_check;run wol_init;forceupdate;run switch_bootmode;]
[recovery_from_flash]: [setenv bootargs ${bootargs} aml_dt=${aml_dt} recovery_part={recovery_part} recovery_offset={recovery_offset};if itest ${upgrade_step} == 3; then if ext4load mmc 1:2 ${dtb_mem_addr} /recovery/dtb.img; then echo cache dtb.img loaded; fi;if ext4load mmc 1:2 ${loadaddr} /recovery/recovery.img; then echo cache recovery.img loaded; wipeisb; bootm ${loadaddr}; fi;else fi;if imgread kernel ${recovery_part} ${loadaddr} ${recovery_offset}; then wipeisb; bootm ${loadaddr}; fi;]
[recovery_from_sdcard]: [setenv bootargs ${bootargs} aml_dt=${aml_dt} recovery_part={recovery_part} recovery_offset={recovery_offset};if fatload mmc 0 ${loadaddr} aml_autoscript; then autoscr ${loadaddr}; fi;if fatload mmc 0 ${loadaddr} recovery.img; then if fatload mmc 0 ${dtb_mem_addr} dtb.img; then echo sd dtb.img loaded; fi;wipeisb; bootm ${loadaddr};fi;]
[recovery_from_udisk]: [setenv bootargs ${bootargs} aml_dt=${aml_dt} recovery_part={recovery_part} recovery_offset={recovery_offset};if fatload usb 0 ${loadaddr} aml_autoscript; then autoscr ${loadaddr}; fi;if fatload usb 0 ${loadaddr} recovery.img; then if fatload usb 0 ${dtb_mem_addr} dtb.img; then echo udisk dtb.img loaded; fi;wipeisb; bootm ${loadaddr};fi;]
[recovery_offset]: [0]
[recovery_part]: [recovery]
[sdc_burning]: [sdc_burn ${sdcburncfg}]
[sdcburncfg]: [aml_sdc_burn.ini]
[serverip]: [10.18.9.113]
[storeargs]: [setenv bootargs ${initargs} androidboot.selinux=${EnableSelinux} logo=${display_layer},loaded,${fb_addr},${outputmode} maxcpus=${maxcpus} vout=${outputmode},enable hdmimode=${hdmimode} cvbsmode=${cvbsmode} hdmitx=${cecconfig} ddr_size=${ddr_size} cvbsdrv=${cvbs_drv}  pq=${pq} androidboot.firstboot=${firstboot} jtag=${jtag}; setenv bootargs ${bootargs} androidboot.hardware=amlogic;run cmdline_keys;setenv bootargs ${bootargs} androidboot.slot_suffix=${active_slot};]
[storeboot]: [if imgread kernel ${boot_part} ${loadaddr}; then bootm ${loadaddr}; fi;run update;]
[switch_bootmode]: [get_rebootmode;if test ${reboot_mode} = factory_reset; then run recovery_from_flash;else if test ${reboot_mode} = update; then run update;else if test ${reboot_mode} = cold_boot; then else if test ${reboot_mode} = fastboot; then fastboot;fi;fi;fi;fi;]
[try_auto_burn]: [update 700 750;]
[update]: [run usb_burning; run sdc_burning; if mmcinfo; then run recovery_from_sdcard;fi;if usb start 0; then run recovery_from_udisk;fi;run recovery_from_flash;]
[upgrade_check]: [echo upgrade_step=${upgrade_step}; if itest ${upgrade_step} == 3; then run init_display; run storeargs; run update;else fi;]
[upgrade_key]: [if gpio input GPIOAO_2; then echo detect upgrade key; sleep 3;if gpio input GPIOAO_2; then run update; fi;fi;]
[upgrade_step]: [2]
[usb_burning]: [update 1000]
[vim2_check]: [saradc open 1;if saradc get_in_range 0x1a0 0x220; then echo Product checking: pass!;else if saradc get_in_range 0x0 0x1cf; then echo Product checking: fail!; sleep 5; reboot;fi;fi;]
[wipe_cache]: [successful]
[wipe_data]: [successful]
[wol_init]: [kbi powerstate;kbi trigger wol r;setenv bootargs ${bootargs} wol_enable=${wol_enable};if test ${power_state} = 1; then kbi trigger wol w 1;gpio set GPIODV_2;fi;]
[576i_x]: [0]
[576i_y]: [0]
[576i_w]: [720]
[576i_h]: [576]
[1080p60hz_deepcolor]: [rgb,8bit]
[colorattribute]: [rgb,8bit]
[1080p_x]: [0]
[1080p_y]: [0]
[1080p_w]: [1920]
[1080p_h]: [1080]
[is.bestmode]: [false]
[1024x768p60hz_deepcolor]: [444,8bit]
[1024x768p60hz_x]: [0]
[1024x768p60hz_y]: [0]
[1024x768p60hz_w]: [1366]
[1024x768p60hz_h]: [768]
[1024x600p60hz_deepcolor]: [rgb,8bit]
[1024x600p60hz_x]: [0]
[1024x600p60hz_y]: [0]
[1024x600p60hz_w]: [1024]
[1024x600p60hz_h]: [600]
[1080p50hz_deepcolor]: [rgb,8bit]
[800x480p60hz_deepcolor]: [444,8bit]
[800x480p60hz_x]: [0]
[800x480p60hz_y]: [0]
[800x480p60hz_w]: [800]
[800x480p60hz_h]: [480]
1 Like

Other logs: logcat and dmesg

1 Like

Hello! I’m testing DaveMF firmware too.
On this firmware, after ~20 minutes, if I click on “home” or “multitasking” virtual button -
all the sound in the system disappears.
It only helps reboot the console.
In previous firmware - everything is ok.
I’m use hdmi is sound output.
Resolution is 720p60.
This my dmesg log -> https://yadi.sk/i/MCR7rka73TkR9N
after I face this challenge

1 Like

@davemf @Alonso_BV
You need to modify the kernel driver.

diff --git a/drivers/amlogic/display/vout/vinfo.c b/drivers/amlogic/display/vout/vinfo.c
index d256e06..033aa378 100644
--- a/drivers/amlogic/display/vout/vinfo.c
+++ b/drivers/amlogic/display/vout/vinfo.c
@@ -132,7 +132,7 @@ enum vmode_e vmode_name_to_mode(const char *str)
        enum vmode_e vmode = VMODE_MAX;
 
        for (i = 0; i < ARRAY_SIZE(vmode_match_table); i++) {
-               if (strstr(str, vmode_match_table[i].name)) {
+               if (!strncmp(str, vmode_match_table[i].name,strlen(vmode_match_table[i].name))) {
                        vmode = vmode_match_table[i].mode;
                        break;
                }
(END)

2 Likes