Jump to content


Photo

gellmar's notes on E-400 development

- - - - -

  • Please log in to reply
13 replies to this topic

#1
gellmar

gellmar

    Enthusiast

  • Members
  • PipPipPip
  • 189 posts
  • Devices:LG Optimus L3 E400
Here I will post notes on LG E-400 development.

My repos @ github:

https://github.com/g...lge-kernel-e400 - Suxsem/UMS kernel (overclock/usb mass storage/tun/swap/pptp etc.) for normal and SDMergE400
https://github.com/g...device_lge_e400 branch ics - device patches for normal CM9 (mass storage, checkboxes fixes etc)
https://github.com/g...device_lge_e400 branch ics-sdmerge400 - device patches for SDMergE400 mod (mass storage, checkboxes fixes etc)
https://github.com/g...oid_system_core branch ics - system/core for normal and SDMergE400 (charger and encryption fix)
https://github.com/g...oid_system_vold branch ics - system/vold for normal and SDMergE400 (mass storage - volume manager daemon)

Edited by gellmar, 09 April 2013 - 08:37 PM.

  • 2

#2
gellmar

gellmar

    Enthusiast

  • Members
  • PipPipPip
  • 189 posts
  • Devices:LG Optimus L3 E400
MTP Enable for CM9 - September 30, 2012:

Spoiler

Edited by gellmar, 09 March 2013 - 11:22 AM.

  • 0

#3
gellmar

gellmar

    Enthusiast

  • Members
  • PipPipPip
  • 189 posts
  • Devices:LG Optimus L3 E400
Battery charger fix - March 08, 2013:

Spoiler

Edited by gellmar, 11 March 2013 - 04:39 PM.

  • 0

#4
gellmar

gellmar

    Enthusiast

  • Members
  • PipPipPip
  • 189 posts
  • Devices:LG Optimus L3 E400
USB Mass Storage fix - March 11,2013

Patches:

e400-mass-storage-kernel-fix-gellmar.patch (applied on kernel/lge/e400/)
Spoiler


e400-mass-storage-device-fix-gellmar.patch (applied on device/lg/e400):
Spoiler


e400-mass-storage-vold-fix-gellmar.patch (applied on system/vold):
Spoiler


e400-disable-adb-on-charger-fix-gellmar.patch (on system/core/rootdir):
Spoiler


So I started debugging USB mass storage bug after battery charger fix, and found that
su
setprop sys.usb.config mass_storage, adb

pops up the virtual mount without a data, and the device detected is a Linux-CD gadget. From Google I found a command that resulted me with a working USB drive:

su
echo /dev/block/mmcblk0p20 > /sys/devices/platform/msm_hsusb/gadget/lun0/file
setprop sys.usb.config mass_storage, adb

The next obvious step was to construct a script like

su
echo /dev/block/mmcblk0p20 > /sys/devices/platform/msm_hsusb/gadget/lun0/file
echo /dev/block/mmcblk1 > /sys/devices/platform/msm_hsusb/gadget/lun1/file
setprop sys.usb.config mass_storage, adb

to enable the storage, but... there was no lun1.

I inspected the kernel sources for gadget and found the following commit in cyanogenmod/lge-kernel-e400:
https://github.com/C...3a620771e3f27e4

which gave me the code at lge-kernel-e400 / drivers / usb / gadget / android.c:


static int mass_storage_function_init(struct android_usb_function *f,
struct usb_composite_dev *cdev)
{
struct mass_storage_function_config *config;
struct fsg_common *common;
int err;

config = kzalloc(sizeof(struct mass_storage_function_config),
GFP_KERNEL);
if (!config)
return -ENOMEM;

config->fsg.nluns = 1;
config->fsg.luns[0].removable = 1;

common = fsg_common_init(NULL, cdev, &config->fsg);
if (IS_ERR(common)) {
kfree(config);
return PTR_ERR(common);
}

err = sysfs_create_link(&f->dev->kobj,
&common->luns[0].dev.kobj,
"lun");
if (err) {
fsg_common_release(&common->ref);
kfree(config);
return err;
}

config->common = common;
f->config = config;
return 0;
}

So here was one LUN alloc'ed and registered in sysfs as /sys/class/android_usb/android0/lun. That's why we could use internal SD card as USB drive. But to achieve the multi-card capabilities and to clean the code up, I re-worked it, defining a constant BOARD_USB_MASS_STORAGE_NUM_LUNS for number of LUNs requested (the kernel spec says lun0-7 are acceptable, but I had no chance to check if there are active channels beyond lun1). The new code:

static int mass_storage_function_init(struct android_usb_function *f,
                    struct usb_composite_dev *cdev)
{
    struct mass_storage_function_config *config;
    struct fsg_common *common;
    char lun_name[5];
    int err;
    int i = 0;

    config = kzalloc(sizeof(struct mass_storage_function_config),
                                GFP_KERNEL);
    if (!config)
        return -ENOMEM;

    /* mass storage fix */

    config->fsg.nluns = BOARD_USB_MASS_STORAGE_NUM_LUNS;

    for (i=0; i < BOARD_USB_MASS_STORAGE_NUM_LUNS; i++)
        config->fsg.luns[i].removable = 1;

    common = fsg_common_init(NULL, cdev, &config->fsg);
    if (IS_ERR(common)) {
        kfree(config);
        return PTR_ERR(common);
    }

    for (i=0; i < BOARD_USB_MASS_STORAGE_NUM_LUNS; i++) {

            sprintf(lun_name,"lun%d",i);

        err = sysfs_create_link(&f->dev->kobj,
                &common->luns[i].dev.kobj,
                lun_name);
        if (err) {
            fsg_common_release(&common->ref);
            kfree(config);
            return err;
        }
    }


    config->common = common;
    f->config = config;
    return 0;
}

Also I defined a constant CONFIG_LGE_USB_GADGET_DRIVER for kernel/lge/e400/arch/arm/mach-msm/lge/e0eu.h to ensure the LG values for USB VID&PID are considered into build instead of default Qualcomm ones.

After that I rebuilt the kernel and got lun0 and lun1 devices as expected. That was not so easy, but that was fine =)

The second question was to enable the Mass storage in USB connection dialog. This dialog relies on VolumeStorage->AllowMassStorage property, which in turn goes from storage_list.xml from /system/frameworks/framework-res.apk. I fixed it as follows device/lge/e400/overlay/frameworks/base/core/res/res/xml/storage_list.xml):

<StorageList xmlns:android="http://schemas.android.com/apk/res/android">
    <storage android:mountPoint="/mnt/extra-sd"
             android:storageDescription="@string/storage_sd_card"
             android:removable="true"
             android:primary="false"
             android:emulated="false"
             android:allowMassStorage="true"/>
    <storage android:mountPoint="/mnt/sdcard"
             android:storageDescription="@string/storage_internal"
             android:removable="false"
             android:primary="true"
             android:emulated="false"
             android:allowMassStorage="true"/>
</StorageList>

and did a framework rebuild (before I had to make he whole platform and it took 19 GB on my drive). The resulting framework.jar and framework-res.apk I pulled to the system partition within recovery along with new boot.img and I was able to unlock the setting. The USB Mass Storage panel appeared but it was still not able to mount anything!

The logcat told me:

VolD: Failed to open lunfile /sys/class/android_usb/android0/f_mass_storage/lun/file for LUN 0
....
VolD: Failed to open lunfile /sys/class/android_usb/android0/f_mass_storage/lun/file for LUN 1
....

That was funny. I realized that vold code was in a close touch with kernel symlink I just broke, and the whole problem of mass storage could be easily solved by replacing frameworks! But I wanted both cards on my USB drive like in a good old Gingerbread, so I fixed one line in system/vold/VolumeManager.cpp:

"/sys/class/android_usb/android0/f_mass_storage/lun%d/file"

and recompiled vold. That's all done!

I also had to apply a minor fix for device's init.rc not to start adb at early bootup, because with a new kernel it allowed me to adb inside the charger :) I was amused but I doubt it is really necessary for an end user.

That's all. I made an update, flashed it, ran all tests.. and I am feeling lucky!

Edited by gellmar, 11 March 2013 - 10:26 PM.

  • 0

#5
gellmar

gellmar

    Enthusiast

  • Members
  • PipPipPip
  • 189 posts
  • Devices:LG Optimus L3 E400
FDISK layout of LG E-400 partitions - March 08,2013

Device	 Boot Start End Blocks	 Id	 System	 Mountpoint
/dev/block/mmcblk0p1 *	 1 	 3	 		 20		 4d Unknown
/dev/block/mmcblk0p2	 3	 128	 1003+	 45 Unknown
/dev/block/mmcblk0p3 	 129	 256		 1024	 46 Unknown
/dev/block/mmcblk0p4		 257	 238592		 1906688 5	 Extended
/dev/block/mmcblk0p5		 8193 8704 4096	 47 Unknown
/dev/block/mmcblk0p6		 8705 9216 4096	 2c Unknown
/dev/block/mmcblk0p7		 9217 9728 4096	 58 Unknown
/dev/block/mmcblk0p8		 9729	 12800		 24576	 77 Unknown
/dev/block/mmcblk0p9		 12801	 13824		 8192	 48 Unknown
/dev/block/mmcblk0p10		 13825	 14336		 4096	 4a Unknown
/dev/block/mmcblk0p11		 14337	 14848		 4096	 4b Unknown
/dev/block/mmcblk0p12		 14849	 18432		 28672	 49 Unknown
/dev/block/mmcblk0p13		 18433	 22016		 28672	 6c Unknown
/dev/block/mmcblk0p14		 22017	 70656		 389120 83 Linux
/dev/block/mmcblk0p15		 70657	 71680		 8192	 83 Linux
/dev/block/mmcblk0p16		 71681	 80896		 73728	 83 Linux
/dev/block/mmcblk0p17		 80897	 81920		 8192	 60 Unknown
/dev/block/mmcblk0p18		 81921	 82944		 8192	 83 Linux
/dev/block/mmcblk0p19		 82945	 84480		 12288	 6b Unknown
/dev/block/mmcblk0p20		 84481	 215552		 1048576 83 Linux
/dev/block/mmcblk0p21		 215553 236032		 163840 83 Linux
/dev/block/mmcblk0p22		 236033 238080		 16384	 83 Linux
/dev/block/mmcblk0p23		 238081 238592		 4096	 ff Unknown

What is what:

/dev/block/mmcblk0p1 - bootable partition of 20480 bytes with boot flag
/dev/block/mmcblk0p2 - firmware partition table routines and pre-boot - size 1027072 bytes
/dev/block/mmcblk0p3 - OEMSBL radio loader partition of 1 MiB
/dev/block/mmcblk0p5 - bootloader (?) partition, ref to fastboot commands - size 4 MiB
/dev/block/mmcblk0p6 - unknown partition - size 4 MiB
/dev/block/mmcblk0p7 - empty (00) partition - size 4 MiB

/dev/block/mmcblk0p8 - "misc" partition, size 24 MiB, partition type 0x77 (MMC_MISC_TYPE), contains info for LCD temperature calibration and test flag for factory reset and fota updates

/dev/block/mmcblk0p9 - /boot partition, partition type 0x48 (MMC_BOOT_TYPE), size 8 MiB
/dev/block/mmcblk0p10 - rmt_storage (service rmt_storage disabled) - size 4 MiB
/dev/block/mmcblk0p11 - rmt_storage (service rmt_storage disabled) - size 4 MiB
/dev/block/mmcblk0p12 - OKL4 (?) partition, present references to iguana/server/src/bootinfo.c - size 28 MiB
/dev/block/mmcblk0p13 - OKL4 (?) partition, present references to iguana/server/src/bootinfo.c - size 28 MiB
/dev/block/mmcblk0p14 - ext4 /system partition
/dev/block/mmcblk0p15 - ext4 /persist partition - Qualcomm WLAN binary, Gaspra and qualcomm conf - 8 MiB
/dev/block/mmcblk0p16 - ext4 /cache partition
/dev/block/mmcblk0p17 - /recovery partition, partition type 0x60 (MMC_RECOVERY_TYPE) size 8 MiB
/dev/block/mmcblk0p18 - ext4 /drm partition (LGDRM DivX), size 8 MiB
/dev/block/mmcblk0p19 - bootloader (?) partition, ref to fastboot commands, DemiGod crash handler, size 12 MiB
/dev/block/mmcblk0p20 - /sdcard - ! GiB
/dev/block/mmcblk0p21 - ext4 /data partition, size 157 MiB
/dev/block/mmcblk0p22 - ext4 /mpt partition (MLT Porting), size 16 MiB
/dev/block/mmcblk0p23 - empty (00) partition, size 4 MiB

UPD: fastboot shows the following partition layout (maybe for internal use):

/dev/block/mmcblk0p1 - sbl1
/dev/block/mmcblk0p2 - sbl3
/dev/block/mmcblk0p3 - tz
/dev/block/mmcblk0p4 - no name
/dev/block/mmcblk0p5 - rpm
/dev/block/mmcblk0p6 - no name
/dev/block/mmcblk0p7 - no name
/dev/block/mmcblk0p8 - misc
/dev/block/mmcblk0p9 - boot
/dev/block/mmcblk0p10 - modem-stl1
/dev/block/mmcblk0p11 - modem-stl2
/dev/block/mmcblk0p12 - no name
/dev/block/mmcblk0p13 - no name
/dev/block/mmcblk0p14 - system
/dev/block/mmcblk0p15 - userdata
/dev/block/mmcblk0p16 - persist
/dev/block/mmcblk0p17 - recovery
/dev/block/mmcblk0p18 - cache
/dev/block/mmcblk0p19 - no name
/dev/block/mmcblk0p20 - tombstones
/dev/block/mmcblk0p21 - no name
/dev/block/mmcblk0p22 - no name
/dev/block/mmcblk0p23 - no name

Edited by gellmar, 13 March 2013 - 01:47 PM.

  • 0

#6
gellmar

gellmar

    Enthusiast

  • Members
  • PipPipPip
  • 189 posts
  • Devices:LG Optimus L3 E400
The Storage Adventures - March 13, 2013

Notes about storage mounts. The idea about swapping and re-ordering partitions is practically acceptable if one knows where is the exact mount table is. As soon as crazybyte reported success on data / sdcard swap with init.rc, I started investigating the exact place where mount table is. For recovery, it is quite obvious - the recovery.fstab file, but for kernel, crazybyte guessed it was compiled inside kernel... and was right only partially. I inspected kernel sources, fastboot outputs and vold sources and that's I found:

Spoiler


The hack works. USB Mass Storage works, camera app works, adding applications and transferring them to SD card works too. I will make patches and publish them under the last spoiler.

To revert back partition table to stock, KDZ stock reflasher works - just tested it and stock V10F_00 booted like a charm.

Edited by gellmar, 09 April 2013 - 02:10 PM.

  • 3

#7
gellmar

gellmar

    Enthusiast

  • Members
  • PipPipPip
  • 189 posts
  • Devices:LG Optimus L3 E400
A little note on recovery fixing. During creation of three-step installer of SDMergE400, we got a problem of safely fdisk-ing the mmcblk0 which was used as cache by CWM.

So I fixed the init.rc:

on early-init
	 start ueventd
on init
	 export PATH /sbin
	 export ANDROID_ROOT /system
	 export ANDROID_DATA /data
	 export EXTERNAL_STORAGE /sdcard
	 symlink /system/etc /etc
	 mkdir /boot
	 mkdir /sdcard
	 mkdir /sd-ext
	 mkdir /datadata
	 mkdir /emmc
	 mkdir /system
	 mkdir /data
	 mkdir /cache
	 mount tmpfs tmpfs /tmp
	 mount tmpfs tmpfs /cache
on boot
	 ifup lo
	 hostname localhost
	 domainname localdomain
	 class_start default
service ueventd /sbin/ueventd
	 critical
service recovery /sbin/recovery
service adbd /sbin/adbd recovery
	 disabled
# Always start adbd on userdebug and eng builds
# In recovery, always run adbd as root.
on property:ro.debuggable=1
	 write /sys/class/android_usb/android0/enable 0
	 write /sys/class/android_usb/android0/idVendor 18D1
	 write /sys/class/android_usb/android0/idProduct D001
	 write /sys/class/android_usb/android0/functions adb
	 #write /sys/class/android_usb/android0/enable 1
	 write /sys/class/android_usb/android0/iManufacturer $ro.product.manufacturer
	 write /sys/class/android_usb/android0/iProduct $ro.product.model
	 write /sys/class/android_usb/android0/iSerial $ro.serialno
	 #start adbd
	 setprop service.adb.root 1
# Restart adbd so it can run as root
on property:service.adb.root=1
	 write /sys/class/android_usb/android0/enable 0
	 restart adbd
	 write /sys/class/android_usb/android0/enable 1

and recovery.fstab:

# mount point fstype device [device2] fstype2
/recovery emmc /dev/block/mmcblk0p17
/boot emmc /dev/block/mmcblk0p9
/cache tmpfs tmpfs
/data ext4 /dev/block/mmcblk0p21
/emmc vfat /dev/block/mmcblk0p20
/sdcard vfat /dev/block/mmcblk1 /dev/block/mmcblk1p1
/system ext4 /dev/block/mmcblk0p14

and repacked recovery.img with dsixda's kitchen. Now the mount table shows no references to mmcblk0 at all :)

 

if CWM recovery shows error 'format expects 3 args, got 4' - use update-binary from CM9 flashable zip.

