@related: arpalhands

#! /bin/bash -e
LSUSB_ID="ID 4102:1041 iRiver, Ltd."
SECTOR0="eb58904d53444f53352e3000020824000200000000f800003f00ff000000000000107600761d00000000000002000000010006000000000000000000000000000001298acb76f84e4f204e414d4520202020464154333220202033c98ed1bcf47b8ec18ed9bd007c884e028a5640b408cd137305b9ffff8af1660fb6c640660fb6d180e23ff7e286cdc0ed0641660fb7c966f7e1668946f8837e16007538837e2a007732668b461c6683c00cbb0080b90100e82b00e94803a0fa7db47d8bf0ac84c074173cff7409b40ebb0700cd10ebeea0fb7debe5a0f97debe098cd16cd196660663b46f80f824a00666a0066500653666810000100807e02000f852000b441bbaa558a5640cd130f821c0081fb55aa0f851400f6c1010f840d00fe4602b4428a56408bf4cd13b0f96658665866586658eb2a6633d2660fb74e1866f7f1fec28aca668bd066c1ea10f7761a86d68a56408ae8c0e4060accb80102cd1366610f8254ff81c300026640490f8571ffc34e544c4452202020202020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d0a52656d6f7665206469736b73206f72206f74686572206d656469612eff0d0a4469736b206572726f72ff0d0a507265737320616e79206b657920746f20726573746172740d0a0000000000accbd8000055aa"
 
function check_output_file
{
    local output_file="${1}"
    if [ -f "${output_file}" ]; then
        echo -n "Overwrite ${output_file} [y/N] ? "
        read
        if [ "${REPLY}" != "y" -a "${REPLY}" != "Y" ]; then
            echo "Abort !"
            exit
        fi
    fi
}
 
function create_binary_sector0
{
    local output_file="${1}"
    check_output_file "${output_file}"
    echo -n "${SECTOR0}" | xxd -p -r > "${output_file}"
    if [ $(wc -c "${output_file}" | awk '{print $1}') = 512 ] ; then
        echo "${output_file} file creation succeed"
    else
        echo "${output_file} file creation failure !"
        rm -f "${output_file}"
        exit
    fi
}
 
function check_device_presence
{
    local nb_device="$(lsusb | grep "${LSUSB_ID}" | wc -l)"
    if [ ${nb_device} = 0 ] ; then
        echo "iRiver E100 physical device not found !"
        exit
    elif [ ${nb_device} -gt 1 ] ; then
        echo "${nb_device} iRiver E100 physical devices found !"
        echo "Only one at once is supported !"
        exit
    fi
}
 
function get_physical_device
{
    check_device_presence
    local field_set=($(dmesg | cat -n | grep iriver | grep E100 | grep "0: " | tail -1))
    if [ ${#field_set[*]} -gt 4 ] ; then
        NB_LINE="${field_set[0]}"
        ADDRESS="$(echo "${field_set[4]}" | sed 's/:$//')"
    else
        echo "Unable to get physical device !"
        echo "Not enough number of fields to parse !"
        exit
    fi
}
 
function get_system_device
{
    get_physical_device
    local field_set=($(dmesg | grep "${ADDRESS}" | grep "Attached SCSI removable disk"))
# TODO: check /proc/bus/scsi
    if [ ${#field_set[*]} -gt 4 ] ; then
        DEVICE="$(echo "${field_set[4]}" | tr -d '[]')"
    else
        echo "Unable to get system device !"
        echo "Not enough number of fields to parse !"
        exit
    fi
}
 
function dump_info
{
    local output_file="${1}"
    check_output_file "${output_file}"
    get_physical_device
    dmesg | sed -n ${NB_LINE},\$p | grep "${ADDRESS}" > "${output_file}"
    echo "${output_file} file creation succeed"
}
 
function read_from_device
{
    local output_file="${1}"
    check_output_file "${output_file}"
    get_system_device
    > "${output_file}"
    sudo dd if="/dev/${DEVICE}" of="${output_file}" bs=512 count=1
    if [ ${?} = 0 -a $(wc -c "${output_file}" | awk '{print $1}') = 512 ] ; then
        echo "Read sector 0 from iRiver device to ${output_file} file succeed"
    else
        echo "Read sector 0 from iRiver device to ${output_file} file failed !"
        exit
    fi
}
 
function write_to_device
{
    local input_file="${1}"
    get_system_device
    sudo dd if="${input_file}" of="/dev/${DEVICE}" bs=512 count=1
    if [ ${?} = 0 ] ; then
        echo "Write sector 0 from ${input_file} file to iRiver device succeed"
    else
        echo "Write sector 0 from ${input_file} file to iRiver device failed !"
        exit
    fi
}
 
function create_archive
{
    local output_file="tmp.tar.gz"
    [ "$1" != "" ] && output_file="${1}"
    check_output_file "${output_file}"
    tar zcf "${output_file}" sector0 dmesg.log
    if [ ${?} = 0 ]
    then
        echo "${output_file} file creation succeed"
    else
        echo "${output_file} file creation failure !"
        exit
    fi
}
 
function create_pkg
{
    read_from_device "sector0"
    dump_info "dmesg.log"
    local output_file="${1}"
    check_output_file "${output_file}"
    create_archive "${output_file}"
}
 
CMD_SET=(
rescue 
read   
write  
info   
package)
 
FUNC_SET=(
create_binary_sector0
read_from_device
write_to_device
dump_info
create_pkg)
 
if [ ${#} != 2 ] ; then
 
cat<<EOF
Usage: $0
EOF
 
    echo -n "[ ${CMD_SET[0]} output_file | ${CMD_SET[1]} output_file | "
    echo "${CMD_SET[2]} input_file | ${CMD_SET[3]} output_file | ${CMD_SET[4]} output_file ]"
    echo -e "\t${CMD_SET[0]}  : write to output_file a factory 512 bytes sector 0 (USE ONLY TO REPAIR 4 GO IRIVER E100 DEVICE)"
    echo -e "\t${CMD_SET[1]}    : read 512 bytes sector 0 from iRiver E100 device and write them to output_file"
    echo -e "\t${CMD_SET[2]}   : write 512 bytes sector 0 to iRiver E100 device read from input_file "
    echo -e "\t${CMD_SET[3]}    : write to output_file iRiver E100 device dmesg information"
    echo -e "\t${CMD_SET[4]} : write to output_file a tgz archive containing result of read and info commands"
    exit
fi
 
idx=0
while [ ${idx} -lt ${#CMD_SET[*]} ] ; do
    if [ "${1}" = "${CMD_SET[idx]}" ]
    then
        ${FUNC_SET[idx]} "${2}"
        exit
    fi
    ((++idx))
done
echo "${1} is an unknown command !"
e100.txt · Last modified: 2022/04/16 12:22 (external edit)
 
Except where otherwise noted, content on this wiki is licensed under the following license: CC Attribution-Share Alike 3.0 Unported
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki