Thursday, November 16, 2023

bringuall.com store review. It takes time but genuine store.

I was looking for some phone spares and found a seller on Amazon with name BringUAll. This seller was selling the items i needed. However they also have their website where they sell items at cheaper price than Amazon and Flipkart etc stores. I took risk and made an order. Recorded video of whole shopping flow till end. Below are some screenshots.

My issue -
My nokia 8.1 charging type c port was malfunctioning. It needed replacement because Nokia is now a popular brand which makes very bad quality usb charging dock. Its charging port dies in lots of devices. Most stores offer copy charging board.  This copy board comes without Network, MIC and fast charging chips. This causes poor network, bad mic during calls and slow charging after replacement of charging board or usb dock or usb flex whatever you may call it.


Back to their website. They show WhatsApp icon which leads to their business account for chat which responded after 2 days. This is expected from a new small scale store with smaller staff. I guess they have small staff.

The paid order remains in "On Hold" status until they manually verify the payment if done using UPI. When you pay via UPI they ask for transaction ID to verify payment and then do further processing of the order.




My order was successfully delivered to me in 3 days once payment was verified. The item is worked perfectly and was exactly as described on website. The product had minor issue with its contact point little bent. This can happen while handling during packaging. I fixed it and assembled into phone and i got phone working just like new. My phone is now behaving like what it behaved with original board. No network issue, no mic issue no charging issue.

You can also buy it via below link -


Tuesday, August 8, 2023

Play Gears Of War 1 Offline with save feature

I barely play modern games because i don't like them. I remain at 1995-2010 gaming era because it was best for me. Now i started finding more old games and i found gears of war 1. It didn't worked at all and i don't use internet on my windows pc 99% of time. I sometimes use steam to download some old games like DeusEx.

After trying some experiments and solutions at pcgamingwiki website when nothing worked i experimented on my own. I read about Xliveless which allows xlive without actually having xlive.

I pasted xlive.dll into Gears Of War Binaries folder and started the game. It worked perfectly and saving also works.


Fix:

Download Xliveless package from internet or links below. Extract xlive.dll and paste into Gears Of war Binaries folder. If it doesn't work then set compatibility mode to older windows.

Xliveless link:


I don't remember from where is got mine Xliveless but mine xlive.dll has size of 209,920 bytes and its x86 i.e. 32 bit dll. Try this exact file version and game should work.

Tuesday, August 1, 2023

WebAssembly port of sfArk extractor. Extract or convert sfark files to sf2 files.

After i stopped working on Android projects due to various reasons i started porting many of my apps to web. One such port is sfArk extractor. Click below link to open the webapp "sfArk extractor"

sfArk extractor WASM webapp.

 

NOTE:

This web app DOESN'T UPLOADS sfark files to server. Your browser does the conversion task almost at the same speed of native apps like EXE files on windows or other OSes.

The tool is also available below via itch.io store.

Monday, July 3, 2023

Rollback Nokia 8.1 to Android 10 from Android 11 without unlocking bootloder. Needs EDL (emergency download mode)

I updated Nokia 8.1 from Pie to Android 10 and then to Android 11. Pie was good for network because Android 10 made network connection weaker and less stable then Pie. Android 11 is the most worse Android ever released. I started hating it and was desperate to get rid of it. It was slow and didn't offered me worth more than Android 10. For security 11 is better but performance is poor. Finally after 7-10 days of effort gave me success in rolling back Nokia 8.1 to Android 10.


I never unlocked bootloader of my phone and i tried lots of methods and apps and all failed. I then started going deep into the process of how this flashing apps actually worked. I cracked it and i flashed Android 10 431A stock ROM. Before i start the whole process it is critical to understand the basics. I will describe the required details even normal PC user can understand.


Just like PC where we have hard disk which contains OS phones/tablets have solid state storage. The storage that is present in SSD, Pendrive etc.  The storage is split into multiple parts called partitions. Its like C, D, E etc drives of windows. If you are Linux user you will understand the phone storage much better than Windows users. Partitions are important because the files of each partitions doesn't interfere with other files of other partition. Example D drive has multimedia data and if full will not effect C drive which contains OS. If you fill media in C drive it will affect the OS.


Now coming to Phone storage & partitions. Nokia has eMMC storage. There is also UFS storage on many other devices. Knowing this storage type is critical before flashing ROM. Nokia 8.1 is powered by Qualcomm Snapdragon 710 chip. This is another critical information needed for flashing stock rom.


Now coming directly to the flashing process. You need below things and conditions to achieve flashing of rom.


  • Phone in EDL mode. This is another big topic which varies from device to device. I will only write about Nokia 8.1. You can try EDL cables if it works. I opened the back cover of phone and shorted the TEST POINTS to enter into EDL mode. You can search internet for same its easily available how to do it.
  • Qualcomm 9008 driver. Nokia USB driver. You can also download OST tool 6.2.8 which contains all the drivers Or download driver separately.
  • QPST/QFIL (QPST_2.7.496) tool with firehose file. Firehose file is specific to a chip. I will share relevant files which are smaller in size here. Firehose file is available insize stock roms.
  • Any C type cable with fast charging capability. This means cable must be able to handle 18W power which Nokia 8.1 adapter delivers. Also try to flip type c side of port horizontally because sometimes one side does not work.
  • USB 2.0 port
  • Windows 7/8/10. Probably 11 which i have not tested.
  • Global Stock ROM PNX-431A-0-00WW-B01. Search internet to get this rom.
  • "nb0 tools FIH Mobile v3.4.exe" tool to extract NB0 rom file.

 

