Differences

This shows you the differences between two versions of the page.

Link to this comparison view

e100 [2012/11/04 21:01]
e100 [2022/04/16 12:22] (current)
Line 1: Line 1:
 +@related: [[arpalhands]]
 +
 +
 +  * http://forum.ubuntu-fr.org/viewtopic.php?id=325778
 +
 +<code sh>
 +#! /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 !"
 +
 +</code>
  
 
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