View Single Post
Old 08-20-2022, 03:30 PM   #878
NiLuJe
BLAM!
NiLuJe ought to be getting tired of karma fortunes by now.NiLuJe ought to be getting tired of karma fortunes by now.NiLuJe ought to be getting tired of karma fortunes by now.NiLuJe ought to be getting tired of karma fortunes by now.NiLuJe ought to be getting tired of karma fortunes by now.NiLuJe ought to be getting tired of karma fortunes by now.NiLuJe ought to be getting tired of karma fortunes by now.NiLuJe ought to be getting tired of karma fortunes by now.NiLuJe ought to be getting tired of karma fortunes by now.NiLuJe ought to be getting tired of karma fortunes by now.NiLuJe ought to be getting tired of karma fortunes by now.
 
NiLuJe's Avatar
 
Posts: 13,506
Karma: 26047202
Join Date: Jun 2010
Location: Paris, France
Device: Kindle 2i, 3g, 4, 5w, PW, PW2, PW5; Kobo H2O, Forma, Elipsa, Sage, C2E
Just quickly tried something similar on sunxi in KOReader, and we're foiled by the fact that the wait ioctl sometimes returns early, which kinda defeats the purpose ;o).

Code:
diff --git a/ffi/framebuffer_sunxi.lua b/ffi/framebuffer_sunxi.lua
index dc4ddef7..70bbf605 100644
--- a/ffi/framebuffer_sunxi.lua
+++ b/ffi/framebuffer_sunxi.lua
@@ -160,7 +160,10 @@ local function disp_update(fb, ioc_cmd, ioc_data, is_flashing, waveform_mode, wa
     end
 
     -- Handle night mode shenanigans
+    local frontlight_dimmed = false
+    local powerd, fl_intensity
     if fb.night_mode then
+        powerd = fb.device:getPowerDevice()
         -- Enforce a nightmode-specific mode to limit ghosting, where appropriate (i.e., partial & flashes).
         if fb:_isPartialWaveFormMode(waveform_mode) then
             waveform_mode = fb:_getNightWaveFormMode()
@@ -190,6 +193,14 @@ local function disp_update(fb, ioc_cmd, ioc_data, is_flashing, waveform_mode, wa
     -- Recap the actual details of the ioctl, vs. what UIManager asked for...
     fb.debug(string.format("disp_update: %ux%u region @ (%u, %u) (WFM: %u [flash: %s])", w, h, x, y, waveform_mode, is_flashing))
 
+    -- Frontlight dimming in night mode
+    if fb.night_mode and is_flashing and powerd:isFrontlightOn() then
+        -- FIXME: Tweak is flashing to full-screen flashing...
+        fl_intensity = powerd:frontlightIntensity()
+        powerd:setIntensity(5)
+        frontlight_dimmed = true
+    end
+
     if C.ioctl(fb.fd, ioc_cmd, ioc_data) == -1 then
         local err = ffi.errno()
         fb.debug("DISP_EINK_UPDATE2 ioctl failed:", ffi.string(C.strerror(err)))
@@ -208,6 +219,11 @@ local function disp_update(fb, ioc_cmd, ioc_data, is_flashing, waveform_mode, wa
         end
         -- And make sure we won't wait for it again, in case the next refresh trips one of our wait_for_*  heuristics ;).
         fb.dont_wait_for_marker = marker
+
+        if frontlight_dimmed then
+            -- NOTE: Foiled by the fact that the ioctl randomly returns early instead of its usual 450ms (which is a value that works decently well re: ft dimming).
+            powerd:setIntensity(fl_intensity)
+        end
     end
 end
Compare the expected 450ms of the DISP_EINK_WAIT_FRAME_SYNC_COMPLETE ioctls with the few that return in < 10ms...

Code:
21:26:18.269456 [b6d8f4ec] ioctl(5</dev/disp>, DISP_EINK_UPDATE2, {area={x_top=0, y_top=0, x_bottom=1403, y_bottom=1871}, layer_num=1, update_mode=EINK_NO_MERGE|EINK_GCK16_MODE, lyr_cfg2={info={mode=LAYER_MODE_BUFFER, zorder=0, alpha_mode=1, alpha_value=255, screen_win={x=0, y=0, width=1404, height=1872}, b_trd_out=0, out_trd_mode=DISP_3D_OUT_MODE_TB, fb={fd=0, y8_fd=4, size=[{width=1404, height=1872}, {width=0, height=0}, {width=0, height=0}], align=[0, 0, 0], format=DISP_FORMAT_8BIT_GRAY, color_space=DISP_GBR_F, trd_right_fd=0, pre_multiply=1, crop={x=0, y=0, width=1404 << 32, height=1872 << 32}, flags=DISP_BF_NORMAL, scan=DISP_SCAN_PROGRESSIVE, eotf=DISP_EOTF_GAMMA22, depth=0, fbd_en=0, metadata_fd=0, metadata_size=0, metadata_flag=0}, id=0, atw={used=0, mode=NORMAL_MODE, b_row=0, b_col=0, cof_fd=0}}, enable=1, channel=0, layer_id=1}, frame_id=[12811], rotate=270, cfa_use=0}) = 12811 <0.020400>
21:26:18.291170 [b6d8f4ec] ioctl(5</dev/disp>, DISP_EINK_WAIT_FRAME_SYNC_COMPLETE, 12811) = 0 <0.005869>
21:26:18.298376 [b6d8f4ec] ioctl(6</dev/ntx_io>, _IOC(_IOC_NONE, 0, 0xf1, 0), 0x14) = 0 <0.007617>
21:26:22.473411 [b6d8f4ec] ioctl(6</dev/ntx_io>, _IOC(_IOC_NONE, 0, 0xf1, 0), 0x5) = 0 <0.007985>
21:26:22.482924 [b6d8f4ec] ioctl(5</dev/disp>, DISP_EINK_UPDATE2, {area={x_top=0, y_top=0, x_bottom=1403, y_bottom=1871}, layer_num=1, update_mode=EINK_NO_MERGE|EINK_GCK16_MODE, lyr_cfg2={info={mode=LAYER_MODE_BUFFER, zorder=0, alpha_mode=1, alpha_value=255, screen_win={x=0, y=0, width=1404, height=1872}, b_trd_out=0, out_trd_mode=DISP_3D_OUT_MODE_TB, fb={fd=0, y8_fd=4, size=[{width=1404, height=1872}, {width=0, height=0}, {width=0, height=0}], align=[0, 0, 0], format=DISP_FORMAT_8BIT_GRAY, color_space=DISP_GBR_F, trd_right_fd=0, pre_multiply=1, crop={x=0, y=0, width=1404 << 32, height=1872 << 32}, flags=DISP_BF_NORMAL, scan=DISP_SCAN_PROGRESSIVE, eotf=DISP_EOTF_GAMMA22, depth=0, fbd_en=0, metadata_fd=0, metadata_size=0, metadata_flag=0}, id=0, atw={used=0, mode=NORMAL_MODE, b_row=0, b_col=0, cof_fd=0}}, enable=1, channel=0, layer_id=1}, frame_id=[12812], rotate=270, cfa_use=0}) = 12812 <0.020275>
21:26:22.504865 [b6d8f4ec] ioctl(5</dev/disp>, DISP_EINK_WAIT_FRAME_SYNC_COMPLETE, 12812) = 0 <0.453873>
21:26:22.962046 [b6d8f4ec] ioctl(6</dev/ntx_io>, _IOC(_IOC_NONE, 0, 0xf1, 0), 0x14) = 0 <0.009773>
21:26:25.090976 [b6d8f4ec] ioctl(6</dev/ntx_io>, _IOC(_IOC_NONE, 0, 0xf1, 0), 0x5) = 0 <0.007463>
21:26:25.099929 [b6d8f4ec] ioctl(5</dev/disp>, DISP_EINK_UPDATE2, {area={x_top=0, y_top=0, x_bottom=1403, y_bottom=1871}, layer_num=1, update_mode=EINK_NO_MERGE|EINK_GCK16_MODE, lyr_cfg2={info={mode=LAYER_MODE_BUFFER, zorder=0, alpha_mode=1, alpha_value=255, screen_win={x=0, y=0, width=1404, height=1872}, b_trd_out=0, out_trd_mode=DISP_3D_OUT_MODE_TB, fb={fd=0, y8_fd=4, size=[{width=1404, height=1872}, {width=0, height=0}, {width=0, height=0}], align=[0, 0, 0], format=DISP_FORMAT_8BIT_GRAY, color_space=DISP_GBR_F, trd_right_fd=0, pre_multiply=1, crop={x=0, y=0, width=1404 << 32, height=1872 << 32}, flags=DISP_BF_NORMAL, scan=DISP_SCAN_PROGRESSIVE, eotf=DISP_EOTF_GAMMA22, depth=0, fbd_en=0, metadata_fd=0, metadata_size=0, metadata_flag=0}, id=0, atw={used=0, mode=NORMAL_MODE, b_row=0, b_col=0, cof_fd=0}}, enable=1, channel=0, layer_id=1}, frame_id=[12813], rotate=270, cfa_use=0}) = 12813 <0.019464>
21:26:25.121765 [b6d8f4ec] ioctl(5</dev/disp>, DISP_EINK_WAIT_FRAME_SYNC_COMPLETE, 12813) = 0 <0.452931>
21:26:25.578245 [b6d8f4ec] ioctl(6</dev/ntx_io>, _IOC(_IOC_NONE, 0, 0xf1, 0), 0x14) = 0 <0.010160>
21:26:27.256054 [b6d8f4ec] ioctl(6</dev/ntx_io>, _IOC(_IOC_NONE, 0, 0xf1, 0), 0x5) = 0 <0.007777>
21:26:27.265314 [b6d8f4ec] ioctl(5</dev/disp>, DISP_EINK_UPDATE2, {area={x_top=0, y_top=0, x_bottom=1403, y_bottom=1871}, layer_num=1, update_mode=EINK_NO_MERGE|EINK_GCK16_MODE, lyr_cfg2={info={mode=LAYER_MODE_BUFFER, zorder=0, alpha_mode=1, alpha_value=255, screen_win={x=0, y=0, width=1404, height=1872}, b_trd_out=0, out_trd_mode=DISP_3D_OUT_MODE_TB, fb={fd=0, y8_fd=4, size=[{width=1404, height=1872}, {width=0, height=0}, {width=0, height=0}], align=[0, 0, 0], format=DISP_FORMAT_8BIT_GRAY, color_space=DISP_GBR_F, trd_right_fd=0, pre_multiply=1, crop={x=0, y=0, width=1404 << 32, height=1872 << 32}, flags=DISP_BF_NORMAL, scan=DISP_SCAN_PROGRESSIVE, eotf=DISP_EOTF_GAMMA22, depth=0, fbd_en=0, metadata_fd=0, metadata_size=0, metadata_flag=0}, id=0, atw={used=0, mode=NORMAL_MODE, b_row=0, b_col=0, cof_fd=0}}, enable=1, channel=0, layer_id=1}, frame_id=[12814], rotate=270, cfa_use=0}) = 12814 <0.020236>
21:26:27.286899 [b6d8f4ec] ioctl(5</dev/disp>, DISP_EINK_WAIT_FRAME_SYNC_COMPLETE, 12814) = 0 <0.451838>
21:26:27.742053 [b6d8f4ec] ioctl(6</dev/ntx_io>, _IOC(_IOC_NONE, 0, 0xf1, 0), 0x14) = 0 <0.009747>
21:26:29.276559 [b6d8f4ec] ioctl(6</dev/ntx_io>, _IOC(_IOC_NONE, 0, 0xf1, 0), 0x5) = 0 <0.007904>
21:26:29.285973 [b6d8f4ec] ioctl(5</dev/disp>, DISP_EINK_UPDATE2, {area={x_top=0, y_top=0, x_bottom=1403, y_bottom=1871}, layer_num=1, update_mode=EINK_NO_MERGE|EINK_GCK16_MODE, lyr_cfg2={info={mode=LAYER_MODE_BUFFER, zorder=0, alpha_mode=1, alpha_value=255, screen_win={x=0, y=0, width=1404, height=1872}, b_trd_out=0, out_trd_mode=DISP_3D_OUT_MODE_TB, fb={fd=0, y8_fd=4, size=[{width=1404, height=1872}, {width=0, height=0}, {width=0, height=0}], align=[0, 0, 0], format=DISP_FORMAT_8BIT_GRAY, color_space=DISP_GBR_F, trd_right_fd=0, pre_multiply=1, crop={x=0, y=0, width=1404 << 32, height=1872 << 32}, flags=DISP_BF_NORMAL, scan=DISP_SCAN_PROGRESSIVE, eotf=DISP_EOTF_GAMMA22, depth=0, fbd_en=0, metadata_fd=0, metadata_size=0, metadata_flag=0}, id=0, atw={used=0, mode=NORMAL_MODE, b_row=0, b_col=0, cof_fd=0}}, enable=1, channel=0, layer_id=1}, frame_id=[12815], rotate=270, cfa_use=0}) = 12815 <0.020731>
21:26:29.307987 [b6d8f4ec] ioctl(5</dev/disp>, DISP_EINK_WAIT_FRAME_SYNC_COMPLETE, 12815) = 0 <0.005734>
21:26:29.315093 [b6d8f4ec] ioctl(6</dev/ntx_io>, _IOC(_IOC_NONE, 0, 0xf1, 0), 0x14) = 0 <0.007443>
NiLuJe is offline   Reply With Quote