Edited by gellmar, 31 March 2013 - 11:33 AM.

  • 0

#8
gellmar

gellmar

    Enthusiast

  • Members
  • PipPipPip
  • 189 posts
  • Devices:LG Optimus L3 E400
A note on VPN kernel counterparts. The VPN problem in CM9 consists of two sub-troubles:

1. The absence of /dev/tun module in the kernel
2. The MTPD failing to open PPPoX socket with message

D/mtpd    ( 1131): Received SCCRP -> Sending OCRQ (local = 57090)
I/mtpd    ( 1131): Tunnel established
D/mtpd    ( 1131): Received OCRQ (remote = 32972)
I/mtpd    ( 1131): Session established
I/mtpd    ( 1131): Creating PPPoX socket
F/mtpd    ( 1131): Socket() Protocol not supported
I/LegacyVpnRunner(  497): Aborting
I/LegacyVpnRunner(  497): java.lang.IllegalStateException: mtpd is dead
I/LegacyVpnRunner(  497):  at com.android.server.connectivity.Vpn$LegacyVpnRunner.execute(Vpn.java:569)
I/LegacyVpnRunner(  497):  at com.android.server.connectivity.Vpn$LegacyVpnRunner.run(Vpn.java:447)

The first problem is beaten by simply changing a line in kernel's cyanogenmod_e0_defconfig from

CONFIG_TUN=m

to

CONFIG_TUN=y

and rebuilding the kernel.

The second problem is slightly deeper, I had to spend 3 hours to find out what's wrong.

The reason of PPTP/L2TP VPN is not working is because mtpd uses the mismatching values for PX_PROTO_OLAP and PX_PROTO_OPNS constants, used in the socket creation code. This problem is noted in detail in the following Google Groups discussion:

https://groups.google.com/forum/#!msg/android-x86/1uCHFx4glgc/Yis3PkrD-nwJ

So I had to re-arrange the ./include/linux/if_pppox.h numbers just to match external/mtpd/ and bionic includes:

gellmar@android:/opt/cm9/kernel/lge/e400$ grep -R PX_PROTO /opt/cm9/bionic/libc/kernel/common/linux/
/opt/cm9/bionic/libc/kernel/common/linux/if_pppox.h:#define PX_PROTO_OE 0 
/opt/cm9/bionic/libc/kernel/common/linux/if_pppox.h:#define PX_PROTO_OL2TP 1 
/opt/cm9/bionic/libc/kernel/common/linux/if_pppox.h:#define PX_PROTO_PPTP 2
/opt/cm9/bionic/libc/kernel/common/linux/if_pppox.h:#define PX_PROTO_OLAC 3
/opt/cm9/bionic/libc/kernel/common/linux/if_pppox.h:#define PX_PROTO_OPNS 4

and re-compile the kernel. Also I enabled L2TP module with netlink (cyanogenmod_e0_defconfig):

CONFIG_L2TP=y
CONFIG_L2TP_V3=y

Now compile, repack and reflash :) Happy VPNing!

  • 0

#9
gellmar

gellmar

    Enthusiast

  • Members
  • PipPipPip
  • 189 posts
  • Devices:LG Optimus L3 E400
Note on missing checkboxes / combo-boxes / buttons in webkit render.

When one uses stock browser, one may notice that there are no checkboxes / radio buttons rendered on a webpage. This is because of absence of several render skin files in framework-res.apk. The following files are referred in https://github.com/C...WebKit/android/ RenderXXX.cpp and they ought to be located in frameworks/base/core/res/res/drawable-ldpi but these aren't there.

So I copied the following files from drawable-mdpi folder to drawable-ldpi and recompiled framework-res.apk:

# core/res/res/drawable-ldpi/btn_check_off_holo.png
# core/res/res/drawable-ldpi/btn_check_on_holo.png
# core/res/res/drawable-ldpi/btn_default_disabled_holo.9.png
# core/res/res/drawable-ldpi/btn_default_focused_holo.9.png
# core/res/res/drawable-ldpi/btn_default_normal_holo.9.png
# core/res/res/drawable-ldpi/btn_default_pressed_holo.9.png
# core/res/res/drawable-ldpi/btn_radio_off_holo.png
# core/res/res/drawable-ldpi/btn_radio_on_holo.png
# core/res/res/drawable-ldpi/combobox_disabled.png
# core/res/res/drawable-ldpi/combobox_nohighlight.png
# core/res/res/drawable-ldpi/ic_media_stop.png
# core/res/res/drawable-ldpi/scrubber_control_disabled_holo.png
# core/res/res/drawable-ldpi/scrubber_control_focused_holo.png
# core/res/res/drawable-ldpi/scrubber_control_normal_holo.png
# core/res/res/drawable-ldpi/scrubber_control_pressed_holo.png
# core/res/res/drawable-ldpi/scrubber_primary_holo.9.png
# core/res/res/drawable-ldpi/scrubber_secondary_holo.9.png
# core/res/res/drawable-ldpi/scrubber_track_holo_dark.9.png
# core/res/res/drawable-ldpi/scrubber_track_holo_light.9.png
# core/res/res/drawable-ldpi/spinner_76_inner_holo.png
# core/res/res/drawable-ldpi/spinner_76_outer_holo.png

and got all the skinned controls visible and clickable.

Also for now, a stock browser crash inside the WebCore on some websites with an error cause 'Http:Transaction:DoCacheReadData' can be worked around by disabling Javascript. The permanent issue is discussed at http://code.google.c...detail?id=40784 and the possible fix is to force reloading of JS scripts file if there is no cached version before the WebCore starts trying to load them from cache.

  • 1

#10
gellmar

gellmar

    Enthusiast

  • Members
  • PipPipPip
  • 189 posts
  • Devices:LG Optimus L3 E400
Note on layout xml editing. When I tried to fix lockscreen, I faced the xml layout editing problem. Here I will describe certain tricks I used to re-order the interface just fit our 120ppi 320x240 screen.

First of all, the offset of a field from left side of previous view inside LinearLayout can be specified by android:marginLeft attribute.

Second, to add new named control, you need to specify a new android:id="@+id/yournewid" and in this case the text for your new control has to be placed in frameworks/base/core/res/res/xml/strings.xml (not in overlay file for your device!)

Third, if you see a GridLayout a nd a component spanning several rows, you shoud assume that one widget sibling of GridLayout is a row.

  • 0

#11
gellmar

gellmar

    Enthusiast

  • Members
  • PipPipPip
  • 189 posts
  • Devices:LG Optimus L3 E400
Note on porting the SDMergE400 mod for stock 2.3.6 firmware,

First, I de-odexed the ROM with dsixda's kitchen, also added root. Then I fixed stock init.rc as follows:

on early-init
start ueventd
on init
sysclktz 0
loglevel 3
# setup the global environment
export PATH /sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin
export LD_LIBRARY_PATH /vendor/lib:/system/lib
export ANDROID_BOOTLOGO 1
export ANDROID_ROOT /system
export ANDROID_ASSETS /system/app
export ANDROID_DATA /data
export EXTERNAL_STORAGE /mnt/sdcard
export ASEC_MOUNTPOINT /mnt/asec
export LOOP_MOUNTPOINT /mnt/obb
# [START] LGE_USE_INTERNAL_FAT
export EXTERNAL_ADD_STORAGE /mnt/sdcard/_ExternalSD
export ASEC_ADD_MOUNTPOINT /mnt/extasec
export LOOP_ADD_MOUNTPOINT /mnt/extobb
# [END] LGE_USE_INTERNAL_FAT
export BOOTCLASSPATH /system/framework/core.jar:/system/framework/bouncycastle.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/android.policy.jar:/system/framework/services.jar:/system/framework/core-junit.jar