Now before proceeding to flash process lets understand what these tools do.


NOTE: click on images to see them in bigger size.


Qualcomm EDL mode works with 2 communication protocols. Sahara mode and Firehose mode. Sahara mode allows user to send Firehose file to the device during EDL mode. This file understands how to communicate with device in emergency download mode. One thing to understand is during flashing process DOWNLOAD means to actually upload data to device. Device will download something not us!. This causes confusion among users who are doing it first time.

Firehose protocol works with XML format. It understands XML language and accepts file sent with xml configuration. Firehose only knows to write data to eMMC/UFS storage. Using which we write files on eMMC.


Now install the drivers, QPST, QFIL tool. Verify if drivers are installed. Turn off phone, remove battery connector from motherboard, short the test points with clip, connect phone to PC. Start device manager and check PORTS section. If you can see Qualcomm 9008 COM port everything is setup and ready to flash device. Go to QFIL tool configuration and set settings like below image.

 




The stock rom which you have download contains NB0 file. Which is extracted using nb0 tool. Run QFIL in admin mode and it should show like below.

 


 
 
 

Some critical notes -

- Enter into EDL mode just before taking upload/download actions using QFIL tool. EDL mode can stop responding if not utilized quickly.

- Load firehose file from extracted ROM folder into QFIL. If connected in EDL mode QFIL -> Tools -> Partition Manager will be available. Enter into partition manager. Here you can see partitions of eMMC.

- MAKE BACKUP of your eMMC partitions VERY CAREFULLY. If you lost mfd, fbo etc partitions forget your device will work again because you will need these partitions in any conditions to turn on phone. Below images shows all partitions.









- Left click on a partition then right click on it. DO NOT DIRECTLY right click because this will not select the partition your mouse is over. It will select whole disk or first partition. Click manage partitions and read image. This will create a file like below in %APPDATA%/qualcomm or QPST directory. Look at logs in QFIL where file has been extracted. Collect all partitions and save somewhere.

ReadData_emmc_Lun0_0x828_Len1024_DT_****.bin. DT is followed by date of dump. 0x???? part tell the start location of partition and Len tell length of the partition.


I am warning you again. The above step is more important than anything else in this guide. Don't blame me if your device stops starting again. Try to delete MFD partition and your device will not boot. Delete FDP partition and you will see "Your device is corrupt..... press power button to shutdown.... shutdown in 30 seconds". FDP partition holds data to verify device. MAKE BACKUP OF EVERY PARTITION. You can ignore system, vendor, userdata but this will erase your devices present state. MAKE BACKUP of every partition if possible because you can later write them back into emmc to get your phone back into the exact condition it is now. Read button copies the partition into you PC, load button writes partition into phone.


After making backup lets proceed to preparing ROM to flash. Before writing rom lets understand what these flashing tools actually do. Below is extra information. For quick flashing go to section FLASHING ROM below.


The flashing tools like OST tool, Nokia service tool and other tools simply use sahara, firehose protocols provided by Qualcomm. They use fh_loader.exe file to write data to emmc. The login process, account verification etc all extra stuff they have added to make money from their tool. You can do flashing process from command line itself with just QPST/QFIL.QFIL must be run from within QPST installation folder. Many times QFIL doesn't work when run from its own separate package without QPST.


The first thing these tools do is send firehose programmer file to device using Sahara mode. Its done by this command -

QSaharaServer.exe -p \\.\COM4 -s 13:C:\LogData\OST\Data\PNX-0-6210-prog_firehose_lite.elf

 

This is what OST tool does. -p tells the com port. -s tells the firehose programmer file. After this you are ready to use fh_loader.exe to write data to eMMC (OR UFS).


NOTE:

if your bootloader is unlocked then these commands and tools are not needed. fastboot mode also does the same job. fastboot handles editing of the partitions.

After sahara has sent firehose file fh_loader can write partitions. A big xml file rawprogram0.xml is sent to fh_loader. It reads it and verifies the xml and starts sending the data according to xml file. What we have to do is edit this xml file to send all the partitions at once.


OST etc tools use default raw program xml to write service abl/xbl bootloaders and then use fastboot to flash partitions. This is where flashing fails when bootloader is locked. You can various errors like Error = SE_ERR_ADB_CMD_GET_FAIL_RESULT (0xC6DA), Error 0x0c3be uploading image using sahara protocol failed. These are all due to locked bootloader or other restrictions.


FLASHING ROM:

 

Go to extracted ROM folder and create a new file "rawprogram0_RECOVER_431A.xml" and paste below into it.


