This shows you the differences between two versions of the page.
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> | ||