# Backward compatibility
symlink /system/etc /etc
symlink /sys/kernel/debug /d
# Right now vendor lives on the same filesystem as system,
# but someday that may change.
symlink /system/vendor /vendor
# create mountpoints
mkdir /mnt 0775 root system
mkdir /mnt/sdcard 0000 system system
# Create cgroup mount point for cpu accounting
mkdir /acct
mount cgroup none /acct cpuacct
mkdir /acct/uid
# Backwards Compat - XXX: Going away in G*
symlink /mnt/sdcard /sdcard
# [START] LGE_USE_INTERNAL_FAT
symlink /mnt/sdcard/_ExternalSD /sdcard/_ExternalSD
# [END] LGE_USE_INTERNAL_FAT
mkdir /system
mkdir /data 0771 system system
mkdir /persist 0771 system system
mkdir /cache 0770 system cache
mkdir /config 0500 root root
mkdir /persist 0771 system system
# [START] MLT Porting
mkdir /mpt 0771 system system
# [END] MLT Porting
# Directory for putting things only root should see.
mkdir /mnt/secure 0700 root root
# Directory for staging bindmounts
mkdir /mnt/secure/staging 0700 root root
# Directory-target for where the secure container
# imagefile directory will be bind-mounted
mkdir /mnt/secure/asec 0700 root root
# [START] LGE_USE_INTERNAL_FAT
mkdir /mnt/extsecure 0700 root root
mkdir /mnt/extsecure/staging 0700 root root
mkdir /mnt/extsecure/extasec 0700 root root
# [END] LGE_USE_INTERNAL_FAT
# Secure container public mount points.
mkdir /mnt/asec 0700 root system
mount tmpfs tmpfs /mnt/asec mode=0755,gid=1000
# Filesystem image public mount points.
mkdir /mnt/obb 0700 root system
mount tmpfs tmpfs /mnt/obb mode=0755,gid=1000
# [START] LGE_USE_INTERNAL_FAT
mkdir /mnt/extasec 0000 root system
mount tmpfs tmpfs /mnt/extasec mode=0755,gid=1000
mkdir /mnt/extobb 0700 root system
mount tmpfs tmpfs /mnt/extobb mode=0755,gid=1000
# [END] LGE_USE_INTERNAL_FAT
write /proc/sys/kernel/panic_on_oops 1
write /proc/sys/kernel/hung_task_timeout_secs 0
write /proc/cpu/alignment 4
write /proc/sys/kernel/sched_latency_ns 10000000
write /proc/sys/kernel/sched_wakeup_granularity_ns 2000000
write /proc/sys/kernel/sched_compat_yield 1
write /proc/sys/kernel/sched_child_runs_first 0
# Create cgroup mount points for process groups
mkdir /dev/cpuctl
mount cgroup none /dev/cpuctl cpu
chown system system /dev/cpuctl
chown system system /dev/cpuctl/tasks
chmod 0777 /dev/cpuctl/tasks
write /dev/cpuctl/cpu.shares 1024
mkdir /dev/cpuctl/fg_boost
chown system system /dev/cpuctl/fg_boost/tasks
chmod 0777 /dev/cpuctl/fg_boost/tasks
write /dev/cpuctl/fg_boost/cpu.shares 1024
mkdir /dev/cpuctl/bg_non_interactive
chown system system /dev/cpuctl/bg_non_interactive/tasks
chmod 0777 /dev/cpuctl/bg_non_interactive/tasks
# 5.0 %
write /dev/cpuctl/bg_non_interactive/cpu.shares 52
# LGDRM, DivX [[email protected]], 2011-07-16 [START]
mkdir /drm 0771 system system
# LGDRM, DivX [[email protected]], 2011-07-16 [END]


on fs
# mount mtd partitions
# Mount /system rw first to give the filesystem a chance to save a checkpoint
mount yaffs2 mtd@system /system
#mount yaffs2 mtd@system /system ro remount
mount yaffs2 mtd@userdata /data nosuid nodev
mount yaffs2 mtd@persist /persist nosuid nodev
mount yaffs2 mtd@cache /cache nosuid nodev
mount yaffs2 mtd@persist /persist nosuid nodev
on emmc-fs
# mount mmc partitions
# [E2FSPROGS 1.41.14] change e2fsck option from -p to -y so that filesystem problems
# are fixed without human intervention.
# if there're too many problems -p option requests manual operation.
wait /dev/block/mmcblk0p14
mount ext4 /dev/block/mmcblk0p14 /system ro data=ordered barrier=1

wait /dev/block/mmcblk0p20
exec /system/bin/demigod_make_ext4fs -e /dev/block/mmcblk0p20 /data
exec /system/bin/e2fsck -y /dev/block/mmcblk0p20
mount ext4 /dev/block/mmcblk0p20 /data nosuid nodev noatime barrier=1 data=ordered noauto_da_alloc errors=continue

wait /dev/block/mmcblk0p15
exec /system/bin/demigod_make_ext4fs -e /dev/block/mmcblk0p15 /persist
exec /system/bin/e2fsck -y /dev/block/mmcblk0p15
mount ext4 /dev/block/mmcblk0p15 /persist nosuid nodev data=ordered barrier=1
wait /dev/block/mmcblk0p16
exec /system/bin/demigod_make_ext4fs -e /dev/block/mmcblk0p16 /cache
exec /system/bin/e2fsck -y /dev/block/mmcblk0p16
mount ext4 /dev/block/mmcblk0p16 /cache nosuid nodev data=ordered barrier=1
wait /dev/block/mmcblk0p18
exec /system/bin/demigod_make_ext4fs -e /dev/block/mmcblk0p18 /drm
exec /system/bin/e2fsck -y /dev/block/mmcblk0p18
mount ext4 /dev/block/mmcblk0p18 /drm nosuid nodev data=ordered barrier=1
# [START] LGE_USE_INTERNAL_FAT
#wait /dev/block/mmcblk0p20
#exec /system/bin/resize2fs /dev/block/mmcblk0p20
#exec /system/bin/e2fsck -y /dev/block/mmcblk0p20
#mount vfat /dev/block/mmcblk0p20 /mnt/sdcard
# [END] LGE_USE_INTERNAL_FAT
# [START] MLT Porting
wait /dev/block/mmcblk0p21
exec /system/bin/demigod_make_ext4fs -e /dev/block/mmcblk0p21 /mpt
exec /system/bin/e2fsck -y /dev/block/mmcblk0p21
mount ext4 /dev/block/mmcblk0p21 /mpt nosuid nodev data=ordered barrier=1
# [END] MLT Porting
## ANDY_PORTING LGDRM [[email protected] 100401]
# LGDRM, DivX [[email protected]], 2011-07-16 [START]
chown system system /drm
chmod 0771 /drm
#LGDRM
mkdir /drm/lgdrm 0770 lgdrm lgdrm_acc
chown lgdrm lgdrm_acc /drm/lgdrm
chmod 0770 /drm/lgdrm
#DivX
mkdir /drm/multimedia 0770 media system
chown media system /drm/multimedia
chmod 0770 /drm/multimedia
# LGDRM, DivX [[email protected]], 2011-07-16 [END]
## ANDY_END
## [email protected] [2011-07-26] - Referred from Victor model
start rmt_storage
on post-fs
# once everything is setup, no need to modify /
mount rootfs rootfs / ro noatime remount
# We chown/chmod /data again so because mount is run as root + defaults
chown system system /data
chmod 0771 /data
# Mounting of persist is moved to 'on emmc-fs' and 'on fs' sections
# We chown/chmod /persist again so because mount is run as root + defaults
chown system system /persist
chmod 0771 /persist
chmod 0664 /sys/devices/platform/msm_sdcc.1/polling
chmod 0664 /sys/devices/platform/msm_sdcc.2/polling
chmod 0664 /sys/devices/platform/msm_sdcc.3/polling
chmod 0664 /sys/devices/platform/msm_sdcc.4/polling
# Chown polling nodes as needed from UI running on system server
chown system system /sys/devices/platform/msm_sdcc.1/polling
chown system system /sys/devices/platform/msm_sdcc.2/polling
chown system system /sys/devices/platform/msm_sdcc.3/polling
chown system system /sys/devices/platform/msm_sdcc.4/polling
# Create dump dir and collect dumps.
# Do this before we mount cache so eventually we can use cache for
# storing dumps on platforms which do not have a dedicated dump partition.

mkdir /data/dontpanic
# FRANDRO_CHANGE_S [[email protected]] <For Error Handler>
chmod 662 /dev/log/main
chmod 662 /dev/log/system
chmod 662 /dev/log/events
chmod 662 /dev/log/radio
#chown root log /data/dontpanic
chown root system /data/dontpanic
#chmod 0750 /data/dontpanic
chmod 0775 /data/dontpanic
mkdir /data/tombstones
chown system system /data/tombstones
chmod 0755 /data/tombstones
# FRANDRO_CHANGE_E [[email protected]]
# Collect apanic data, free resources and re-arm trigger
copy /proc/apanic_console /data/dontpanic/apanic_console
chown root log /data/dontpanic/apanic_console
chmod 0640 /data/dontpanic/apanic_console
copy /proc/apanic_threads /data/dontpanic/apanic_threads
chown root log /data/dontpanic/apanic_threads
chmod 0640 /data/dontpanic/apanic_threads
write /proc/apanic_console 1
# [START] MLT Porting
chown system system /mpt
chmod 0771 /mpt
# [END] MLT Porting