<?xml version="1.0" ?>
<data>
  <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="PNX-0-431A-xbl.elf" label="xbl_a" num_partition_sectors="7168" partofsingleimage="false" physical_partition_number="0" readbackverify="false" size_in_KB="3584.0" sparse="false" start_byte_hex="0x4000000" start_sector="131072"/>
  <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="PNX-0-431A-xbl.elf" label="xbl_b" num_partition_sectors="7168" partofsingleimage="false" physical_partition_number="0" readbackverify="false" size_in_KB="3584.0" sparse="false" start_byte_hex="0x4380000" start_sector="138240"/>
  <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="PNX-0-431A-xbl_config.elf" label="xbl_config_a" num_partition_sectors="256" partofsingleimage="false" physical_partition_number="0" readbackverify="false" size_in_KB="128.0" sparse="false" start_byte_hex="0xb000000" start_sector="360448"/>
  <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="PNX-0-431A-xbl_config.elf" label="xbl_config_b" num_partition_sectors="256" partofsingleimage="false" physical_partition_number="0" readbackverify="false" size_in_KB="128.0" sparse="false" start_byte_hex="0xb020000" start_sector="360704"/>
  <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="PNX-0-431A-tz.mbn" label="tz_a" num_partition_sectors="4096" partofsingleimage="false" physical_partition_number="0" readbackverify="false" size_in_KB="2048.0" sparse="false" start_byte_hex="0xc000000" start_sector="393216"/>
  <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="PNX-0-431A-tz.mbn" label="tz_b" num_partition_sectors="4096" partofsingleimage="false" physical_partition_number="0" readbackverify="false" size_in_KB="2048.0" sparse="false" start_byte_hex="0xc200000" start_sector="397312"/>
  <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="PNX-0-431A-aop.mbn" label="aop_a" num_partition_sectors="1024" partofsingleimage="false" physical_partition_number="0" readbackverify="false" size_in_KB="512.0" sparse="false" start_byte_hex="0xc400000" start_sector="401408"/>
  <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="PNX-0-431A-aop.mbn" label="aop_b" num_partition_sectors="1024" partofsingleimage="false" physical_partition_number="0" readbackverify="false" size_in_KB="512.0" sparse="false" start_byte_hex="0x10000000" start_sector="524288"/>
  <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="PNX-0-431A-hyp.mbn" label="hyp_a" num_partition_sectors="1024" partofsingleimage="false" physical_partition_number="0" readbackverify="false" size_in_KB="512.0" sparse="false" start_byte_hex="0x14000000" start_sector="655360"/>
  <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="PNX-0-431A-hyp.mbn" label="hyp_b" num_partition_sectors="1024" partofsingleimage="false" physical_partition_number="0" readbackverify="false" size_in_KB="512.0" sparse="false" start_byte_hex="0x14080000" start_sector="656384"/>
  <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="PNX-0-431A-keymaster64.mbn" label="keymaster_a" num_partition_sectors="1024" partofsingleimage="false" physical_partition_number="0" readbackverify="false" size_in_KB="512.0" sparse="false" start_byte_hex="0x14300000" start_sector="661504"/>
  <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="PNX-0-431A-keymaster64.mbn" label="keymaster_b" num_partition_sectors="1024" partofsingleimage="false" physical_partition_number="0" readbackverify="false" size_in_KB="512.0" sparse="false" start_byte_hex="0x14380000" start_sector="662528"/>
  <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="PNX-0-431A-cmnlib.mbn" label="cmnlib_a" num_partition_sectors="1024" partofsingleimage="false" physical_partition_number="0" readbackverify="false" size_in_KB="512.0" sparse="false" start_byte_hex="0x14400000" start_sector="663552"/>
  <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="PNX-0-431A-cmnlib64.mbn" label="cmnlib64_a" num_partition_sectors="1024" partofsingleimage="false" physical_partition_number="0" readbackverify="false" size_in_KB="512.0" sparse="false" start_byte_hex="0x14480000" start_sector="664576"/>
  <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="PNX-0-431A-cmnlib.mbn" label="cmnlib_b" num_partition_sectors="1024" partofsingleimage="false" physical_partition_number="0" readbackverify="false" size_in_KB="512.0" sparse="false" start_byte_hex="0x14500000" start_sector="665600"/>
  <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="PNX-0-431A-cmnlib64.mbn" label="cmnlib64_b" num_partition_sectors="1024" partofsingleimage="false" physical_partition_number="0" readbackverify="false" size_in_KB="512.0" sparse="false" start_byte_hex="0x14580000" start_sector="666624"/>
  <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="PNX-0-431A-NON-HLOS.bin" label="modem_a" num_partition_sectors="266240" partofsingleimage="false" physical_partition_number="0" readbackverify="false" size_in_KB="133120.0" sparse="false" start_byte_hex="0x14600000" start_sector="667648"/>
  <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="PNX-0-431A-NON-HLOS.bin" label="modem_b" num_partition_sectors="266240" partofsingleimage="false" physical_partition_number="0" readbackverify="false" size_in_KB="133120.0" sparse="false" start_byte_hex="0x1c800000" start_sector="933888"/>
  <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="PNX-0-431A-dspso.bin" label="dsp_a" num_partition_sectors="65536" partofsingleimage="false" physical_partition_number="0" readbackverify="false" size_in_KB="32768.0" sparse="false" start_byte_hex="0x24a00000" start_sector="1200128"/>
  <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="PNX-0-431A-dspso.bin" label="dsp_b" num_partition_sectors="65536" partofsingleimage="false" physical_partition_number="0" readbackverify="false" size_in_KB="32768.0" sparse="false" start_byte_hex="0x26a00000" start_sector="1265664"/>
  <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="PNX-0-431A-abl.elf" label="abl_a" num_partition_sectors="2048" partofsingleimage="false" physical_partition_number="0" readbackverify="false" size_in_KB="1024.0" sparse="false" start_byte_hex="0x28a00000" start_sector="1331200"/>
  <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="PNX-0-431A-abl.elf" label="abl_b" num_partition_sectors="2048" partofsingleimage="false" physical_partition_number="0" readbackverify="false" size_in_KB="1024.0" sparse="false" start_byte_hex="0x28b00000" start_sector="1333248"/>
  <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="PNX-0-431A-logfs_ufs_8mb.bin" label="logfs" num_partition_sectors="16384" partofsingleimage="false" physical_partition_number="0" readbackverify="false" size_in_KB="8192.0" sparse="false" start_byte_hex="0x34000000" start_sector="1703936"/>
  <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="PNX-0-431A-BTFM.bin" label="bluetooth_a" num_partition_sectors="2048" partofsingleimage="false" physical_partition_number="0" readbackverify="false" size_in_KB="1024.0" sparse="false" start_byte_hex="0x38104000" start_sector="1837088"/>
  <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="PNX-0-431A-BTFM.bin" label="bluetooth_b" num_partition_sectors="2048" partofsingleimage="false" physical_partition_number="0" readbackverify="false" size_in_KB="1024.0" sparse="false" start_byte_hex="0x38204000" start_sector="1839136"/>
  <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="PNX-0-431A-00WW-dtbo.img" label="dtbo_a" num_partition_sectors="16384" partofsingleimage="false" physical_partition_number="0" readbackverify="false" size_in_KB="8192.0" sparse="false" start_byte_hex="0x3c022000" start_sector="1966352"/>
  <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="PNX-0-431A-00WW-dtbo.img" label="dtbo_b" num_partition_sectors="16384" partofsingleimage="false" physical_partition_number="0" readbackverify="false" size_in_KB="8192.0" sparse="false" start_byte_hex="0x3c822000" start_sector="1982736"/>
  <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="PNX-0-431A-persist.img" label="persist" num_partition_sectors="65536" partofsingleimage="false" physical_partition_number="0" readbackverify="false" size_in_KB="32768.0" sparse="false" start_byte_hex="0x3d426000" start_sector="2007344"/>
  <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="PNX-00WW-010-keyinfo.img" label="keystore" num_partition_sectors="1024" partofsingleimage="false" physical_partition_number="0" readbackverify="false" size_in_KB="512.0" sparse="false" start_byte_hex="0x3f526000" start_sector="2074928"/>
  <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="PNX-0-431A-devcfg.mbn" label="devcfg_a" num_partition_sectors="256" partofsingleimage="false" physical_partition_number="0" readbackverify="false" size_in_KB="128.0" sparse="false" start_byte_hex="0x3f5a6000" start_sector="2075952"/>
  <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="PNX-0-431A-devcfg.mbn" label="devcfg_b" num_partition_sectors="256" partofsingleimage="false" physical_partition_number="0" readbackverify="false" size_in_KB="128.0" sparse="false" start_byte_hex="0x3f5c6000" start_sector="2076208"/>
  <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="PNX-0-431A-qupv3fw.elf" label="qupfw_a" num_partition_sectors="128" partofsingleimage="false" physical_partition_number="0" readbackverify="false" size_in_KB="64.0" sparse="false" start_byte_hex="0x3f5e6000" start_sector="2076464"/>
  <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="PNX-0-431A-qupv3fw.elf" label="qupfw_b" num_partition_sectors="128" partofsingleimage="false" physical_partition_number="0" readbackverify="false" size_in_KB="64.0" sparse="false" start_byte_hex="0x3f5f6000" start_sector="2076592"/>
  <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="PNX-0-431A-storsec.mbn" label="storsec_a" num_partition_sectors="256" partofsingleimage="false" physical_partition_number="0" readbackverify="false" size_in_KB="128.0" sparse="false" start_byte_hex="0x43886000" start_sector="2212912"/>
  <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="PNX-0-431A-storsec.mbn" label="storsec_b" num_partition_sectors="256" partofsingleimage="false" physical_partition_number="0" readbackverify="false" size_in_KB="128.0" sparse="false" start_byte_hex="0x438a6000" start_sector="2213168"/>
  <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="PNX-0-431A-00WW-vbmeta.img" label="vbmeta_a" num_partition_sectors="128" partofsingleimage="false" physical_partition_number="0" readbackverify="false" size_in_KB="64.0" sparse="false" start_byte_hex="0x4c000000" start_sector="2490368"/>
  <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="PNX-0-431A-00WW-vbmeta.img" label="vbmeta_b" num_partition_sectors="128" partofsingleimage="false" physical_partition_number="0" readbackverify="false" size_in_KB="64.0" sparse="false" start_byte_hex="0x4c010000" start_sector="2490496"/>
  <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="PNX-0-0010-0001-hidden.img.ext4" label="hidden_a" num_partition_sectors="81920" partofsingleimage="false" physical_partition_number="0" readbackverify="false" size_in_KB="40960.0" sparse="false" start_byte_hex="0x50000000" start_sector="2621440"/>
  <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="PNX-0-0010-0001-hidden.img.ext4" label="hidden_b" num_partition_sectors="81920" partofsingleimage="false" physical_partition_number="0" readbackverify="false" size_in_KB="40960.0" sparse="false" start_byte_hex="0x52800000" start_sector="2703360"/>
  <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="PNX-00WW-030-cda.img" label="cda_a" num_partition_sectors="16384" partofsingleimage="false" physical_partition_number="0" readbackverify="false" size_in_KB="8192.0" sparse="false" start_byte_hex="0x55000000" start_sector="2785280"/>
  <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="PNX-00WW-030-cda.img" label="cda_b" num_partition_sectors="16384" partofsingleimage="false" physical_partition_number="0" readbackverify="false" size_in_KB="8192.0" sparse="false" start_byte_hex="0x55800000" start_sector="2801664"/>
  <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="systeminfo.img" label="systeminfo_a" num_partition_sectors="512" partofsingleimage="false" physical_partition_number="0" readbackverify="false" size_in_KB="256.0" sparse="false" start_byte_hex="0x56000000" start_sector="2818048"/>
  <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="systeminfo.img" label="systeminfo_b" num_partition_sectors="512" partofsingleimage="false" physical_partition_number="0" readbackverify="false" size_in_KB="256.0" sparse="false" start_byte_hex="0x56040000" start_sector="2818560"/>
  <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="PNX-00WW-030-splash.img" label="splash_a" num_partition_sectors="65536" partofsingleimage="false" physical_partition_number="0" readbackverify="false" size_in_KB="32768.0" sparse="false" start_byte_hex="0x56080000" start_sector="2819072"/>
  <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="PNX-00WW-030-splash.img" label="splash_b" num_partition_sectors="65536" partofsingleimage="false" physical_partition_number="0" readbackverify="false" size_in_KB="32768.0" sparse="false" start_byte_hex="0x58080000" start_sector="2884608"/>
  <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="PNX-00WW-030-multi-splash.img" label="zplash_a" num_partition_sectors="8192" partofsingleimage="false" physical_partition_number="0" readbackverify="false" size_in_KB="4096.0" sparse="false" start_byte_hex="0x5a080000" start_sector="2950144"/>
  <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="PNX-00WW-030-multi-splash.img" label="zplash_b" num_partition_sectors="8192" partofsingleimage="false" physical_partition_number="0" readbackverify="false" size_in_KB="4096.0" sparse="false" start_byte_hex="0x5a480000" start_sector="2958336"/>
  <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="PNX-0-431A-NV-default.mbn" label="nvdef_a" num_partition_sectors="8192" partofsingleimage="false" physical_partition_number="0" readbackverify="false" size_in_KB="4096.0" sparse="false" start_byte_hex="0x5a880000" start_sector="2966528"/>
  <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="PNX-0-431A-NV-default.mbn" label="nvdef_b" num_partition_sectors="8192" partofsingleimage="false" physical_partition_number="0" readbackverify="false" size_in_KB="4096.0" sparse="false" start_byte_hex="0x5ac80000" start_sector="2974720"/>
  <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="PNX-00WW-001-sutinfo.img" label="sutinfo" num_partition_sectors="8" partofsingleimage="false" physical_partition_number="0" readbackverify="false" size_in_KB="4.0" sparse="false" start_byte_hex="0x5b080000" start_sector="2982912"/>
  <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="PNX-0-431A-00WW-boot.img" label="boot_a" num_partition_sectors="131072" partofsingleimage="false" physical_partition_number="0" readbackverify="false" size_in_KB="65536.0" sparse="false" start_byte_hex="0x5e081000" start_sector="3081224"/>
  <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="PNX-0-431A-00WW-boot.img" label="boot_b" num_partition_sectors="131072" partofsingleimage="false" physical_partition_number="0" readbackverify="false" size_in_KB="65536.0" sparse="false" start_byte_hex="0x62081000" start_sector="3212296"/>
  <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="PNX-0-431A-00WW-system.img" label="system_a" num_partition_sectors="6291456" partofsingleimage="false" physical_partition_number="0" readbackverify="false" size_in_KB="3145728.0" sparse="true" start_byte_hex="0x66081000" start_sector="3343368"/>
  <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="PNX-0-431A-00WW-system_other.img" label="system_b" num_partition_sectors="6291456" partofsingleimage="false" physical_partition_number="0" readbackverify="false" size_in_KB="3145728.0" sparse="true" start_byte_hex="0x126081000" start_sector="9634824"/>
  <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="PNX-0-431A-00WW-vendor.img" label="vendor_a" num_partition_sectors="1572864" partofsingleimage="false" physical_partition_number="0" readbackverify="false" size_in_KB="786432.0" sparse="true" start_byte_hex="0x1e8000000" start_sector="15990784"/>
  <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="PNX-0-431A-00WW-vendor.img" label="vendor_b" num_partition_sectors="1572864" partofsingleimage="false" physical_partition_number="0" readbackverify="false" size_in_KB="786432.0" sparse="true" start_byte_hex="0x218000000" start_sector="17563648"/>
  <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="" label="userdata" num_partition_sectors="0" partofsingleimage="false" physical_partition_number="0" readbackverify="false" size_in_KB="0" sparse="true" start_byte_hex="0x248000000" start_sector="19136512"/>
  <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="PNX-0-431A-gpt_main0.bin" label="PrimaryGPT" num_partition_sectors="34" partofsingleimage="true" physical_partition_number="0" readbackverify="false" size_in_KB="17.0" sparse="false" start_byte_hex="0x0" start_sector="0"/>
  <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="PNX-0-431A-gpt_backup0.bin" label="BackupGPT" num_partition_sectors="33" partofsingleimage="true" physical_partition_number="0" readbackverify="false" size_in_KB="16.5" sparse="false" start_byte_hex="(512*NUM_DISK_SECTORS)-16896." start_sector="NUM_DISK_SECTORS-33."/>
