Small program to provide easy way to edit, unpack and pack KORG Professional Arranger series operating system packages.
Supported models:
model | mach id | product id |
---|---|---|
Pa600 | Z103A | 0 |
Pa900 | Z104A | 1 |
Pa300 | Z106A | 2 |
Pa3XLe | Z107A | 3 |
Havian 30 | Z108A | 4 |
Pa4X | Z110A | 5 |
#Supported chunks:
id | Name |
---|---|
1 | header |
2 - 14 | system file |
15 | installer script |
16 | directory |
18 | file |
19 | file system (rootfs) |
#Unsupported chunks:
id | Name |
---|---|
17 | link |
#System files:
id | type | path |
---|---|---|
2 | update kernel | /update/uImage |
3 | update ramdisk | /update/ramdisk.gz |
4 | update installer app | /update/lfo-pkg-install |
5 | update installer app config | /update/lfo-pkg-install.xml |
6 | service kernel | /service/uImage |
7 | service ramdisk | /service/ramdisk.gz |
8 | service app | /service/lfo-service |
9 | service app config | /service/lfo-service.xml |
10 | update launcher app | /service/lfo-pkg-launcher |
11 | update launcher app config | /service/lfo-pkg-launcher.xml |
12 | 1st stage bootloader (x-loader) | /boot/MLO |
13 | 2nd stage bootloader (u-boot) | /boot/u-boot.bin |
14 | user kernel | /kernel/uImage |
#Header structure:
type | size | path |
---|---|---|
int | 4 | id |
int | 4 | chunk size |
byte | 4 | pkg lib version |
int | 4 | upgrade/full flag |
short | 4 | 2 unknown shorts |
string | * | system type (mach_id/customization) |
string | * | build system 1 |
string | * | build system 2 |
string | * | creation date |
string | * | creation time |
string | * | package type 1 |
string | * | package type 2 |
2 = upgrade | 3 = full instalation
#System file structure:
type | size | path |
---|---|---|
int | 4 | id |
int | 4 | chunk size |
byte | 16 | MD5 sum of data |
byte | data size | data |
data size = chunk size - 16
#Installer script structure:
type | size | path |
---|---|---|
int | 4 | id |
int | 4 | chunk size |
byte | 16 | MD5 sum of data |
short | 2 | condition |
string | * | path |
byte | data size | data |
data size = chunk size - 16 - 2 - (length of path + 1)
#Directory structure:
type | size | path |
---|---|---|
int | 4 | id |
int | 4 | chunk size |
short | 2 | owner |
short | 2 | group |
short | 2 | attributes |
short | 2 | condition |
string | * | path |
#File structure:
type | size | path |
---|---|---|
int | 4 | id |
int | 4 | chunk size |
byte | 16 | MD5 sum of data |
short | 2 | owner |
short | 2 | group |
short | 2 | attributes |
short | 2 | condition |
int | 4 | data size |
byte | 1 | compression/encryption type |
string | * | path |
string | * | date |
string | * | time |
byte | * | data |
if compression type == 0 (raw data):
type | size | path |
---|---|---|
byte | data size | data |
else if compression type == 1 (zlib compression):
each file is divided in 1MB or smaller blocks
block type == 0x00000100:
type | size | path |
---|---|---|
int | 4 | block type |
int | 4 | compressed block size |
int | 4 | uncompressed block size (reversed byte order) |
byte | compressed block size - 4 | data |
block type == 0x00000101:
type | size | path |
---|---|---|
int | 4 | block type |
int | 4 | 0x00000000 |
block type = 0x00000100 -> data block
block type = 0x00000101 -> ending block
else if compression type == 16 (encryption)
#File system structure:
type | size | path |
---|---|---|
int | 4 | id |
int | 4 | chunk size |
byte | 16 | MD5 sum of data |
int | 4 | data size |
short | 2 | condition |
string | * | path |
byte | data size | data |
#Attributes
attribute | value |
---|---|
ATTR_VFAT_ARCHIVE | 0x1000 |
ATTR_VFAT_READONLY | 0x2000 |
ATTR_VFAT_SYSTEM | 0x4000 |
ATTR_VFAT_HIDDEN | 0x8000 |
ATTR_EXT3_OWNER_R | 0x0040 |
ATTR_EXT3_OWNER_W | 0x0080 |
ATTR_EXT3_OWNER_X | 0x0100 |
ATTR_EXT3_GROUP_R | 0x0008 |
ATTR_EXT3_GROUP_W | 0x0010 |
ATTR_EXT3_GROUP_X | 0x0020 |
ATTR_EXT3_OTHER_R | 0x0001 |
ATTR_EXT3_OTHER_W | 0x0002 |
ATTR_EXT3_OTHER_X | 0x0004 |
ATTR_EXT3_DONT_CHANGE | 0xFFFF |