# Same reason as /data above
chown system cache /cache
chmod 0770 /cache
# This may have been created by the recovery system with odd permissions
chown system cache /cache/recovery
chmod 0770 /cache/recovery
#change permissions on vmallocinfo so we can grab it from bugreports
chown root log /proc/vmallocinfo
chmod 0440 /proc/vmallocinfo
#change permissions on kmsg & sysrq-trigger so bugreports can grab kthread stacks
chown root system /proc/kmsg
chmod 0440 /proc/kmsg
chown root system /proc/sysrq-trigger
chmod 0220 /proc/sysrq-trigger
# create basic filesystem structure
mkdir /data/misc 01771 system misc
mkdir /data/misc/bluetoothd 0770 bluetooth bluetooth
mkdir /data/misc/bluetooth 0770 system system
mkdir /data/misc/keystore 0700 keystore keystore
mkdir /data/misc/vpn 0770 system system
mkdir /data/misc/systemkeys 0700 system system
mkdir /data/misc/vpn/profiles 0770 system system
# give system access to wpa_supplicant.conf for backup and restore
mkdir /data/misc/wifi 0770 wifi wifi
[email protected] [2011/07/27], change 0770 to 0771 for OTA test
chmod 0771 /data/misc/wifi
chmod 0660 /data/misc/wifi/wpa_supplicant.conf
mkdir /data/local 0771 shell shell
mkdir /data/local/tmp 0771 shell shell
mkdir /data/data 0771 system system
mkdir /data/app-private 0771 system system
mkdir /data/app 0771 system system
mkdir /data/property 0700 root root
mkdir /data/radio 0770 radio radio
# we use "radio" for gid to access from "rild" for AT cmd.
chown system radio /system/etc/firmware/wlan/volans/WCN1314_qcom_wlan_nv.bin
chmod 0660 /system/etc/firmware/wlan/volans/WCN1314_qcom_wlan_nv.bin
# LGE_CHANGE_E, 20110727, [email protected]
# [email protected](2010.01.11).begin: add for XT9 user dictionary
#mkdir /data/xt9 0777 system system
#chown system system /data/xt9
#chmod 0777 /data/xt9
# [email protected](2010.01.11).end
mkdir /data/misc/sensors 0775 root root
write /data/system/sensors/settings 0
chmod 0664 /data/system/sensors/settings
# create dalvik-cache and double-check the perms
mkdir /data/dalvik-cache 0771 system system
chown system system /data/dalvik-cache
chmod 0771 /data/dalvik-cache
# create the lost+found directories, so as to enforce our permissions
mkdir /data/lost+found 0770
mkdir /cache/lost+found 0770
# double check the perms, in case lost+found already exists, and set owner
chown root root /data/lost+found
chmod 0770 /data/lost+found
chown root root /cache/lost+found
chmod 0770 /cache/lost+found
#LGE_DEV_PORTING M3_NFC
# NFC
chmod 0666 /dev/pn544
setprop ro.nfc.port I2C
#LGE_DEV_END
# 20110216 [email protected] for ANDY_LGDRM [START]
## ANDY_PORTING LGDRM [[email protected] 100401]
# create dirs if not exist
mkdir /data/lgdrm 0770 lgdrm lgdrm_acc
mkdir /data/wmdrm 0770 lgdrm lgdrm_acc
## ANDY_END
# 20110216 [email protected] for ANDY_LGDRM [END]
# LGE_DEV_PORTING, [[email protected]], 2011-05-06
## LGE_MERGE_S
# Nextreaming - DIVX_DRM
mkdir /drm/multimedia/nx 0770 media system
chown media system /drm/multimedia/nx
chmod 0770 /drm/multimedia/nx

mkdir /drm/multimedia/uma 0770 media system
chown media system /drm/multimedia/uma
chmod 0770 /drm/multimedia/uma
mkdir /drm/multimedia/scnt 0770 media system
chown media system /drm/multimedia/scnt
chmod 0770 /drm/multimedia/scnt
mkdir /drm/multimedia/scnt/sdadf 0770 media system
chown media system /drm/multimedia/scnt/sdadf
chmod 0770 /drm/multimedia/scnt/sdadf
# END : Nextreaming - DIVX_DRM
## LGE_MERGE_E
# LGE_DEV_END [[email protected]]
#ifdef LGE_ROOTING_FEATURE
## princlee add for rooting
mkdir /persist/hidden
chown root root /persist/hidden
chmod 0755 /persist/hidden
#endif
## or
## #ifdef LGE_ROOTING_FEATURE
## princlee add for rooting
## change direcoty to persist incase of QCT
## mkdir /data/hidden
## chown root root /data/hidden
## chmod 0755 /data/hidden
## #endif
#if defined(ANDY_ERS)
## ERS
mkdir /data/data/com.lge.ers
mkdir /data/data/com.lge.ers/android
mkdir /data/data/com.lge.ers/kernel
mkdir /data/data/com.lge.ers/arm9
chmod 0777 /data/data/com.lge.ers/android
chmod 0777 /data/data/com.lge.ers/kernel
chmod 0777 /data/data/com.lge.ers/arm9
#endif
# 20110824, [email protected], make ringtone,alarm property directory [START]
mkdir /data/audioprop 0777 system system
# 20110824, [email protected], make ringtone,alarm property directory [END]
on boot
# basic network init
ifup lo
hostname localhost
domainname localdomain
# set RLIMIT_NICE to allow priorities from 19 to -20
setrlimit 13 40 40
# don't require sim
setprop keyguard.no_require_sim 1
# Define the oom_adj values for the classes of processes that can be
# killed by the kernel. These are used in ActivityManagerService.
setprop ro.FOREGROUND_APP_ADJ 0
setprop ro.VISIBLE_APP_ADJ 1
setprop ro.PERCEPTIBLE_APP_ADJ 2
setprop ro.HEAVY_WEIGHT_APP_ADJ 3
setprop ro.SECONDARY_SERVER_ADJ 4
setprop ro.BACKUP_APP_ADJ 5
setprop ro.HOME_APP_ADJ 6
setprop ro.HIDDEN_APP_MIN_ADJ 7
setprop ro.EMPTY_APP_ADJ 15
# Define the memory thresholds at which the above process classes will
# be killed. These numbers are in pages (4k).
setprop ro.FOREGROUND_APP_MEM 2048
setprop ro.VISIBLE_APP_MEM 3072
setprop ro.PERCEPTIBLE_APP_MEM 4096
setprop ro.HEAVY_WEIGHT_APP_MEM 4096
setprop ro.SECONDARY_SERVER_MEM 6144
setprop ro.BACKUP_APP_MEM 6144
setprop ro.HOME_APP_MEM 6144
setprop ro.HIDDEN_APP_MEM 7168
setprop ro.EMPTY_APP_MEM 8192
# Write value must be consistent with the above properties.
# Note that the driver only supports 6 slots, so we have combined some of
# the classes into the same memory level; the associated processes of higher
# classes will still be killed first.
write /sys/module/lowmemorykiller/parameters/adj 0,1,2,4,7,15
write /proc/sys/vm/overcommit_memory 1
write /proc/sys/vm/min_free_order_shift 4
write /sys/module/lowmemorykiller/parameters/minfree 2048,3072,4096,6144,7168,8192
# Set init its forked children's oom_adj.
write /proc/1/oom_adj -16
# Tweak background writeout
write /proc/sys/vm/dirty_expire_centisecs 200
write /proc/sys/vm/dirty_background_ratio 5
# LGE_CHANGE_S, [Data_Patch_014] [[email protected]], 2011-04-26 <Define TCP buffer sizes for various networks>
# Adjust socket buffer to enlarge TCP receive window for high bandwidth
write /proc/sys/net/ipv4/tcp_adv_win_scale 2 #<-- (1 -> 2) 20100816 NJ sewon.kim QC SR result for android.net.cts.TrafficStatsTest#testTrafficStatsForLocalhost
# LGE_CHANGE_E, [Data_Patch_014] [[email protected]], 2011-04-26 <Define TCP buffer sizes for various networks>
# Permissions for System Server and daemons.
chown radio system /sys/android_power/state
chown radio system /sys/android_power/request_state
chown radio system /sys/android_power/acquire_full_wake_lock
chown radio system /sys/android_power/acquire_partial_wake_lock
chown radio system /sys/android_power/release_wake_lock
chown radio system /sys/power/state
chown radio system /sys/power/wake_lock
chown radio system /sys/power/wake_unlock
chmod 0660 /sys/power/state
chmod 0660 /sys/power/wake_lock
chmod 0660 /sys/power/wake_unlock
chown system system /sys/class/timed_output/vibrator/enable
chown system system /sys/class/leds/keyboard-backlight/brightness
chown system system /sys/class/leds/lcd-backlight/brightness
chown system system /sys/class/leds/button-backlight/brightness
chown system system /sys/class/leds/jogball-backlight/brightness
chown system system /sys/class/leds/red/brightness
chown system system /sys/class/leds/green/brightness
chown system system /sys/class/leds/blue/brightness
chown system system /sys/class/leds/red/device/grpfreq
chown system system /sys/class/leds/red/device/grppwm
chown system system /sys/class/leds/red/device/blink
chown system system /sys/class/leds/red/brightness
chown system system /sys/class/leds/green/brightness
chown system system /sys/class/leds/blue/brightness
chown system system /sys/class/leds/red/device/grpfreq
chown system system /sys/class/leds/red/device/grppwm
chown system system /sys/class/leds/red/device/blink
chown system system /sys/class/timed_output/vibrator/enable
chown system system /sys/module/sco/parameters/disable_esco
chown system system /sys/kernel/ipv4/tcp_wmem_min
chown system system /sys/kernel/ipv4/tcp_wmem_def
chown system system /sys/kernel/ipv4/tcp_wmem_max
chown system system /sys/kernel/ipv4/tcp_rmem_min
chown system system /sys/kernel/ipv4/tcp_rmem_def
chown system system /sys/kernel/ipv4/tcp_rmem_max
chown root radio /proc/cmdline
# [110801 [email protected] M3_ALL]Add AT%FPRICRC [START]
# fpritest
mkdir /data/fpri
chown system system /data/fpri
chmod 0777 /data/fpri
# [110801 [email protected] M3_ALL] [END]
## Openchannel BEGIN [[email protected] 111122]
# Define OpenChannel Properties
setprop openchannel.net.dns 127.0.0.1:7053
setprop openchannel.net.active 0
setprop openchannel.net1.forward_port 8072
setprop openChannel.net1.forwards_to 127.0.0.1
## Openchannel END