</data>

 

 

Flash process:

  • Start QFIL in admin mode. Switch to flat build.
  • Select firehose programmer path "PNX-0-431A-prog_firehose_lite.elf" present inside extracted rom dir. Load XML -> (All files *.* mode) -> load rawprogram0_RECOVER_431A.xml, then do same for patch0.xml. patch is already present in rom dir.
  • Connect phone in EDL mode. Port will be shown in QFIL. If not then select port from select port button.
  • Press download button. Flashing will start. It will takes 5-10+ minutes to write the rom.
  •  Re-enter EDL mode by unplugging usb. Start partition manager and erase userdata. Click userdata then right click userdata and erase it. Same can be done from Phone by entering recovery mode. Turn off phone, press UP button then power for few seconds. When device starts release power button but keep UP pressed. When dead android robot icon is seen press power then press UP. Wipe cache and userdata. Reboot.

 

In case you are seeing "Your device is corrupt. It cannot be trusted. Press button to continue". You should enable dm-verity enforcing. Search internet for multiple ways to do it. e.g. https://forum.xda-developers.com/t/guide-fix-dm-verity-is-not-enforcing-when-trying-to-boot-error.3898526/



If everything has been done as written you must be having a good backup of device to get back into your initial condition and a working Android 10 on your device. I did it and i am enjoying Android 10.



CRITICAL information for experimentation:

Always verify if a file which has to be written into device is sparse or not. elf, mbn etc are raw and not sparse. IMG  files can and cannot be sparse. Sparse means post processed raw image to reduce size or other purpose. Always use sparse="true" in rawprogram xml when not sure. fh_laoder will test and tell itself when download button is pressed. However best way verify xml and data is to try to create xml digest. Its present in tools section in QFIL.



Wednesday, April 5, 2023

How to fix OnePlus 7 Pro display timeout auto reset to 15 seconds

OnePlus 7 Pro when updated to Android 11 has a bug to auto reset to 15 seconds timeout. However OnePlus 7 pro has got Android 12 upgrade and there isnl a setting which fixes this.

Got to Settings > Battery > Power Save Mode > Default Optimisations > Change 15s timeout setting.

Below are images for the same in same order




The toggle button has to be turned off "Change auto screen-off time to 15s".

I don't know if same if available in Android 11 ROM. If this setting is available then time out can be set to one setting everytime.

Friday, March 24, 2023

Flipkart is the worst online store even mail to CEO doesn't work.

Warning: If you are sharing your complaint on flipkart Twitter, Facebook etc which public can view then there will be automated replies by bots. They will provide you contact numbers which are all frauds. DO NOT CALL THEM. Check their identity on Truecaller if you want to. NEVER share all of your personal details on online public forums etc. Scammers use that same information to win your trust. Many times the scammers are simply somewhere linked to the internal staff doing illegal activities and misusing company's customer data.