## LGE UPDATE_FOTA_S M3 [email protected] 20011/09/29
chown system system /sys/module/lge_emmc_direct_access/parameters/fota_id_check
chown system system /sys/module/lge_emmc_direct_access/parameters/fota_id_read
## LGE UPDATE_FOTA_E M3 [email protected] 20011/09/29
#LGE_CHANGE_GPSONEXTRA [[email protected]][2010.08.28] [BEGIN]
mkdir /data/gpscfg 0777 system system
chown system system /data/gpscfg/gps_env.conf
chmod 0777 /data/gpscfg/gps_env.conf
#LGE_CHANGE_GPSONEXTRA [[email protected]][2010.08.28] [END]
# Define TCP buffer sizes for various networks
# ReadMin, ReadInitial, ReadMax, WriteMin, WriteInitial, WriteMax,
setprop net.tcp.buffersize.default 4096,87380,110208,4096,16384,110208
setprop net.tcp.buffersize.wifi 4095,87380,110208,4096,16384,110208
setprop net.tcp.buffersize.umts 4094,87380,110208,4096,16384,110208
setprop net.tcp.buffersize.edge 4093,26280,35040,4096,16384,35040
setprop net.tcp.buffersize.gprs 4092,8760,11680,4096,8760,11680
setprop net.tcp.buffersize.lte	 4094,87380,1220608,4096,16384,1220608
setprop net.tcp.buffersize.evdo_b 4094,87380,262144,4096,16384,262144
# Assign TCP buffer thresholds to be ceiling value of technology maximums
# Increased technology maximums should be reflected here.
write /proc/sys/net/core/rmem_max 1220608
write /proc/sys/net/core/wmem_max 1220608
class_start default

[email protected] not used chown system system /sys/module/android/parameters/usb_mode
[email protected] not used chmod 0666 /sys/module/u_lgeusb/parameters/user_mode
chown root system /sys/class/usb_composite/usb_mass_storage/enable
chown root system /sys/class/usb_composite/ecm/enable

chown system system /sys/devices/platform/usb_cdrom_storage/lun0/file
chown system system /sys/devices/platform/msm_hsusb/gadget/usb_state
chown system system /sys/module/u_lgeusb/parameters/user_mode
chown system system /sys/module/u_lgeusb/parameters/mode

chmod 0664 /sys/class/usb_composite/usb_mass_storage/enable
chmod 0664 /sys/class/usb_composite/ecm/enable

chmod 0664 /sys/devices/platform/usb_cdrom_storage/lun0/file
chmod 0664 /sys/devices/platform/msm_hsusb/gadget/usb_state
chmod 0664 /sys/module/u_lgeusb/parameters/user_mode
chmod 0664 /sys/module/u_lgeusb/parameters/mode
###

## Daemon processes to be run by init.
##
service ueventd /sbin/ueventd
critical
service console /system/bin/sh
console
disabled
user shell
group log
# [START] LGE_USE_INTERNAL_FAT
service formatfat /system/bin/sh /system/etc/format_fat32.sh
oneshot
# [END] LGE_USE_INTERNAL_FAT
# [email protected] merge from victor .default disable.
#on property:ro.secure=0
# start console
# adbd is controlled by the persist.service.adb.enable system property
service adbd /sbin/adbd
disabled
# adbd on at boot in emulator
on property:ro.kernel.qemu=1
start adbd
on property:persist.service.adb.enable=1
start adbd
on property:persist.service.adb.enable=0
stop adbd
#if defined(ANDY_ERS)
## ANDY_PORTING ERS
#ERS rpc daemon for qcom
service lge_ers_rpcd /system/bin/lge_ers_rpcd
# lge_ers_rpcd do not run in user build type
on property:ro.build.type=eng
stop lge_ers_rpcd
start lge_ers_rpcd
## ANDY_END
#endif
service servicemanager /system/bin/servicemanager
user system
critical
onrestart restart zygote
onrestart restart media
service vold /system/bin/vold
socket vold stream 0660 root mount
ioprio be 2
service netd /system/bin/netd
socket netd stream 0660 root system
service debuggerd /system/bin/debuggerd
service ril-daemon /system/bin/rild
socket rild stream 660 root radio
socket rild-debug stream 660 radio system
user root

#MUSCAT_PORTING
# START : FROM_MUSCAT 20110210 : REVIEWME
# Need to check whether any side effects happen later. Applied Muscat's.
group radio cache inet misc audio qcom_oncrpc diag system sdcard_rw
#group radio cache inet misc audio sdcard_rw qcom_oncrpc diag
#disabled
# END : FROM_MUSCAT 20110210
#MUSCAT_END
# 20110216 [email protected] for ANDY_LGDRM [START]
## ANDY_PORTING LGDRM [[email protected] 100401]
# Must executed before system_server
service lgdrm /system/bin/lgdrmserver
user lgdrm
group lgdrm_acc system sdcard_rw qcom_oncrpc radio
## ANDY_END
# 20110216 [email protected] for ANDY_LGDRM [END]
## [email protected] [2011-07-26] - Referred from Victor model
service rmt_storage /system/bin/rmt_storage /dev/block/mmcblk0p10 /dev/block/mmcblk0p11
user root
disabled
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
socket zygote stream 660 root system
onrestart write /sys/android_power/request_state wake
onrestart write /sys/power/state on
onrestart restart media
onrestart restart netd
service media /system/bin/mediaserver
user media
group system audio camera graphics inet net_bt net_bt_admin net_raw qcom_oncrpc
ioprio rt 4
service bootanim /system/bin/bootanimation
user graphics
group graphics lg_fota
disabled
oneshot
service dbus /system/bin/dbus-daemon --system --nofork
socket dbus stream 660 bluetooth bluetooth
user bluetooth
group bluetooth net_bt_admin
service bluetoothd /system/bin/bluetoothd -n
socket bluetooth stream 660 bluetooth bluetooth
socket dbus_bluetooth stream 660 bluetooth bluetooth
# init.rc does not yet support applying capabilities, so run as root and
# let bluetoothd drop uid to bluetooth with the right linux capabilities
group bluetooth net_bt_admin misc
disabled
service hfag /system/bin/sdptool add --channel=10 HFAG
user bluetooth
group bluetooth net_bt_admin
disabled
oneshot
service hsag /system/bin/sdptool add --channel=11 HSAG
user bluetooth
group bluetooth net_bt_admin
disabled
oneshot
service opush /system/bin/sdptool add --psm=5255 --channel=12 OPUSH
user bluetooth
group bluetooth net_bt_admin
disabled
oneshot
service pbap /system/bin/sdptool add --channel=19 PBAP
user bluetooth
group bluetooth net_bt_admin
disabled
oneshot
service installd /system/bin/installd
socket installd stream 600 system system
service flash_recovery /system/etc/install-recovery.sh
oneshot
service racoon /system/bin/racoon
socket racoon stream 600 system system
# racoon will setuid to vpn after getting necessary resources.
group net_admin
disabled
oneshot
service mtpd /system/bin/mtpd
socket mtpd stream 600 system system
user vpn
group vpn net_admin net_raw
disabled
oneshot
service keystore /system/bin/keystore /data/misc/keystore
user keystore
group keystore
socket keystore stream 666
service dumpstate /system/bin/dumpstate -s
socket dumpstate stream 0660 shell log
disabled
oneshot
#LGE_UPDATE_S, lgospd is removed in OSP 2.0, [email protected], 20110613
#ANDY_PORTING OSP [[email protected] 101027]
#service lgospd-hid /system/bin/lgospd-hid
# user root
# group system
# oneshot
#service lgospd /system/bin/lgospd
# user root
# group system graphics diag radio
#ANDY_END
#LGE_UPDATE_E, lgospd is removed in OSP 2.0, [email protected], 20110613

and re-packed the kernel. Also I changed the /system/etc/format-fat32.sh that forcedly restored vfat partition on new data partition:

#!/system/bin/sh
exit 0

and packed a flashable zip with a custom-fixed updater-script. I had to use convert update-script feature from kitchen, but finally this approach had missed several critical symlinks, so I mounted the system.img in my linux box and got the list of necessary symlinks pretty-printed for edify scripting:

find . -type l | while read LINE;
do
symstr=`ls -la $LINE`
echo 'symlink("'`echo $symstr | awk '{print $11}' | sed 's/^\./\/system/'`'","'`echo $symstr | awk '{print $9}' | sed 's/^\./\/system/'`'");' >> /tmp/kernels/stock_e400/stock_e400_symlinks
done

Finally I zipaligned and created a zip archive and tried to flash. Nothing! So I had to take zip from CyanogenMod and replace system folder with mine and the updater-script with new one. That worked.

The phone booted, but it still misses a /mnt/extra-sd so I need to patch storage_info.xml too.

UPDATE: there is no storage.info in Gingerbread (only ICS+) and I got a damaged card issue. So I digged inside and found that mmcblk0p20 value is hardcoded (sic!) into vold, framework, camera, browser etc!

UPDATE: The LG's tivoized vold forces /dev/block/vold/179:20 (0xb314) for /mnt/sdcard and /dev/block/vold/179:32 for /mnt/sdcard/_ExternalSD. External SD entry is controlled by vold.fstab, and /mnt/sdcard by code inside vold to prevent end-users from modding.

I had to patch vold to alter 0xb314 partNode with 0xb320 and used stock vold.fstab. As a result, the external SD card was mounted twice - as primary and secondary cards. To prevent the second mountpoint to process, I trued to delete the ExternalSD entry, but that caused vold to lose partition at all. The obvious solution was the following vold.fstab:
# Copyright (c) 2011, Code Aurora Forum. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#	 * Redistributions of source code must retain the above copyright
#	 notice, this list of conditions and the following disclaimer.
#	 * Redistributions in binary form must reproduce the above
#	 copyright notice, this list of conditions and the following
#	 disclaimer in the documentation and/or other materials provided
#	 with the distribution.
#	 * Neither the name of Code Aurora Forum, Inc. nor the names of its
#	 contributors may be used to endorse or promote products derived
#	 from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#dev_mount sdcard /mnt/sdcard auto /devices/platform/msm_sdcc.1/mmc_host
# LGE_CHANGE
# If sdcard isn't exist, mount emmc partition
# 2011-06-14, [email protected]
#dev_mount sdcard /mnt/sdcard auto /devices/platform/msm_sdcc.1/mmc_host /devices/platform/msm_sdcc.3/mmc_host
dev_mount sdcard /mnt/sdcard auto /devices/platform/msm_sdcc.3/mmc_host
dev_mount extsdcard /mnt/extra-sd auto /devices/platform/msm_sdcc.1/mmc_host

Here we have an ExternalSD entry but its name is not ExternalSD, so vold drops a framework request but handles the partition internally on 'volume mount /mnt/sdcard' call to vold.

Now the external card is reported as absent and the primary card has the size and feel of external one. The USB storage also works at full-speed (~4MB/sec) so this task can be considered as done :)

Edited by gellmar, 27 April 2013 - 03:06 PM.

  • 3

#12
gellmar

gellmar

    Enthusiast

  • Members
  • PipPipPip
  • 189 posts
  • Devices:LG Optimus L3 E400
Note on GDBugging the Linux native binaries on Android phone.

First of all I tried to use IDA Pro 6.1 + android_server. That gave me SIGSTOP on breakpoint, so I decided to use gdbserver and Affinic Debugger GUi for GDB. I grabbed a copy of gdbserver from http://gnutoolchains.com/android/ and dropped the gdbserver binary to /system/bin:

adb root
adb remount
adb push gdbserver /system/bin
adb shell chmod 755 /system/bin/gdbserver

Then I installed Affinic and pointed it to arm-linux-androideabi-gdb.exe from gdbserver bundle.

Now to start a debugging session, one simply needs the following snippet:

adb forward tcp:23946 tcp:23946
adb shell
# gdbserver localhost:23946 /your/app/name/bin
or
# gdbserver localhost:23946 --attach your-pid

Then connect to GDB server from Affinic debugger top-level menu and select localhost:23946 as remote gdbserver host.

After the debugger attaches to the remote, issue a command:

set arm fallback-mode thumb

to prevent gdbserver from mangling instruction errors.

Then one can set breakpoints and do usual debugging.

  • 0

#13
gellmar

gellmar

    Enthusiast

  • Members
  • PipPipPip
  • 189 posts
  • Devices:LG Optimus L3 E400
Note on USB mass storage fix on CyanogenMod 9. As you maybe know, the USB flash speed was one of breaking points for daily CM9 use. So I decided to find out what's wrong with it. I got some luck to get a custom stock kernel by kgdhost which performed well with USB, so I finally got something to compare with.

I used

sudo lsusb -vvv

to obtain USB flash configurations for cm9 and kgdhost's kernels, and tried to put them in turn. But then... a Luck :)

I changed the zImage inside boot.img, flashed... and got a USB drive while my phone was charging! Long after that I realized that tthe boot.img I used to swap zImage was a very early engineering build from my USB fix. And the speed was awesome! So I started digging.

I made the following experiment:

1. Booted the phone with new kernel.
2. Unmounted the SD card from the menu.
3. Issued as root:

echo "/dev/block/vold/179:32" > /sys/class/android_usb/android0/f_mass_storage/lun0/file

just like vold does