This is about my single most worst online shopping experience ever since 2007!. I never knew Flipkart which i blindly trusted is such a fraudulent like store. Its only a matter about who gets trapped into this mess. I was the one this time.


I ordered a solar panel but got a hair clip. Just by looking at the package i got into doubt because it was smaller and lighter than what i ordered. But i thought this might be flexible model of solar panel therefore smaller in size but started making video recording from picking the product from hands of courier guy to unboxing. The video was shared to Flipkart and they also agreed this is probably due to some mishandling while packaging. But they don't care to refund me.

I sent mails to their all levels of support i.e. first customer care number to level 2 to grievances department to highest social team to even their CEO Kalyal Krishnamurthy (email id at end of article). First time ever a company exist where even contacting CEO is worthless. What a waste company it is. Its not a company its a comedy corporate structure where everything is taken so lightly. Below are screenshots of many things i faced -

Picture of what i received and the seller you must know to save yourself "Serplex trading private limited, 634/1 A- Block, Rangouri Extn, New Delhi - 110037" seller has name "Deals Mall" in Flipkart.

Product listing on Flipkart:



Mail to CEO with no reply and no effect. Imagine the support level where even CEO is careless.



Refund cancellation after repeated complaints and super cool assurances!


Non serious replies by Twitter support team. They keep sending "We hear you...", "We understand you.." no matter you even send them a joke. Looks like they don't read anything. Screenshot where they don't do anything other than copy paste replies sometimes with names to show they are really reading it.


They send pickup sms everyday and then fail to pickup. You have to keep someone ready at home for courier. This is nothing but mockery! You tell someone everyday that you are coming to their home and then don't go. Below screenshot shows threads of Flipkart, Ekart sms. Each thread has multiple sms inside. These are just SMSs for 1 return!. There are so many calls, emails, chats etc. If that doesn't make you believe their quality of services what else will. Their tagline/title with logo says "Buyer protection" LOL 😂.


There are many video recordings i did where the courier company EKart which is just another brand of Flipkart is denying the package in live talk with Flipkart executive! They are playing blame games and treating me like a football. I am not attaching those videos and many call recordings here. But probably will.

I also registered complaint in National Consumer Helpline and Flipkart sends a mediocre reply - "We will revert to it"... They are still reverting from weeks!


A company where even contacting the CEO is worthless can simply be considered a gutter of online shopping world. That's all i wanted to say after they ruined my solar project work. This is what it means being a plus member of this company with almost 10yrs of huge shopping.

Seller item snapshot:

Write your critical issue to kalyan@flipkart.com (email id of Flipkart CEO Kalyan Krishnamurthy) but i can assure you will not get any solution. CEO doesn't reads mails and doesn't care. Not just me but many people have sent mail to CEO and not to wonder this careless behaviour of CEO only represents the culture of Flipkart. This company will give you the experience of grey market shopping i.e. the raddi/chor bazar like experience.

Final update:

Flipkart closed case saying return period is over. The return period was intentionally wasted by themselves.

Cyber cell also closed the case without contacting me at all. When i contacted them they said "kal contact kijiye". Its no hope anywhere other than actual FIR and court. So basically forget your money. People of even critical cases barely get justice so its no less than joke to expect solution for regular frauds lesser value economic loss.

Cyber cell reply:

Dear Sir/Madam,Status of your grievance reported on https://cybercrime.gov.in with Acknowledgement No. : 23104230026870,has changed to Closed. Login on https://cybercrime.gov.in to view the details.Regards,National Cyber Crime Reporting Portal.THIS IS AN AUTOMATED MESSAGE - PLEASE DO NOT REPLY DIRECTLY TO THIS EMAIL

Friday, March 10, 2023

Teardown of mini ups for cctv, wifi and other 12v devices upto 36 watt.

I purchased Oakter Mini ups. I bought it at Rs  699 from Cred store https://app.cred.club/spQx/zdkqevnb. You can always use price history monitoring apps to check if the price is right to buy. E.g. this site https://pricehistoryapp.com/

I wanted to modify it for my laptop so that i can charge my laptop. Even though the capacity is less my purpose was to just charge or behave like a micro ups. For the purpose i tear it down to check the components inside. Below are some pictures of it.


The mini ups is a pre built module using Lithium Ion batteries 18650-20. 3.7volt with 20 Ampere current delivery. Two cells are used in series to make 7.4v (7.7 actual). Batteries have a protector circuit integrated.

7 volt is step up to 12v using buck-boost DC-DC converter. The chip used is 6019 (XL6019E1) https://datasheetspdf.com/pdf/839862/Xlsemi/XL6019/1.

Most of such circuits are modularly made. Means separate modules are used instead of designing whole circuit as a single web.

The purpose of this article is to help you get access to commercial product circuit and therefore utilize the information to do DIY activities. My purpose didn't require whole circuit modification but after looking at batteries i think i needed higher wattage buck module to boost dc to 19v. The batteries can easily deliver 45watts for my laptop.

Max battery power without protection chip => 7.4v X 20A ( 148 watts )
Divide it by 19v to get max output current 148/19 = 7.78A. Using battery with protector module it gives ~7.7v with ~7.7A current i.e. ~60watt. 60÷19 = 3.15A at 19v. Laptop requires 2.37A at 19v max for fast charging with running laptop. This can easily deliver it. But it would be better to add more batteries to reach 1.5 times capacity of laptop to use it as laptop power bank or better say laptop mini ups.

This mini ups is available here -







Saturday, February 18, 2023

Low cost yet effective sleep monitoring. Tests for sleep apnea etc issues.

From teenage i suffered a strange problem my first part of my whole sleep used to be nightmarish, or less relaxing. If i slept 6 hrs starting 1-2 hrs are mostly bad.

After many years of suffering one reason i found time gap between dinner and sleep. If gap is very high i.e. 6+ hours then sleep was much better. Every person has different body and has different weak and strong parts in body. From teenage my gut was not great and from that time this problem started. I ate lots of sugar in childhood, i abused meal timing very much, not eating for long and this type of behavior led to poor digestive health. But later i tried to fix almost every bad routine like sleeping late night to eating on time.

Today (2023) we have powerful technology at hand at low cost. Using which we can monitor some factors effecting sleep. I read about sleep apnea and thought i could be suffering this problem at some level for some reason. So i decided to test my sleep.

I tried smart watches to monitor sleep but they are definitely not good for serious sleep monitoring. The reasons are inaccurate sensors, high polling time of sensor data etc. Smart watches poll sensor data at high time gap. For example pulse is checked every 1-5  minutes and spo2 is checked every 10-30 minutes. What if spo2 was low during 2 consecutive polls? For this reason i shifted to oximeter.

I found many oximeters which could monitor the pulse and oxygen every second. This is far far ahead of smart watches. Some oximeters are Beurer PO 80, Miditive MPO-04. Many oximeters have Bluetooth which can log sensor data to phone.

Software for Bluetooth based oximeter have very bad rating on stores due to various issues like Bluetooth disconnected, data not logged after some time etc. Beurer oximeter has complaints of outdated pc software and data loss after saving sleep data to pc. Means the data was erased after download into pc. The cost of this oximeter is high and considering the limitations and lack of software support this oximeter doesn't fit for cost and features.

Then a very low budget solution was available to me which is M-170 oximeter. This is mass produced in China and rebranded by many companies. I got it at Rs900 i.e. ~USD11. In bulk it can even cost $2.

Here are some links for this oximeter -








This oximeter is just rebranded and has unique feature of maximum 8 hours of recording. The recording is split into 15 minutes parts. 4 hours of sleep is split into 16 pages. It can be used to monitor 15 minutes or even lesser data but should be for non sleep tests only. I will recommend to buy any cheaper oximeter from any brand because all are same. The model must be M-170 with 8 hours recording. There are some models which look same but don't offer recording. Old models had RR (respiratory rate) feature. Updated models have ODI (oxygen desaturation index).