4.Set governor as performance (another trick gained from LG's stock firmware vold)

5. Got 3.6 MB/sec average write speed. Cool!

Then unmounted the storage with

echo "" > /sys/class/android_usb/android0/f_mass_storage/lun0/file

and shared volume via vold:

vdc volume share /mnt/sdcard ums


and got 870 kb/sec as expected. Fail!

That was the spot! I looked at system/vold/VolumeManager.cpp and found out what vold did that I did never:

if (mUmsSharingCount++ == 0) {
	    FILE* fp;
	    mSavedDirtyRatio = -1; // in case we fail
	    if ((fp = fopen("/proc/sys/vm/dirty_ratio", "r+"))) {
		    char line[16];
		    if (fgets(line, sizeof(line), fp) && sscanf(line, "%d", &mSavedDirtyRatio)) {
			    fprintf(fp, "%d\n", mUmsDirtyRatio);
		    } else {
			    SLOGE("Failed to read dirty_ratio (%s)", strerror(errno));
		    }
		    fclose(fp);
	    } else {
		    SLOGE("Failed to open /proc/sys/vm/dirty_ratio (%s)", strerror(errno));
	    }
    }

Funny, eh? The dirty-ratio trick did all the speed magic! And

VolumeManager::VolumeManager() {
    mDebug = false;
    mVolumes = new VolumeCollection();
    mActiveContainers = new AsecIdCollection();
    mBroadcaster = NULL;
    mUmsSharingCount = 0;
    mSavedDirtyRatio = -1;
    mVolManagerDisabled = 0;
    mNextLunNumber = 0;
    // set dirty ratio to ro.vold.umsdirtyratio (default 0) when UMS is active
    char dirtyratio[PROPERTY_VALUE_MAX];
    property_get("ro.vold.umsdirtyratio", dirtyratio, "0");
    mUmsDirtyRatio = atoi(dirtyratio);
}

So I put

ro.vold.umsdirtyratio=20

into build prop and fixed the governor change like LG did...

Pushed new vold, rebooted - voila! 3.70 MB/sec on CM9!

  • 0

#14
gellmar

gellmar

    Enthusiast

  • Members
  • PipPipPip
  • 189 posts
  • Devices:LG Optimus L3 E400
Note on in-call speaker mode fix. When one activates the speaker mode when making a call, its volume differs from the general mode negligibly. This was a bug of CM9 setup, which have never been present to the stock ROMs. so it was marked for fix in update 1.4 of my SDMergE400 and gellmar-mod ROMs. I spent abut five days to sort it out (with a three-day holiday, of course!) and now I found out what is wrong, and even can be the source of other possible bugs and improvements.

First of all, let me describe the Android audio subsystem. The sound in Android is built around the AudioFlinger service which in turn uses hardware/libhardware_legacy and hardware/qcom/media (for Qualcomm MSM-based phones). So I started logcat and got the following log for a speakerphone call:

D/InCallScreen(  657): toggleSpeaker(): newSpeakerState = true
I/AudioHardwareMSM76XXA(  430): Routing audio to Speakerphone
W/AudioHardwareMSM76XXA(  430): rpc_snd_set_device(6, 0, 0)
....
D/InCallScreen(  657): toggleSpeaker(): newSpeakerState = false
I/AudioHardwareMSM76XXA(  430): Routing audio to Handset
W/AudioHardwareMSM76XXA(  430): rpc_snd_set_device(6, 0, 0)

I started digging around setting volumes and audio routes. My very first attempt to patch was AndroidPoliceManager::setVoiceVolume multiplier in hardware/qcom/audio/msm7x27a/AndroidPolicyManager.cpp. That worked, but I was still not satisfied with the volume, because the stock one was noticeably louder. So I had to revert to stock and grab a logcat:

D/PhoneUtils(  502): turnOnSpeaker(flag=true, store=true)...
V/AudioHardwareMSM76XXA(  130): AudioStreamOutMSM72xx::setParameters() routing=2
V/AudioHardwareMSM76XXA(  130): set output routing 2
V/AudioHardwareMSM76XXA(  130): [LGE]doRouting(): outputDevices 2 ,mode 2
I/AudioHardwareMSM76XXA(  130): [LGE] ****** routing outputDevices[2] tty[0]
I/AudioHardwareMSM76XXA(  130): Routing call to Speakerphone
V/AudioHardwareMSM76XXA(  130): [LGE] Final outputDevices 2 new:7 mCur:6
E/AudioHardwareMSM76XXA(  130): [LGE]doAudioRouteOrMute() device 7, mMode 2, mMicMute 0
W/AudioHardwareMSM76XXA(  130): rpc_snd_set_device(7, 0, 0)
W/AudioHardwareMSM76XXA(  130): setVoiceVolume(0.666667) called
D/AudioHardwareMSM76XXA(  130): setVoiceVolume(0.666667)
I/AudioHardwareMSM76XXA(  130): Setting in-call volume to 4 (available range is 0 to 7)
D/AudioHardwareMSM76XXA(  130): rpc_snd_set_volume(32, 0, 5)
...
D/CallManager(  502):  setEchoSuppression(true)
D/CallManager(  502): ########### Dump CallManager ############
D/CallManager(  502): CallManager state = OFFHOOK
D/CallManager(  502):    - Foreground: ACTIVE from Handler{407c5ee8}
D/CallManager(  502):	  Conn: [ incoming: false state: ACTIVE post dial state: COMPLETE]
D/CallManager(  502):    - Background: IDLE from Handler{407c5ee8}
D/CallManager(  502):	  Conn: []
D/CallManager(  502):    - Ringing: IDLE from Handler{407c5ee8}
D/CallManager(  502):  Phone: Handler{407c5ee8}, name = GSM, state = OFFHOOK
D/CallManager(  502):    - Foreground: ACTIVE Background: IDLE Ringing: IDLE
D/CallManager(  502): ########## End Dump CallManager ##########
D/CallManager(  502): End setEchoSuppression(true)
D/CallManager(  502): ########### Dump CallManager ############
D/CallManager(  502): CallManager state = OFFHOOK
D/CallManager(  502):    - Foreground: ACTIVE from Handler{407c5ee8}
D/CallManager(  502):	  Conn: [ incoming: false state: ACTIVE post dial state: COMPLETE]
D/CallManager(  502):    - Background: IDLE from Handler{407c5ee8}
D/CallManager(  502):	  Conn: []
D/CallManager(  502):    - Ringing: IDLE from Handler{407c5ee8}
D/CallManager(  502):  Phone: Handler{407c5ee8}, name = GSM, state = OFFHOOK
D/CallManager(  502):    - Foreground: ACTIVE Background: IDLE Ringing: IDLE
D/CallManager(  502): ########## End Dump CallManager ##########

What do we see here? A lot of... but the most interesting is

I/AudioHardwareMSM76XXA(  130): Routing call to Speakerphone
V/AudioHardwareMSM76XXA(  130): [LGE] Final outputDevices 2 new:7 mCur:6
E/AudioHardwareMSM76XXA(  130): [LGE]doAudioRouteOrMute() device 7, mMode 2, mMicMute 0
W/AudioHardwareMSM76XXA(  130): rpc_snd_set_device(7, 0, 0)

rpc_snd_set_device is a routine that does real routing by switching ioctl's to 7x27a driver. So we get device number 7 in stock and 6 in Cyan. I compared the kernel sources and found that files related to endpoints were identical. So I patched a line in AudioHardware constructor and got the following mapping of endpoints ID vs endpoint name:

E/AudioHardwareMSM76XXA( 115): cnt = 0 ept->name = HANDSET_LOOPBACK ept->id = 5
E/AudioHardwareMSM76XXA( 115): cnt = 1 ept->name = HANDSET ept->id = 6
E/AudioHardwareMSM76XXA( 115): cnt = 2 ept->name = HEADSET_LOOPBACK ept->id = 1
E/AudioHardwareMSM76XXA( 115): cnt = 3 ept->name = HEADSET ept->id = 2
E/AudioHardwareMSM76XXA( 115): cnt = 4 ept->name = HEADSET_STEREO ept->id = 3
E/AudioHardwareMSM76XXA( 115): cnt = 5 ept->name = SPEAKER ept->id = 0
E/AudioHardwareMSM76XXA( 115): cnt = 6 ept->name = SPEAKER_IN_CALL ept->id = 7
E/AudioHardwareMSM76XXA( 115): cnt = 7 ept->name = SPEAKER_RING ept->id = 8
E/AudioHardwareMSM76XXA( 115): cnt = 8 ept->name = STEREO_HEADSET_AND_SPEAKER ept->id = 8
E/AudioHardwareMSM76XXA( 115): cnt = 9 ept->name = FM_HEADSET ept->id = 10
E/AudioHardwareMSM76XXA( 115): cnt = 10 ept->name = FM_SPEAKER ept->id = 11
E/AudioHardwareMSM76XXA( 115): cnt = 11 ept->name = BT ept->id = 13
E/AudioHardwareMSM76XXA( 115): cnt = 12 ept->name = TTY_HEADSET ept->id = 15
E/AudioHardwareMSM76XXA( 115): cnt = 13 ept->name = TTY_VCO ept->id = 16
E/AudioHardwareMSM76XXA( 115): cnt = 14 ept->name = TTY_HCO ept->id = 17
E/AudioHardwareMSM76XXA( 115): cnt = 15 ept->name = TTY_HCO_SPEAKER ept->id = 18
E/AudioHardwareMSM76XXA( 115): cnt = 16 ept->name = HANDSET_VR ept->id = 20
E/AudioHardwareMSM76XXA( 115): cnt = 17 ept->name = HEADSET_VR ept->id = 21
E/AudioHardwareMSM76XXA( 115): cnt = 18 ept->name = BT_VR ept->id = 23
E/AudioHardwareMSM76XXA( 115): cnt = 19 ept->name = NO_MIC_HEADSET ept->id = 4
E/AudioHardwareMSM76XXA( 115): cnt = 20 ept->name = HEADSET_WITHOUT_MIC_VR ept->id = 22
E/AudioHardwareMSM76XXA( 115): cnt = 21 ept->name = SPEAKER_LOOPBACK ept->id = 29
E/AudioHardwareMSM76XXA( 115): cnt = 22 ept->name = SPEAKER_AUXMIC ept->id = 30
E/AudioHardwareMSM76XXA( 115): cnt = 23 ept->name = CURRENT ept->id = 32

Everything clear? We have a state of SPEAKER_IN_CALL that operates at fuil possible volume, while SPEAKER limits the volume to prevent your ears to leak :) I changed the routing in do_routing and voila - it works.

You can see the patch vommitted in my github repo.

Additionally, I'd like to post a mapping of stream numbers that setStreamVolume, startOutput and other functions use:

enum stream_type {
DEFAULT =-1,
VOICE_CALL = 0,
SYSTEM = 1,
RING = 2,
MUSIC = 3,
ALARM = 4,
NOTIFICATION = 5,
BLUETOOTH_SCO = 6,
ENFORCED_AUDIBLE = 7, // Sounds that cannot be muted by user and must be routed to speaker
DTMF = 8,
TTS = 9,
#if defined(QCOM_HARDWARE) && !defined(USES_AUDIO_LEGACY)
FM = 10,
#endif
NUM_STREAM_TYPES
};

The volume change for media files (STREAM_MUSIC) is operated via AndroidPolicyManagerBase::setStreamVolume and the in-call voice (routed to handset aka normal operation mode) - by AndroidPolicyManager::setVoiceVolume.

Also I noticed that Cyanogenmod's msm7x27a AudioHardware.cpp lacks of many endpoints - marked as unnecessary, their absence leads to non-working loudspeaker, FM radio etc. That is why I post so detailed reference here.

  • 5




0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users