Below are images of oximeter i took after my 4 hours sleep recording. I slept more but removed the oximeter.


My spo2 went down to 93 but that time i was awake after a sleep of 1.5hrs. The oximeter was loose and my left hand was pressed and blood flow went down. I learned many critical things by using it. Many false readings can happen due to many reasons. Like oximeter is loose, blood flow reduced to the hand, battery is not full, fingers are not clean and clear, fingers are rough, skin is very hard, very dark pigments etc. Its important to ensure these kind of things are not causing bad values in oximeter.

The graph is generated between minimum and maximum values read by oximeter. If minimum is 90 and max is 99 then the graph shows how values have chaned between these two. This makes it easier to analyze values despite low resolution screen of device and almost less visible data.

Page 1/16 means the first 15 minutes of sleep. Each page is 15 minutes of sleep. Total 16 pages means 4hrs of sleep data. Maths 15 minute page X 16 pages = 240 minutes of data. Even if total pages are different and don't match with 15min/page then it can be calculated using same maths. The low spo2 was caused by myself which i fixed and slept again. I will record more and then make any conclusion. It will help me monitor my sleep after different routine of day. What i ate, when i slept etc to remove activities that harm my sleep.

This monitor can also be used to check spo2 and pulse during physical activities e.g. 30 minute walk. But oximeter must not be loose and sweat etc things can also affect the reading. ODI value must be counted for sleep tests only. And sleep must be standard not a little nap.

Special note: Last recording of this oximeter doesn't erase even after removing batteries.

I hope this will help into your sleep monitoring. 

Monday, February 13, 2023

DIY making OTG with power supply for Fire Stick.

This article will help make these -






This has been tested on Fire TV stick 3rd generation 2021. It has only one USB micro port and that's for plugging its own 5v 1A adapter. There are already many cables available in market but making it is so simple that those who cannot buy new cable for any reason can make it.

Items required:
- OTG micro cable or OTG adapter.
- USB cable to tear and join with otg.

Pic 1


Picture 1 shows an OTG cable and a usb cable. The usb cable can be a usb charging cable or data cable.

As shown in pic 1 carefully cut the otg cable to take out 4 wires. The RED is +ve, BLACK is -ve. Do not cut the white, green wires. USB data will transfer from those wires NOT usb power. The red and black wires will provide power to both fire stick and usb device. Now join the power supply wires of usb cable to otg cable as shown in pic 2.

Pic 2


Now test all wires they should not short with other wire colors. In case your usb has different colors then you must check the +ve & -ve wires using multimeter or other method. Now pack the wires with tape etc as shown in pic 3.


The micro port connects to fire stick and white usb male goes to adapter and female usb port can be used to plug pen drive, gamepad, wireless dongle etc.

Warning: do not connect high power devices like external hard disk to otg. The fire stick adapter only supplies 5 watt of power and any device having high requirements will shutdown whole setup. For connecting high power devices use higher power adapter.

Note: This otg may cause the fire stick to suddenly reboot from "Loading..." Screen. Even if this happens try again it can work or try to change adpaters.

One thing i have noticed this setup sometimes works sometimes fire stick reboots from loading screen. But it works when i use fire stick adapter. This might be due to power supply difference. Fire stick says only connect 5 volt 1 Ampere adapter. For this reason we should make a setup which supplies 5w power to fire stick and higher power to usb device via external supply. Like only connecting data wires of otg to usb device and different power wires to fire stick and different power wires to usb female port or simply provide high Ampere from adapter but use small current restriction circuit to allow 1A to go to fire stick. This is not needed but i am not sure what causes reboots. Once fire stick boots to UI then it doesn't reboots.

I have tested this cable with wireless keyboard & mouse dongles, pendrive, external hard disk, ps2 to usb gamepad adapter.


Fire stick issue with some gamepads:
When i connect ps2 gamepad using ps2 to usb adapter it handles button 1 & 2 for shortcut. Button 1 for launching custom app and button 2 to Bluetooth devices list. This makes the gamepad useless. This means any input which has button 1 & button 2 unique IDs will behave same ways and cannot be used. Will always launch shortcut apps. This can be solved but i am simply using BT gamepads. This issue doesn't happen with XInput and Direct Input gamepads.







Friday, January 6, 2023

Hacking Infernax Morality system and other settings with save file.

The infernax morality system is hidden but can be seen in save file. This post is for windows version. The save file is located at c:\Users\%USER%\AppData\LocalLow\Berzerk Studio\infernax folder. Other OS have their own location. Extra tips and hacks at bottom of post.

Firstly install Notepad++ and open the file infernax.666

This file contains game related settings and options.666 have sound etc settings.

Search moralityScore in this text and set it to 34 to unlock "Protect the relic quest". 

Warning: changing the length of file will corrupt the save file. Make a backup first!

You can get Whatever XP upto 9999. Search "xp": and change the 4 digits only. DO NOT ADD extra characters to change total length of save file. If morality is 2 digit number then don't make it 3 digit. Same applies to other settings. This way game can be hacked to get your quests or enable hidden locations etc.

Since save state is single any bad decision will ruin the game and replay is needed therefore backing up of save is important. Or trick with morality score and other settings.


How to get full demonology by hacking save file?

Just replace "numKilled":0 to "numKilled":1
This means all demons will be set to be killed at least once. This will give full demonology by hack!. This will enable Gregor to send you to future. Ultimate weapon is then granted to kill the final boss.