Autor Tópico: Firmware do conversor digital Zinwell ZBT-620A "tijolão" com função PVR  (Lida 119751 vezes)

0 Membros e 1 Visitante estão vendo este tópico.

Offline rictad

  • Hacker Honorário
  • Colaboradores
  • Papagaio
  • *
  • Mensagens: 285
  • Aprovação: +59/-0
    • Ver Perfil
Re: Firmware do conversor digital Zinwell ZBT-620A "tijolão" com função PVR
« Responder #70 Online: Março 27, 2011, 10:38:29 pm »
Parece que não é bem assim. Senão seria possível instalar o 1.7.2 por cima dos 1.13.x/1.14.x.
Eu entendo que a incompatibilidade entre eles não é questão de rootfs, senão atualizar os quatro blocos não faria o conversor voltar a funcionar (o 1.7.2_back não funcionaria).

Tem razão. Acabamos nos esquecendo de um detalhe importante, que faz a diferença entre as versões mais antigas e as mais novas. Eu falei um pouco disso lá atrás e já havia me esquecido. É a versão do squashfs.

As versões mais antigas do Zinwell (1.5.5 e 1.7.2) usam um squashfs estranho, lembra? Já as versões mais recentes, usam o squashfs 3.1 + lzma. Portanto, o Kernel da versão mais nova, apesar de ser o mesmo (versão 2.6.12-4.2-brcmstb), foi compilado com suporte ao squashfs + lzma. Além disso, o sistema de arquivos passou a vir no novo formato, apesar de ter o mesmo conteúdo. Se voltarmos para a versão 1.7.2 apenas com o bloco code, o Kernel recompilado não conseguirá montá-lo. Se, em seguida, gravarmos o Kernel da versão 1.7.2 (com o squashfs antigo e sem lzma), o bloco code será montado, mas o bloco do sistema de arquivos (avail) é que não será montado, pois está no novo squashfs. Então precisa dos 3 blocos, por uma questão de compatibilidade ao squashfs usado. O bloco load não é necessário, pois o CFE continua fazendo o trabalho dele. Até por segurança, nem deveria ser atualizado. Já o bloco rootfs das versões novas acaba sendo aceito pela versão 1.7.2 e reformatado.

Mas no caso do teste pelo Semp, esses blocos não são necessários, pois o binário estará no pen drive e não em uma imagem squashfs. Para ele rodar, basta o bloco rootfs correto.

Offline rafael_netto

  • Novato
  • *
  • Mensagens: 19
  • Aprovação: +4/-0
    • Ver Perfil
Re: Firmware do conversor digital Zinwell ZBT-620A "tijolão" com função PVR
« Responder #71 Online: Março 28, 2011, 02:41:59 am »
Fiz o teste de substituir o flash0.rootfs e rodar o zmw_base_zinwell a partir do pendrive e obtive um resultado, digamos "estranho".

Na primeira tentativa funcionou. A interface iniciou, consegui operá-la normalmente com o controle do Semp, vi o canal 10 de Brasília e troquei o vídeo para NTSC. Porém eu não havia gravado o log e não registrei o que acontecia durante o boot, em especial para ver as mensagens de detecção de tuner. Só reparei que, durante o uso normal do programa, no terminal aparecia uma mensagem insistente relativa a USB.

Rodei o Putty novamente, desta vez com log, sem reiniciar o conversor (apenas havia interrompido a interface com Ctrl-\ e rodado novamente). Desta vez a interface não iniciou e ficou cuspindo muitas mensagens relacionadas a comunicação i2c (que é usada para o tuner), se não me engano dizendo que os comandos não tinham sido aceitos ou que as respostas não eram entendidas. Eu bobamente não guardei o log disso.

Com medo de que tivesse danificado algo no STB reiniciei normalmente e fiquei aliviado ao ver a interface padrão do Semp iniciar no modo de fábrica, como era esperado.

Então mais uma vez copiei o flash0.rootfs e tentei rodar no pendrive. Daí por diante não funcionou mais. O programa é interrompido logo no início com estas mensagens:
Código: [Selecionar]
broadcom create task 10 b_event
broadcom create task 30 b_idle
boot time till here (boot bsp start) 3133
Before zw_init_i2c_hw
Before zw_init_common_interface
BCHP_EBI_CS_BASE_0 0x1e00000c
BCHP_EBI_CS_CONFIG_0 0x02000411
BCHP_EBI_CS_BASE_1 0x1c00000c
BCHP_EBI_CS_CONFIG_1 0x07000410
BCHP_EBI_CS_BASE_2 0x00000000
BCHP_EBI_CS_CONFIG_2 0x07000000
BCHP_EBI_CS_BASE_3 0x00000000
BCHP_EBI_CS_CONFIG_3 0x07000000
boot time till here (boot bsp end) 3156
boot time till here (bsettop init) 3173
O prompt do Busybox então retorna.

Felizmente, ao reiniciar com a interface padrão do Semp tudo volta pro lugar.

Uma coisa que eu reparei (já tinha reparado antes) é que quando se interrompe a execução da interface que foi chamada a partir da linha de comando (isto é, não inicou na hora do boot) o prompt fica extremamente lento, os caracteres demoram muito a aparecer. E quando se roda o programa, sempre dá algum erro. Eu já tinha tentado isso anteriormente, ao tentar rodar o zmw_base_zinwell original depois de tê-lo interrompido.

Agora parece que o que aconteceu foi que na primeira vez, tudo funcionou, mas na segunda, algo foi corrompido que impediu as execuções posteriores.

Cheguei a pensar que algo fosse escrito no filesystem, mas lembrei que ele é protegido contra gravação. A única explicação é que algum lugar, fora do rootfs, foi corrompido, e seja o que for, não afeta o software padrão do Semp (felizmente). Poderia ser nos blocos nvram ou skip, que ainda não mexemos?
« Última modificação: Março 28, 2011, 02:48:49 am por rafael_netto »

FORUM.RYAN.COM.BR

Re: Firmware do conversor digital Zinwell ZBT-620A "tijolão" com função PVR
« Responder #71 Online: Março 28, 2011, 02:41:59 am »

Offline rictad

  • Hacker Honorário
  • Colaboradores
  • Papagaio
  • *
  • Mensagens: 285
  • Aprovação: +59/-0
    • Ver Perfil
Re: Firmware do conversor digital Zinwell ZBT-620A "tijolão" com função PVR
« Responder #72 Online: Março 28, 2011, 03:55:50 am »
Na primeira tentativa funcionou. A interface iniciou, consegui operá-la normalmente com o controle do Semp, vi o canal 10 de Brasília e troquei o vídeo para NTSC. Porém eu não havia gravado o log e não registrei o que acontecia durante o boot, em especial para ver as mensagens de detecção de tuner. Só reparei que, durante o uso normal do programa, no terminal aparecia uma mensagem insistente relativa a USB.

Normal a mensagem. Isso ocorre porque você iniciou o programa pelo USB, que já está montado. Como as novas versões do Zinwell tentam montar automaticamente o pen drive, o mount falha (pois o dispositivo está ocupado), mostrando a mensagem mount 00000. Ele continua tentando e a mensagem fica sendo mostrada insistentemente.

Como você alterou o video, então o controle do Semp funcionou.  :)

Rodei o Putty novamente, desta vez com log, sem reiniciar o conversor (apenas havia interrompido a interface com Ctrl-\ e rodado novamente). Desta vez a interface não iniciou e ficou cuspindo muitas mensagens relacionadas a comunicação i2c (que é usada para o tuner), se não me engano dizendo que os comandos não tinham sido aceitos ou que as respostas não eram entendidas. Eu bobamente não guardei o log disso.

Com medo de que tivesse danificado algo no STB reiniciei normalmente e fiquei aliviado ao ver a interface padrão do Semp iniciar no modo de fábrica, como era esperado.

Isso é seguro. Você pode repetir várias vezes que nunca vai acontecer nada com o Semp. Mas precisa reiniciar  STB para tudo voltar ao normal.

Então mais uma vez copiei o flash0.rootfs e tentei rodar no pendrive. Daí por diante não funcionou mais. O programa é interrompido logo no início com estas mensagens:
Código: [Selecionar]
broadcom create task 10 b_event
broadcom create task 30 b_idle
boot time till here (boot bsp start) 3133
Before zw_init_i2c_hw
Before zw_init_common_interface
BCHP_EBI_CS_BASE_0 0x1e00000c
BCHP_EBI_CS_CONFIG_0 0x02000411
BCHP_EBI_CS_BASE_1 0x1c00000c
BCHP_EBI_CS_CONFIG_1 0x07000410
BCHP_EBI_CS_BASE_2 0x00000000
BCHP_EBI_CS_CONFIG_2 0x07000000
BCHP_EBI_CS_BASE_3 0x00000000
BCHP_EBI_CS_CONFIG_3 0x07000000
boot time till here (boot bsp end) 3156
boot time till here (bsettop init) 3173
O prompt do Busybox então retorna.

(...)
Cheguei a pensar que algo fosse escrito no filesystem, mas lembrei que ele é protegido contra gravação. A única explicação é que algum lugar, fora do rootfs, foi corrompido, e seja o que for, não afeta o software padrão do Semp (felizmente). Poderia ser nos blocos nvram ou skip, que ainda não mexemos?

Isso é estranho. Talvez após copiar novamente o rootfs, o binário do Semp chegou a fazer algumas alterações antes de ser interrompido com CTRL-\. Aconteceu comigo algumas vezes. É muito rápido. Não acho que pode ser outro bloco, porque fiz os mesmos testes aqui com seu firmware inteiro.

Uma coisa que eu reparei (já tinha reparado antes) é que quando se interrompe a execução da interface que foi chamada a partir da linha de comando (isto é, não inicou na hora do boot) o prompt fica extremamente lento, os caracteres demoram muito a aparecer. E quando se roda o programa, sempre dá algum erro. Eu já tinha tentado isso anteriormente, ao tentar rodar o zmw_base_zinwell original depois de tê-lo interrompido.

Não sei se vai funcionar com essa versão do Busybox (nunca testei), mas na nova versão que compilei é só usar o comando (no terminal lento):

setsid cttyhack sh

ou

setsid cttyhack ash

Se funcionar, você poderá, inclusive, chamar o zmw_base_zinwell com "&" no final

./zmw_base_zinwell &

para enviá-lo para segundo plano, mantendo o terminal disponível, rápido e com controle enquanto o programa roda.
Se não funcionar, tente digitar somente o comando "ash" para ver se ele consegue iniciar outro shell com controle.
Isso está relacionado com job control.

Offline rictad

  • Hacker Honorário
  • Colaboradores
  • Papagaio
  • *
  • Mensagens: 285
  • Aprovação: +59/-0
    • Ver Perfil
Re: Firmware do conversor digital Zinwell ZBT-620A "tijolão" com função PVR
« Responder #73 Online: Abril 01, 2011, 04:50:27 am »
Nova versão 1.7.2_back2.

Montei uma nova versão 1.7.2 de volta para quem atualizou com os firmwares 1.13.x e 1.14.x. Continua com 4 blocos, mas é menor que a anterior, pois aquela usava o dump inteiro dos blocos que copiei da flash. Agora eu os reduzi para o seu tamanho útil. A exceção é o bloco LOAD, que deixei inteiro (não quis mexer, por questão de segurança). Além disso, fiz uma variação especial para o ZBT-633/620C slim, para aqueles que, por algum motivo, precisarem voltar a versão. Fiz vários testes e as duas funcionam perfeitamente. Essas versões não são intercambiáveis entre os aparelhos, por causa do controle remoto (elas são originais). E devem ser instaladas contra as versões 1.13.x ou 1.14.x, tanto as oficiais como as modificadas que estão aqui neste tópico. Após serem instaladas, você ainda poderá reatualizar para as versões 1.13.x ou 1.14.x.

ATENÇÃO:

A versão ZBT-620A_1.7.2_back2 só pode ser instalada no Zinwell ZBT-620A "tijolão" e só deve ser instalada se tiver algum motivo para voltar para a versão antiga oficial. Se você instalá-la no slim, vai precisar achar o controle do "tijolão" para operá-lo e atualizá-lo corretamente ou enviá-lo para a assistência técnica.

A versão ZBT-633_1.7.2_back2 só pode ser instalada no Zinwell ZBT-633/620C slim e só deve ser instalada se tiver algum motivo para voltar para a versão antiga oficial. Se você instalá-la no "tijolão", vai precisar achar o controle do slim para operá-lo e atualizá-lo corretamente ou enviá-lo para a assistência técnica.

Serão gravados 4 blocos na flash. Portanto, você deve esperar a barra de atualização encher 4 vezes. Após isso, o STB será reiniciado 2 vezes, a primeira é para ressetar as configurações.

Offline rictad

  • Hacker Honorário
  • Colaboradores
  • Papagaio
  • *
  • Mensagens: 285
  • Aprovação: +59/-0
    • Ver Perfil
Re: Firmware do conversor digital Zinwell ZBT-620A "tijolão" com função PVR
« Responder #74 Online: Abril 01, 2011, 05:40:48 am »
Eu fiz um teste agora a pouco com o novo firmware 1.15.4 do Zinwell ZBT-601 no tijolão. Claro, tive que abrir o firmware no zimview e alterar o customer number de 6 para 262 para que o tijolão aceitasse o firmware. Com o zimview também podemos ver que, dos 4 blocos, o único diferente (checksum) é o bloco code. Como esperado, após a atualização só pude operar o aparelho com o controle do ZBT-633 (que deve ser igual ao do ZBT-601). O engraçado é que a saída vídeo componente funcionou normalmente (o ZBT-601 não tem vídeo componente). Ambas as saídas de áudio stereo (o 601 só tem uma) também funcionaram. Não pude testar as saídas SPDIF (óptica e coaxial), pois não tenho equipamento compatível, mas acho que estão funcionando, apesar de o 601 não as possuir. Meu palpite é que se alguém instalar esse firmware no ZBT-633, tudo vai funcionar normalmente, com exceção do painel frontal. Ao final, para voltar à versão 1.14.4a beta do tijolão, tive que alterar o customer number do arquivo de 262 para 6, para que o firmware temporário do 601 permitisse a atualização

Olhando o arquivo zmw_base_zinwell no IDA, é visível a diferença nas rotinas de inicialização do painel frontal (o ZBT-601 não possui display). Assim como o ZBT-620A, ele também chama a rotina que nomeei "pré-executa 8051 fp init", mas que agora vou renomear para "pre-executa fp init". Essa rotina chama a principal, que eu denominei "executa frontpanel init", já que é essa a string relacionada durante a inicialização.

A ideia é usar apenas a última versão do ZBT-601 para integrar todas as modificações feitas até agora (e talvez as futuras) e disponibilizar 3 versões intercambiáveis entre os 3 aparelhos. Mas para isso vou ter que descobrir se o SPDIF realmente continua funcionando nos ZBT-620/633 após a atualização com o firmware do 601.
« Última modificação: Abril 01, 2011, 05:49:37 am por rictad »

Offline zeurt

  • Seeder
  • Colaboradores
  • Papagaio
  • *
  • Mensagens: 333
  • Aprovação: +47/-0
    • Ver Perfil
Re: Firmware do conversor digital Zinwell ZBT-620A "tijolão" com função PVR
« Responder #75 Online: Abril 03, 2011, 12:23:26 am »
A ideia é usar apenas a última versão do ZBT-601 para integrar todas as modificações feitas até agora (e talvez as futuras) e disponibilizar 3 versões intercambiáveis entre os 3 aparelhos. Mas para isso vou ter que descobrir se o SPDIF realmente continua funcionando nos ZBT-620/633 após a atualização com o firmware do 601.
Legal saber dessa compatibilidade. Faz algum tempo que eu estou pra te perguntar sobre isso... Na verdade eu estou precisando comprar um conversor pra minha mãe, e então pensei no ZBT-601, que está com um preço ótimo. Só faltava a confirmação que você deu agora sobre a compatibilidade com o ZBT-633, pois assim, além de comprar um conversor com ótimo custo-benefício, ainda poderei brincar um pouco com o desenvolvimento do firmware (tentar ajudar nem que seja um pouquinho  :)).

Outra coisa: eu abri recentemente um binário zmw_base_zinwell que você enviou, no IDA 5.5.0, e fiquei POSITIVAMENTE impressionado com a quantidade de "comentários" espalhados por todo o código. Esses "comentários" que na verdade são as mensagens enviadas para o console são realmente muito bem-vindos. Com eles, a gente não fica desesperadamente perdido no meio de tudo (é bem diferente dos firmwares Mediatek, em que não existia nada disso).
Como você ressaltou algumas vezes já neste tópico, os comentários servem pra nos mostrar que estamos no lugar certo... É claro que precisa decifrar as instruções da redondeza do comentário que interessa para se chegar a rotina definitiva que executa determinada função. De qualquer modo, me pareceu que ajuda bastante, já que cada comentário serve como uma pista, um ponto de partida, ou uma idéia para uma nova modificação...
Um exemplo: próximo de onde você colocou os NOPs pra acabar com o limite de 32G existe a string "# "Disk total size must be over 32G!!".
Código: [Selecionar]
.text:004787E4                          # ---------------------------------------------------------------------------
.text:004787E4
.text:004787E4                         loc_4787E4:                              # CODE XREF: sub_4786EC+40j
.text:004787E4 9C 8C 99 8F                             la      $t9, sub_4B2A98
.text:004787E8 09 F8 20 03                             jalr    $t9 ; sub_4B2A98
.text:004787EC 00 00 00 00                             nop
.text:004787F0 00 00 00 00                             nop
.text:004787F4 10 00 BC 8F                             lw      $gp, 0x20+var_10($sp)
.text:004787F8 D4 A0 99 8F                             la      $t9, sub_459DF0
.text:004787FC 09 F8 20 03                             jalr    $t9 ; sub_459DF0
.text:00478800 00 00 00 00                             nop
.text:00478804 06 00 40 14                             bnez    $v0, loc_478820
.text:00478808 10 00 BC 8F                             lw      $gp, 0x20+var_10($sp)
.text:0047880C F0 82 99 8F                             la      $t9, sub_45B064
.text:00478810 09 F8 20 03                             jalr    $t9 ; sub_45B064
.text:00478814 00 00 00 00                             nop
.text:00478818 1D 00 40 10                             beqz    $v0, loc_478890
.text:0047881C 10 00 BC 8F                             lw      $gp, 0x20+var_10($sp)
.text:00478820
.text:00478820                         loc_478820:                              # CODE XREF: sub_4786EC+118j
.text:00478820                                                                  # sub_4786EC+1B0j
.text:00478820 24 80 84 8F                             la      $a0, dword_680000
.text:00478824 30 8A 99 8F                             la      $t9, sub_666260
.text:00478828 09 F8 20 03                             jalr    $t9 ; sub_666260
.text:0047882C B8 59 84 24                             addiu   $a0, (aWeHavePopWindo - 0x680000)  # "We have POP window, so we can't let use"...
.text:00478830 10 00 BC 8F                             lw      $gp, 0x20+var_10($sp)
.text:00478834 D8 FF 00 10                             b       loc_478798
.text:00478838 01 00 03 24                             li      $v1, 1
.text:0047883C                          # ---------------------------------------------------------------------------
.text:0047883C 34 9C 99 8F                             la      $t9, sub_45EBE0
.text:00478840 09 F8 20 03                             jalr    $t9 ; sub_45EBE0
.text:00478844 96 01 04 24                             li      $a0, 0x196
.text:00478848 10 00 BC 8F                             lw      $gp, 0x20+var_10($sp)
.text:0047884C 45 01 04 24                             li      $a0, 0x145
.text:00478850 34 9C 99 8F                             la      $t9, sub_45EBE0
.text:00478854 09 F8 20 03                             jalr    $t9 ; sub_45EBE0
.text:00478858 21 80 40 00                             move    $s0, $v0
.text:0047885C 10 00 BC 8F                             lw      $gp, 0x20+var_10($sp)
.text:00478860 21 20 00 02                             move    $a0, $s0
.text:00478864 21 28 40 00                             move    $a1, $v0
.text:00478868 AC CA 99 8F                             la      $t9, sub_459140
.text:0047886C 09 F8 20 03                             jalr    $t9 ; sub_459140
.text:00478870 C1 00 06 24                             li      $a2, 0xC1
.text:00478874 10 00 BC 8F                             lw      $gp, 0x20+var_10($sp)
.text:00478878 24 80 84 8F                             la      $a0, dword_680000
.text:0047887C A0 88 99 8F                             la      $t9, sub_6660D0
.text:00478880 09 F8 20 03                             jalr    $t9 ; sub_6660D0
.text:00478884 F8 59 84 24                             addiu   $a0, (aDiskTotalSizeM - 0x680000)  # "Disk total size must be over 32G!!"
.text:00478888 B9 FF 00 10                             b       loc_478770
.text:0047888C 10 00 BC 8F                             lw      $gp, 0x20+var_10($sp)

Última coisa: encontrei um belíssimo tutorial sobre MIPS Assembly, criado por um professor da Central Connecticut State University chamado Bradley Kjell. Aqui está o link: http://programmedlessons.org/AssemblyTutorial/
Na verdade é um curso programado para ser ministrado em 1 semestre na citada universidade. Pelo que pude perceber, a intenção foi criar um curso introdutório sobre Assembly, sendo que o processador escolhido foi o MIPS. Curiosidade: vejam o que os alunos desse professor tem a dizer sobre ele.  :laugh: Link: http://www.ratemyprofessors.com/ShowRatings.jsp?tid=385487
Ele recomenda que se use o simulador de MIPS chamado SPIM, para que se possa acompanhar os programas exemplos ao longo do tutorial. Testei o SPIM e é super simples de entender, e muito legal. Link do SPIM: http://pages.cs.wisc.edu/~larus/spim.html
Eu tambei testei recentemente o MIPS Assembler MARS da Missouri State University, que eu havia recomendado alguns posts atrás: http://courses.missouristate.edu/KenVollmar/MARS/
Achei muito interessante esse Assembler, que também é um simulador, e muito completo por sinal. Inclusive os programas do tutorial que recomendei acima podem ser executados no simulador do MARS (assim como no próprio SPIM, que é mais simples, e recomendado pelo autor).
Só pra finalizar, achei o Assembler MARS muito bom:
a-) Tem o Syntax Highlighting, identificando instruções, labels, comentários, etc., cada um com uma cor.
b-) Tem aquela bem-vinda função de auto-preenchimento, ou seja, você começa a digitar um instrução, e o programa já oferece as várias opções para aquela(s) letra(s) incial(ais), inclusive dando uma rápida descrição de cada uma dessas instruções possíveis.
c-) Para salvar o binário (após o código-fonte ter sido montado), é só ir em Dump Memory, e escolher Binário: me parece que salva em Little Endian; é engraçado pois no próprio programa os 4 bytes das instruções aparecem da esquerda para direita, mas quando se faz o Dump Memory, o binário é salvo em Little Endian, da direita para esquerda (cada 4 bytes).
d-) É gratuito!  :clapping: Parece que o MIPS oferece mais e melhores opções gratuitas que o ARM em termos de aprendizado e ferramentas...
« Última modificação: Abril 03, 2011, 05:32:34 pm por zeurt »

Offline rafael_netto

  • Novato
  • *
  • Mensagens: 19
  • Aprovação: +4/-0
    • Ver Perfil
Re: Firmware do conversor digital Zinwell ZBT-620A "tijolão" com função PVR
« Responder #76 Online: Abril 03, 2011, 04:03:13 pm »
Na primeira tentativa funcionou. A interface iniciou, consegui operá-la normalmente com o controle do Semp, vi o canal 10 de Brasília e troquei o vídeo para NTSC.
(...)

Rodei o Putty novamente, desta vez com log, sem reiniciar o conversor (apenas havia interrompido a interface com Ctrl-\ e rodado novamente). Desta vez a interface não iniciou e ficou cuspindo muitas mensagens relacionadas a comunicação i2c (que é usada para o tuner), se não me engano dizendo que os comandos não tinham sido aceitos ou que as respostas não eram entendidas.
(...)

Com medo de que tivesse danificado algo no STB reiniciei normalmente e fiquei aliviado ao ver a interface padrão do Semp iniciar no modo de fábrica, como era esperado.

Então mais uma vez copiei o flash0.rootfs e tentei rodar no pendrive. Daí por diante não funcionou mais. O programa é interrompido logo no início com estas mensagens: (...)

Cheguei a pensar que algo fosse escrito no filesystem, mas lembrei que ele é protegido contra gravação. A única explicação é que algum lugar, fora do rootfs, foi corrompido, e seja o que for, não afeta o software padrão do Semp (felizmente). Poderia ser nos blocos nvram ou skip, que ainda não mexemos?

Isso é estranho. Talvez após copiar novamente o rootfs, o binário do Semp chegou a fazer algumas alterações antes de ser interrompido com CTRL-\. Aconteceu comigo algumas vezes. É muito rápido. Não acho que pode ser outro bloco, porque fiz os mesmos testes aqui com seu firmware inteiro.

Refiz o teste de novo. Desta vez eu tenho certeza que interrompi o Busybox antes de mais nada (já iniciei o aparelho com o Ctrl-\ apertado...) e nada adiantou. O executável modificado simplesmente se recusa a rodar.

Um teste que eu ainda pretendo fazer é atualizar de novo o Semp com um firmware original (na verdade fazer o downgrade pra 1.0.14c) na esperança que o processo de atualização faça algum tipo de limpeza. Mas não sei se terei tempo pra isso pois vou viajar esta semana.

Offline rictad

  • Hacker Honorário
  • Colaboradores
  • Papagaio
  • *
  • Mensagens: 285
  • Aprovação: +59/-0
    • Ver Perfil
Re: Firmware do conversor digital Zinwell ZBT-620A "tijolão" com função PVR
« Responder #77 Online: Abril 04, 2011, 02:50:52 am »
Legal saber dessa compatibilidade. Faz algum tempo que eu estou pra te perguntar sobre isso... Na verdade eu estou precisando comprar um conversor pra minha mãe, e então pensei no ZBT-601, que está com um preço ótimo. Só faltava a confirmação que você deu agora sobre a compatibilidade com o ZBT-633, pois assim, além de comprar um conversor com ótimo custo-benefício, ainda poderei brincar um pouco com o desenvolvimento do firmware (tentar ajudar nem que seja um pouquinho  :)).
Opa! Acho que teremos um gás extra no desenvolvimento.

Outra coisa: eu abri recentemente um binário zmw_base_zinwell que você enviou, no IDA 5.5.0, e fiquei POSITIVAMENTE impressionado com a quantidade de "comentários" espalhados por todo o código. Esses "comentários" que na verdade são as mensagens enviadas para o console são realmente muito bem-vindos. Com eles, a gente não fica desesperadamente perdido no meio de tudo (é bem diferente dos firmwares Mediatek, em que não existia nada disso).
Como você ressaltou algumas vezes já neste tópico, os comentários servem pra nos mostrar que estamos no lugar certo... É claro que precisa decifrar as instruções da redondeza do comentário que interessa para se chegar a rotina definitiva que executa determinada função. De qualquer modo, me pareceu que ajuda bastante, já que cada comentário serve como uma pista, um ponto de partida, ou uma idéia para uma nova modificação...
Um exemplo: próximo de onde você colocou os NOPs pra acabar com o limite de 32G existe a string "# "Disk total size must be over 32G!!".

Esses comentários ajudam bastante mesmo. Mas alguns poucos podem ser fakes. Normalmente você verá um sempre repetido no início de várias rotinas, apontando alguma string ASCII ou mesmo Unicode que não faz sentido. Geralmente é um dos ponteiros de string (#680000 ou #690000) que o IDA acaba considerando ele próprio uma referência a string. Esses ponteiros são atualizados com offsets para indicar as verdadeiras referências as strings utilizadas na rotina. Normalmente são carregados em $a1 ou $a0 e atualizados com operações ADD. Também algumas poucas strings acabam sendo esquecidas devido à estrutura mais trabalhada do código. Por exemplo, em todos os zmw_base_zinwell que analisei mais cuidadosamente, ao buscar "mke2fs", que é o comando para criar partições ext2/ext3, só achei o ponto em que a string está, mas não achei nenhum comentário referente àquela string. Eu acabei encontrando a referência a ela seguindo a rotina que faz referências a outras strings relacionadas com a formatação, como "fmtHDisk" e "create partition done!". Sabendo o valor absoluto do endereço da string "mke2fs", eu segui as atualizações nos valores do registrador a1 e marquei os pontos. Segue a rotina que formata (uma de duas). Além desse comentário que deixou de ser registrado, podemos ver o comentário fake, que no caso do zmw_base_zinwell da versão 1.14.7 é "x: width=%u, height=%u, components=%d", que na verdade é um dos ponteiros de string, o endereço #690000 (essa string que ele aponta é, portanto, o offset 0 para #690000). O comentário com o comando "mke2fs" foi inserido de forma natural mesmo. Mas é possível forçar o IDA a reconhecer aquele ponto como referência a um endereço relativo, que será nomeado pelo início da string. É só usar CTRL-R e colocar no endereço base o valor #690000 que ele vai atualizar com o offset -#2818.

Código: [Selecionar]
text:004D80FC                         sub_4D80FC:                              # DATA XREF: sub_48C15C+11B8_o
.text:004D80FC                                                                  # .got:00BB8ABC_o
.text:004D80FC
.text:004D80FC                         var_29D4        = -0x29D4
.text:004D80FC                         var_238         = -0x238
.text:004D80FC                         var_234         = -0x234
.text:004D80FC                         var_230         = -0x230
.text:004D80FC                         var_220         = -0x220
.text:004D80FC                         var_28          = -0x28
.text:004D80FC                         var_24          = -0x24
.text:004D80FC                         var_20          = -0x20
.text:004D80FC                         var_1C          = -0x1C
.text:004D80FC                         var_18          = -0x18
.text:004D80FC                         var_14          = -0x14
.text:004D80FC                         var_10          = -0x10
.text:004D80FC                         var_C           = -0xC
.text:004D80FC                         var_8           = -8
.text:004D80FC                         var_4           = -4
.text:004D80FC
.text:004D80FC 6E 00 1C 3C 14 7E 9C 27                 la      $gp, unk_6E7E14
.text:004D8104 21 E0 99 03                             addu    $gp, $t9
.text:004D8108 B8 FD BD 27                             addiu   $sp, -0x248
.text:004D810C 44 02 BF AF                             sw      $ra, 0x248+var_4($sp)
.text:004D8110 40 02 BE AF                             sw      $fp, 0x248+var_8($sp)
.text:004D8114 3C 02 B7 AF                             sw      $s7, 0x248+var_C($sp)
.text:004D8118 38 02 B6 AF                             sw      $s6, 0x248+var_10($sp)
.text:004D811C 34 02 B5 AF                             sw      $s5, 0x248+var_14($sp)
.text:004D8120 30 02 B4 AF                             sw      $s4, 0x248+var_18($sp)
.text:004D8124 2C 02 B3 AF                             sw      $s3, 0x248+var_1C($sp)
.text:004D8128 28 02 B2 AF                             sw      $s2, 0x248+var_20($sp)
.text:004D812C 24 02 B1 AF                             sw      $s1, 0x248+var_24($sp)
.text:004D8130 20 02 B0 AF                             sw      $s0, 0x248+var_28($sp)
.text:004D8134 18 00 BC AF                             sw      $gp, 0x248+var_230($sp)
.text:004D8138 34 80 84 8F                             la      $a0, aXWidthUHeightU  # "x: width=%u, height=%u, components=%d"
.text:004D813C A0 88 99 8F                             la      $t9, sub_6662E0
.text:004D8140 24 80 94 8F                             la      $s4, dword_680000
.text:004D8144 09 F8 20 03                             jalr    $t9 ; sub_6662E0
.text:004D8148 68 D7 84 24                             addiu   $a0, (aEnterZw_pvrfil - 0x690000)  # "Enter zw_pvrfile_fmtHDisk function "
.text:004D814C 18 00 BC 8F                             lw      $gp, 0x248+var_230($sp)
.text:004D8150 70 5B 84 26                             addiu   $a0, $s4, (aDevSda - 0x680000)  # "/dev/sda"
.text:004D8154 54 AA 99 8F                             la      $t9, sub_4D7120
.text:004D8158 09 F8 20 03                             jalr    $t9 ; sub_4D7120
.text:004D815C 21 90 00 00                             move    $s2, $0
.text:004D8160 21 88 40 00                             move    $s1, $v0
.text:004D8164 01 00 02 24                             li      $v0, 1
.text:004D8168 29 00 22 12                             beq     $s1, $v0, loc_4D8210
.text:004D816C 18 00 BC 8F                             lw      $gp, 0x248+var_230($sp)
.text:004D8170 34 80 84 8F                             la      $a0, aXWidthUHeightU  # "x: width=%u, height=%u, components=%d"
.text:004D8174 A0 88 99 8F                             la      $t9, sub_6662E0
.text:004D8178 09 F8 20 03                             jalr    $t9 ; sub_6662E0
.text:004D817C 8C D7 84 24                             addiu   $a0, (aErrorHardDiskD - 0x690000)  # "Error: Hard disk does not exist! "
.text:004D8180 18 00 BC 8F                             lw      $gp, 0x248+var_230($sp)
.text:004D8184 38 9C 99 8F                             la      $t9, sub_45EC40
.text:004D8188 09 F8 20 03                             jalr    $t9 ; sub_45EC40
.text:004D818C 96 01 04 24                             li      $a0, 0x196
.text:004D8190 18 00 BC 8F                             lw      $gp, 0x248+var_230($sp)
.text:004D8194 4E 01 04 24                             li      $a0, 0x14E
.text:004D8198 38 9C 99 8F                             la      $t9, sub_45EC40
.text:004D819C 09 F8 20 03                             jalr    $t9 ; sub_45EC40
.text:004D81A0 21 80 40 00                             move    $s0, $v0
.text:004D81A4 18 00 BC 8F                             lw      $gp, 0x248+var_230($sp)
.text:004D81A8 10 00 A0 AF                             sw      $0, 0x248+var_238($sp)
.text:004D81AC 21 28 00 02                             move    $a1, $s0
.text:004D81B0 F0 96 99 8F                             la      $t9, sub_4A88AC
.text:004D81B4 21 30 40 00                             move    $a2, $v0
.text:004D81B8 01 00 04 24                             li      $a0, 1
.text:004D81BC 09 F8 20 03                             jalr    $t9 ; sub_4A88AC
.text:004D81C0 D0 07 07 24                             li      $a3, 0x7D0
.text:004D81C4 18 00 BC 8F                             lw      $gp, 0x248+var_230($sp)
.text:004D81C8
.text:004D81C8                         loc_4D81C8:                              # CODE XREF: sub_4D80FC+5D8_j
.text:004D81C8                                                                  # sub_4D80FC+5FC_j
.text:004D81C8 AC 80 82 8F                             la      $v0, unk_D50000
.text:004D81CC E8 85 99 8F                             la      $t9, sub_403550
.text:004D81D0 58 8C 84 8F                             la      $a0, sub_48C15C
.text:004D81D4 09 F8 20 03                             jalr    $t9 ; sub_403550
.text:004D81D8 79 C7 40 A0                             sb      $0, (byte_D4C779 - 0xD50000)($v0)
.text:004D81DC 18 00 BC 8F                             lw      $gp, 0x248+var_230($sp)
.text:004D81E0 44 02 BF 8F                             lw      $ra, 0x248+var_4($sp)
.text:004D81E4 40 02 BE 8F                             lw      $fp, 0x248+var_8($sp)
.text:004D81E8 3C 02 B7 8F                             lw      $s7, 0x248+var_C($sp)
.text:004D81EC 38 02 B6 8F                             lw      $s6, 0x248+var_10($sp)
.text:004D81F0 34 02 B5 8F                             lw      $s5, 0x248+var_14($sp)
.text:004D81F4 30 02 B4 8F                             lw      $s4, 0x248+var_18($sp)
.text:004D81F8 2C 02 B3 8F                             lw      $s3, 0x248+var_1C($sp)
.text:004D81FC 28 02 B2 8F                             lw      $s2, 0x248+var_20($sp)
.text:004D8200 24 02 B1 8F                             lw      $s1, 0x248+var_24($sp)
.text:004D8204 20 02 B0 8F                             lw      $s0, 0x248+var_28($sp)
.text:004D8208 08 00 E0 03                             jr      $ra
.text:004D820C 48 02 BD 27                             addiu   $sp, 0x248
.text:004D8210                          # ---------------------------------------------------------------------------
.text:004D8210
.text:004D8210                         loc_4D8210:                              # CODE XREF: sub_4D80FC+6C_j
.text:004D8210 38 9C 99 8F                             la      $t9, sub_45EC40
.text:004D8214 95 01 04 24                             li      $a0, 0x195
.text:004D8218 09 F8 20 03                             jalr    $t9 ; sub_45EC40
.text:004D821C 03 00 16 24                             li      $s6, 3
.text:004D8220 18 00 BC 8F                             lw      $gp, 0x248+var_230($sp)
.text:004D8224 49 01 04 24                             li      $a0, 0x149
.text:004D8228 38 9C 99 8F                             la      $t9, sub_45EC40
.text:004D822C 09 F8 20 03                             jalr    $t9 ; sub_45EC40
.text:004D8230 21 80 40 00                             move    $s0, $v0
.text:004D8234 18 00 BC 8F                             lw      $gp, 0x248+var_230($sp)
.text:004D8238 10 00 B6 AF                             sw      $s6, 0x248+var_238($sp)
.text:004D823C 14 00 A0 AF                             sw      $0, 0x248+var_234($sp)
.text:004D8240 1C AE 99 8F                             la      $t9, sub_4A89BC
.text:004D8244 21 28 00 02                             move    $a1, $s0
.text:004D8248 21 30 40 00                             move    $a2, $v0
.text:004D824C 21 20 00 00                             move    $a0, $0
.text:004D8250 09 F8 20 03                             jalr    $t9 ; sub_4A89BC
.text:004D8254 01 00 07 24                             li      $a3, 1
.text:004D8258 FF 00 53 30                             andi    $s3, $v0, 0xFF
.text:004D825C 13 00 71 12                             beq     $s3, $s1, loc_4D82AC
.text:004D8260 18 00 BC 8F                             lw      $gp, 0x248+var_230($sp)
.text:004D8264 AC 80 82 8F                             la      $v0, unk_D50000
.text:004D8268 E8 85 99 8F                             la      $t9, sub_403550
.text:004D826C F4 A1 84 8F                             la      $a0, sub_478C84
.text:004D8270 09 F8 20 03                             jalr    $t9 ; sub_403550
.text:004D8274 79 C7 40 A0                             sb      $0, (byte_D4C779 - 0xD50000)($v0)
.text:004D8278 18 00 BC 8F                             lw      $gp, 0x248+var_230($sp)
.text:004D827C 44 02 BF 8F                             lw      $ra, 0x248+var_4($sp)
.text:004D8280 40 02 BE 8F                             lw      $fp, 0x248+var_8($sp)
.text:004D8284 3C 02 B7 8F                             lw      $s7, 0x248+var_C($sp)
.text:004D8288 38 02 B6 8F                             lw      $s6, 0x248+var_10($sp)
.text:004D828C 34 02 B5 8F                             lw      $s5, 0x248+var_14($sp)
.text:004D8290 30 02 B4 8F                             lw      $s4, 0x248+var_18($sp)
.text:004D8294 2C 02 B3 8F                             lw      $s3, 0x248+var_1C($sp)
.text:004D8298 28 02 B2 8F                             lw      $s2, 0x248+var_20($sp)
.text:004D829C 24 02 B1 8F                             lw      $s1, 0x248+var_24($sp)
.text:004D82A0 20 02 B0 8F                             lw      $s0, 0x248+var_28($sp)
.text:004D82A4 08 00 E0 03                             jr      $ra
.text:004D82A8 48 02 BD 27                             addiu   $sp, 0x248
.text:004D82AC                          # ---------------------------------------------------------------------------
.text:004D82AC
.text:004D82AC                         loc_4D82AC:                              # CODE XREF: sub_4D80FC+160_j
.text:004D82AC 00 C3 99 8F                             la      $t9, sub_45C278
.text:004D82B0 09 F8 20 03                             jalr    $t9 ; sub_45C278
.text:004D82B4 01 00 04 24                             li      $a0, 1
.text:004D82B8 18 00 BC 8F                             lw      $gp, 0x248+var_230($sp)
.text:004D82BC B4 CF 99 8F                             la      $t9, sub_45B980
.text:004D82C0 09 F8 20 03                             jalr    $t9 ; sub_45B980
.text:004D82C4 00 00 00 00                             nop
.text:004D82C8 18 00 BC 8F                             lw      $gp, 0x248+var_230($sp)
.text:004D82CC 23 01 04 3C                             lui     $a0, 0x123
.text:004D82D0 F8 86 99 8F                             la      $t9, sub_66DDC0
.text:004D82D4 09 F8 20 03                             jalr    $t9 ; sub_66DDC0
.text:004D82D8 67 45 84 34                             li      $a0, 0x1234567
.text:004D82DC 18 00 BC 8F                             lw      $gp, 0x248+var_230($sp)
.text:004D82E0 BC BE 99 8F                             la      $t9, sub_43BE84
.text:004D82E4 09 F8 20 03                             jalr    $t9 ; sub_43BE84
.text:004D82E8 88 13 04 24                             li      $a0, 0x1388
.text:004D82EC 18 00 BC 8F                             lw      $gp, 0x248+var_230($sp)
.text:004D82F0 78 CC 99 8F                             la      $t9, sub_4CE9B8
.text:004D82F4 09 F8 20 03                             jalr    $t9 ; sub_4CE9B8
.text:004D82F8 00 00 00 00                             nop
.text:004D82FC 18 00 BC 8F                             lw      $gp, 0x248+var_230($sp)
.text:004D8300 01 00 04 24                             li      $a0, 1
.text:004D8304 AC 80 82 8F                             la      $v0, unk_D50000
.text:004D8308 D0 91 99 8F                             la      $t9, sub_465F60
.text:004D830C 09 F8 20 03                             jalr    $t9 ; sub_465F60
.text:004D8310 79 C7 53 A0                             sb      $s3, (byte_D4C779 - 0xD50000)($v0)
.text:004D8314 18 00 BC 8F                             lw      $gp, 0x248+var_230($sp)
.text:004D8318 E8 87 99 8F                             la      $t9, sub_465588
.text:004D831C 09 F8 20 03                             jalr    $t9 ; sub_465588
.text:004D8320 00 00 00 00                             nop
.text:004D8324 F6 00 40 14                             bnez    $v0, loc_4D8700
.text:004D8328 18 00 BC 8F                             lw      $gp, 0x248+var_230($sp)
.text:004D832C
.text:004D832C                         loc_4D832C:                              # CODE XREF: sub_4D80FC+610_j
.text:004D832C 24 80 84 8F                             la      $a0, dword_680000
.text:004D8330 B8 A1 99 8F                             la      $t9, sub_66CA00
.text:004D8334 AC 80 95 8F                             la      $s5, unk_D50000
.text:004D8338 09 F8 20 03                             jalr    $t9 ; sub_66CA00
.text:004D833C DC F2 84 24                             addiu   $a0, (aMnt - 0x680000)  # "/mnt"
.text:004D8340 18 00 BC 8F                             lw      $gp, 0x248+var_230($sp)
.text:004D8344 34 80 84 8F                             la      $a0, aXWidthUHeightU  # "x: width=%u, height=%u, components=%d"
.text:004D8348 04 87 99 8F                             la      $t9, sub_66E590
.text:004D834C 9C 8E 90 8F                             la      $s0, dword_D4C770
.text:004D8350 09 F8 20 03                             jalr    $t9 ; sub_66E590
.text:004D8354 50 D8 84 24                             addiu   $a0, (aTDevSda1MntUsb+0xC - 0x690000)
.text:004D8358 18 00 BC 8F                             lw      $gp, 0x248+var_230($sp)
.text:004D835C 24 80 84 8F                             la      $a0, dword_680000
.text:004D8360 04 87 99 8F                             la      $t9, sub_66E590
.text:004D8364 09 F8 20 03                             jalr    $t9 ; sub_66E590
.text:004D8368 D8 31 84 24                             addiu   $a0, (aMntUsb2 - 0x680000)  # "/mnt/usb2"
.text:004D836C 18 00 BC 8F                             lw      $gp, 0x248+var_230($sp)
.text:004D8370 24 80 84 8F                             la      $a0, dword_680000
.text:004D8374 04 87 99 8F                             la      $t9, sub_66E590
.text:004D8378 09 F8 20 03                             jalr    $t9 ; sub_66E590
.text:004D837C E4 31 84 24                             addiu   $a0, (aMntUsb3 - 0x680000)  # "/mnt/usb3"
.text:004D8380 18 00 BC 8F                             lw      $gp, 0x248+var_230($sp)
.text:004D8384 24 80 84 8F                             la      $a0, dword_680000
.text:004D8388 04 87 99 8F                             la      $t9, sub_66E590
.text:004D838C 09 F8 20 03                             jalr    $t9 ; sub_66E590
.text:004D8390 F0 31 84 24                             addiu   $a0, (aMntUsb4 - 0x680000)  # "/mnt/usb4"
.text:004D8394 18 00 BC 8F                             lw      $gp, 0x248+var_230($sp)
.text:004D8398 30 00 02 24                             li      $v0, 0x30
.text:004D839C 21 30 00 00                             move    $a2, $0
.text:004D83A0 A8 80 84 8F                             la      $a0, loc_4D0000
.text:004D83A4 34 80 85 8F                             la      $a1, aXWidthUHeightU  # "x: width=%u, height=%u, components=%d"
.text:004D83A8 E0 D8 99 8F                             la      $t9, sub_43BF18
.text:004D83AC 64 00 07 24                             li      $a3, 0x64
.text:004D83B0 78 C7 B3 A2                             sb      $s3, -0x3888($s5)
.text:004D83B4 A4 77 84 24                             addiu   $a0, (sub_4D77A4 - 0x4D0000)
.text:004D83B8 B0 D7 A5 24                             addiu   $a1, (aFmthdisk - 0x690000)  # "fmtHDisk"
.text:004D83BC 10 00 A2 AF                             sw      $v0, 0x248+var_238($sp)
.text:004D83C0 09 F8 20 03                             jalr    $t9 ; sub_43BF18
.text:004D83C4 14 00 A0 AF                             sw      $0, 0x248+var_234($sp)
.text:004D83C8 18 00 BC 8F                             lw      $gp, 0x248+var_230($sp)
.text:004D83CC 7F 7C 02 24                             li      $v0, 0x7C7F
.text:004D83D0 70 5B 84 26                             addiu   $a0, $s4, 0x5B70
.text:004D83D4 A8 80 99 8F                             la      $t9, loc_4D0000
.text:004D83D8 83 00 05 24                             li      $a1, 0x83
.text:004D83DC 34 7A 39 27                             addiu   $t9, (sub_4D7A34 - 0x4D0000)
.text:004D83E0 09 F8 20 03                             jalr    $t9 ; sub_4D7A34
.text:004D83E4 00 00 02 AE                             sw      $v0, 0($s0)
.text:004D83E8 18 00 BC 8F                             lw      $gp, 0x248+var_230($sp)
.text:004D83EC 34 80 84 8F                             la      $a0, aXWidthUHeightU  # "x: width=%u, height=%u, components=%d"
.text:004D83F0 A0 88 99 8F                             la      $t9, sub_6662E0
.text:004D83F4 09 F8 20 03                             jalr    $t9 ; sub_6662E0
.text:004D83F8 BC D7 84 24                             addiu   $a0, (aCreatePartitio - 0x690000)  # "create partition done!"
.text:004D83FC 18 00 BC 8F                             lw      $gp, 0x248+var_230($sp)
.text:004D8400 00 00 03 8E                             lw      $v1, 0($s0)
.text:004D8404 DC BA 82 8F                             la      $v0, dword_D4C774
.text:004D8408 34 80 84 8F                             la      $a0, aXWidthUHeightU  # "x: width=%u, height=%u, components=%d"
.text:004D840C 30 8A 99 8F                             la      $t9, sub_666470
.text:004D8410 00 00 45 8C                             lw      $a1, (dword_D4C774 - 0xD4C774)($v0)
.text:004D8414 D4 D7 84 24                             addiu   $a0, (aPartition_numD - 0x690000)  # "partition_num=%d\n"
.text:004D8418 1B 00 A3 00                             divu    $a1, $v1
.text:004D841C 02 00 60 14                             bnez    $v1, loc_4D8428
.text:004D8420 00 00 00 00                             nop
.text:004D8424 0D 00 07 00                             break   0x1C00
.text:004D8428
.text:004D8428                         loc_4D8428:                              # CODE XREF: sub_4D80FC+320_j
.text:004D8428 12 28 00 00                             mflo    $a1
.text:004D842C 00 2E 05 00                             sll     $a1, 24
.text:004D8430 03 2E 05 00                             sra     $a1, 24
.text:004D8434 04 00 A2 28                             slti    $v0, $a1, 4
.text:004D8438 0A 28 C2 02                             movz    $a1, $s6, $v0
.text:004D843C 09 F8 20 03                             jalr    $t9
.text:004D8440 01 00 B4 24                             addiu   $s4, $a1, 1
.text:004D8444 11 00 80 1A                             blez    $s4, loc_4D848C
.text:004D8448 18 00 BC 8F                             lw      $gp, 0x248+var_230($sp)
.text:004D844C 34 80 93 8F                             la      $s3, aXWidthUHeightU  # "x: width=%u, height=%u, components=%d"
.text:004D8450 28 00 B1 27                             addiu   $s1, $sp, 0x248+var_220
.text:004D8454
.text:004D8454                         loc_4D8454:                              # CODE XREF: sub_4D80FC+388_j
.text:004D8454 F8 99 99 8F                             la      $t9, sub_666500
.text:004D8458 01 00 50 26                             addiu   $s0, $s2, 1
.text:004D845C 21 20 20 02                             move    $a0, $s1
.text:004D8460 E8 D7 65 26                             addiu   $a1, $s3, -0x2818  # comando mke2fs
.text:004D8464 09 F8 20 03                             jalr    $t9 ; sub_666500
.text:004D8468 21 30 00 02                             move    $a2, $s0
.text:004D846C 18 00 BC 8F                             lw      $gp, 0x248+var_230($sp)
.text:004D8470 21 20 20 02                             move    $a0, $s1
.text:004D8474 8C D0 99 8F                             la      $t9, sub_61A230
.text:004D8478 09 F8 20 03                             jalr    $t9 ; sub_61A230
.text:004D847C 21 90 00 02                             move    $s2, $s0
.text:004D8480 2A 18 14 02                             slt     $v1, $s0, $s4
.text:004D8484 F3 FF 60 14                             bnez    $v1, loc_4D8454
.text:004D8488 18 00 BC 8F                             lw      $gp, 0x248+var_230($sp)
.text:004D848C
.text:004D848C                         loc_4D848C:                              # CODE XREF: sub_4D80FC+348_j
.text:004D848C 78 C7 A0 A2                             sb      $0, -0x3888($s5)
.text:004D8490
.text:004D8490                         loc_4D8490:                              # CODE XREF: sub_4D80FC+3A4_j
.text:004D8490 BC BE 99 8F                             la      $t9, sub_43BE84
.text:004D8494 09 F8 20 03                             jalr    $t9 ; sub_43BE84
.text:004D8498 64 00 04 24                             li      $a0, 0x64
.text:004D849C 78 C7 A2 82                             lb      $v0, -0x3888($s5)
.text:004D84A0 FB FF 40 10                             beqz    $v0, loc_4D8490
.text:004D84A4 18 00 BC 8F                             lw      $gp, 0x248+var_230($sp)
.text:004D84A8 34 80 84 8F                             la      $a0, aXWidthUHeightU  # "x: width=%u, height=%u, components=%d"
.text:004D84AC A0 88 99 8F                             la      $t9, sub_6662E0
.text:004D84B0 01 00 12 24                             li      $s2, 1
.text:004D84B4 09 F8 20 03                             jalr    $t9 ; sub_6662E0
.text:004D84B8 28 D8 84 24                             addiu   $a0, (aDone - 0x690000)  # "done!"
.text:004D84BC 18 00 BC 8F                             lw      $gp, 0x248+var_230($sp)
.text:004D84C0 34 80 84 8F                             la      $a0, aXWidthUHeightU  # "x: width=%u, height=%u, components=%d"
.text:004D84C4 8C D0 99 8F                             la      $t9, sub_61A230
.text:004D84C8 09 F8 20 03                             jalr    $t9 ; sub_61A230
.text:004D84CC 30 D8 84 24                             addiu   $a0, (aMkdirMntUsb - 0x690000)  # "mkdir /mnt/usb"
.text:004D84D0 18 00 BC 8F                             lw      $gp, 0x248+var_230($sp)
.text:004D84D4 34 80 84 8F                             la      $a0, aXWidthUHeightU  # "x: width=%u, height=%u, components=%d"
.text:004D84D8 8C D0 99 8F                             la      $t9, sub_61A230
.text:004D84DC 09 F8 20 03                             jalr    $t9 ; sub_61A230
.text:004D84E0 40 D8 84 24                             addiu   $a0, (unk_68D840 - 0x690000)
.text:004D84E4 18 00 BC 8F                             lw      $gp, 0x248+var_230($sp)
.text:004D84E8 34 80 84 8F                             la      $a0, aXWidthUHeightU  # "x: width=%u, height=%u, components=%d"
.text:004D84EC 8C D0 99 8F                             la      $t9, sub_61A230
.text:004D84F0 09 F8 20 03                             jalr    $t9 ; sub_61A230
.text:004D84F4 58 93 84 24                             addiu   $a0, (aMkdirMntUsbVid - 0x690000)  # "mkdir /mnt/usb/video"
.text:004D84F8 18 00 BC 8F                             lw      $gp, 0x248+var_230($sp)
.text:004D84FC 34 80 84 8F                             la      $a0, aXWidthUHeightU  # "x: width=%u, height=%u, components=%d"
.text:004D8500 8C D0 99 8F                             la      $t9, sub_61A230
.text:004D8504 09 F8 20 03                             jalr    $t9 ; sub_61A230
.text:004D8508 C0 92 84 24                             addiu   $a0, (aMkdirMntUsbAud - 0x690000)  # "mkdir /mnt/usb/audio"
.text:004D850C 18 00 BC 8F                             lw      $gp, 0x248+var_230($sp)
.text:004D8510 34 80 84 8F                             la      $a0, aXWidthUHeightU  # "x: width=%u, height=%u, components=%d"
.text:004D8514 8C D0 99 8F                             la      $t9, sub_61A230
.text:004D8518 09 F8 20 03                             jalr    $t9 ; sub_61A230
.text:004D851C 70 93 84 24                             addiu   $a0, (aMkdirMntUsbPic - 0x690000)  # "mkdir /mnt/usb/picture"
.text:004D8520 18 00 BC 8F                             lw      $gp, 0x248+var_230($sp)
.text:004D8524 34 80 84 8F                             la      $a0, aXWidthUHeightU  # "x: width=%u, height=%u, components=%d"
.text:004D8528 8C D0 99 8F                             la      $t9, sub_61A230
.text:004D852C 09 F8 20 03                             jalr    $t9 ; sub_61A230
.text:004D8530 5C D8 84 24                             addiu   $a0, (aMkdirMntUsbRec - 0x690000)  # "mkdir /mnt/usb/recycle"
.text:004D8534 2A 18 54 02                             slt     $v1, $s2, $s4
.text:004D8538 49 00 60 10                             beqz    $v1, loc_4D8660
.text:004D853C 18 00 BC 8F                             lw      $gp, 0x248+var_230($sp)
.text:004D8540 34 80 9E 8F                             la      $fp, aXWidthUHeightU  # "x: width=%u, height=%u, components=%d"
.text:004D8544 34 80 97 8F                             la      $s7, aXWidthUHeightU  # "x: width=%u, height=%u, components=%d"
.text:004D8548 34 80 96 8F                             la      $s6, aXWidthUHeightU  # "x: width=%u, height=%u, components=%d"
.text:004D854C 34 80 95 8F                             la      $s5, aXWidthUHeightU  # "x: width=%u, height=%u, components=%d"
.text:004D8550 34 80 93 8F                             la      $s3, aXWidthUHeightU  # "x: width=%u, height=%u, components=%d"
.text:004D8554 28 00 B1 27                             addiu   $s1, $sp, 0x248+var_220
.text:004D8558
(...)
(...)
(...)
.text:004D8700 EC C8 99 8F                             la      $t9, sub_45FA38
.text:004D8704 09 F8 20 03                             jalr    $t9 ; sub_45FA38
.text:004D8708 21 20 00 00                             move    $a0, $0
.text:004D870C 07 FF 00 10                             b       loc_4D832C
.text:004D8710 18 00 BC 8F                             lw      $gp, 0x248+var_230($sp)
.text:004D8710                          # End of function sub_4D80FC
.text:004D8710

Refiz o teste de novo. Desta vez eu tenho certeza que interrompi o Busybox antes de mais nada (já iniciei o aparelho com o Ctrl-\ apertado...) e nada adiantou. O executável modificado simplesmente se recusa a rodar.

Um teste que eu ainda pretendo fazer é atualizar de novo o Semp com um firmware original (na verdade fazer o downgrade pra 1.0.14c) na esperança que o processo de atualização faça algum tipo de limpeza. Mas não sei se terei tempo pra isso pois vou viajar esta semana.

É, rafael, estou começando a desconfiar daquele bloco nvram também. O estranho é que na primeira vez funcionou. E aqui eu consegui alternar entre ambos os zmw_base_zinwell algumas vezes, desde que o bloco rootfs do Zinwell recém gravado não fosse alterado pelo do SEMP.
Bom, se você for fazer o downgrade, toma cuidado para preservar o bloco LOAD. Ele não precisa ser alterado e assim você não corre o risco de perder o CFE.

Offline rafael_netto

  • Novato
  • *
  • Mensagens: 19
  • Aprovação: +4/-0
    • Ver Perfil
Re: Firmware do conversor digital Zinwell ZBT-620A "tijolão" com função PVR
« Responder #78 Online: Abril 04, 2011, 04:07:58 am »
É, rafael, estou começando a desconfiar daquele bloco nvram também. O estranho é que na primeira vez funcionou. E aqui eu consegui alternar entre ambos os zmw_base_zinwell algumas vezes, desde que o bloco rootfs do Zinwell recém gravado não fosse alterado pelo do SEMP.
Bom, se você for fazer o downgrade, toma cuidado para preservar o bloco LOAD. Ele não precisa ser alterado e assim você não corre o risco de perder o CFE.

Resolvido o mistério!

De fato a coisa era bem mais simples do que a gente imaginava. E os demais blocos da memória não têm nada a ver com isso.

O problema é que não se pode simplesmente dar boot com o "Ctrl-\" apertado. Isso aborta a própria carga do sistema operacional e faz com que outras coisas não funcionem. Tive a certeza disso quando em algumas ocasiões o próprio /usr/sbin/usbhd-start não funcionava! (não dá erro, mas não faz nada). E isso é algo meio aleatório.

Antes disso eu já tinha desconfiado do bcmdriver.ko, que pelo que eu entendi é um módulo que "prepara" a execução da interface ou algo assim, e precisa ser chamado antes.

Enfim, com sorte e um pouco de habilidade consegui interromper a execução no ponto certo (após o bcmdriver.ko, mas antes do zmw_base_zinwell) e rodei o executável do pendrive novamente sem problema nenhum!

Para ilustrar... eu entendi que o boot termina com a execução destes dois scripts:

/etc/init.d
Código: [Selecionar]
#! /bin/sh

# Set the path
export PATH=/bin:/sbin:/usr/bin:/usr/sbin:.

# Mount /proc
echo "Mount /proc fs"
mount -t proc none /proc

# Mount /dev/pts
echo "Mount /dev/pts"
mount -t devpts none /dev/pts

# Setup up /etc/mtab link
ln -sf /proc/mounts /etc/mtab


# Start application
export AppPartition=$(sed -n -e '/app/s/^...\([0-9]\).*/\/dev\/mtdblock\1/p' /proc/mtd)
mount $AppPartition /mnt/hd -t squashfs
cd /mnt/hd
./settop zmw_base_zinwell


Ele termina montando a pasta /mnt/hd (usando o squashfs) e chamando /mnt/hd/settop, cujo parâmetro é o nome do executável da interface:
Código: [Selecionar]
#!/bin/sh
# this script sets LD_LIBRARY_PATH environment variable
# and checks consistence of the system configuration
LD_LIBRARY_PATH=.:${LD_LIBRARY_PATH}
export LD_LIBRARY_PATH
PATH=.:${PATH}
export PATH

# So dirty... if uname is not called, then the internal machine name will be incorrect, causing loading of bcmdriver.ko to
# fail. This happens on a minimum rootfs
uname
ulimit -c unlimited

# Install 97038 board, both B and C boards.

# Remove all possible drivers

/sbin/rmmod bcmdriver bcm7401

# Install the user-mode driver.
# This means that the porting interface runs in user mode.

/sbin/insmod ./bcmdriver.ko


# Start whatever application is requested
target=$1;
shift
${target} $@
ls /mnt/usb/core*.* -l
umount /mnt/usb

Este entre outras coisas chama o bcmdriver.ko e termina chamando o executável da interface passado como parâmetro. Parece que as últimas linhas deveriam ser executadas quando a interface acaba de rodar mas na prática o botão liga-desliga interrompe tudo abruptamente como já foi dito aqui.

Quanto ao procedimento de boot, eu verifiquei isto:

Código: [Selecionar]
init started:  BusyBox v1.2.1 (2007.04.18-10:43+0000) multi-call binary
Starting pid 15, console /dev/ttyS0: '/etc/init.d/rcSAlgorithmics/MIPS FPU Emulator v1.5

ABORTANDO NESTE PONTO NEM O USB FUNCIONA

 Mount /proc fs
Mount /dev/p

ABORTANDO NESTE PONTO O USB FUNCIONA, MAS NÃO A INTERFACE

Linux
rmmod: bcmdriver: No such file or directory
rmmod: bcm7401: No such file or directory
bcmdriver: no version magic, tainting kernel.

bcmdriver: module license 'Proprietary' taints kernel.

Initializing bcmdriver version $ 11 $

Bootup time start 2112

MCK - Using Interrupt Definition for 7402c0 (uname -a)

chipConfigs[19].maxNumIrq = 65

Global Interrupt Mask Low: 0xD15F7FFF, High: 0x1C0C11D3

Initialization complete...

Bootup time end 2130

A PARTIR DESTE PONTO TUDO FUNCIONA

O zmw_base_zinwell original é executado logo em seguida, portanto o ponto de parada é crítico. Mas na prática acho que acertar o ponto certo não é tão difícil quanto parece (este eu acertei de primeira).

Uma vez feito isto consegui rodar perfeitamente o executável modificado pelo Rictad seguindo as orientações, o controle do Semp funcionou perfeitamente. Não testei a fundo, mas as setas, OK e Exit com certeza funcionam. Cheguei a experimentar uma sintonia automática, só pra ver que ele corre os canais rapidamente sem achar nada (ainda não tinha confirmado pelo log que não havia tuner encontrado).

O log da inicialização do programa, até o momento em que ele inicializaria o tuner (e não encontra) é o seguinte:
Código: [Selecionar]
broadcom create task 10 b_event
broadcom create task 30 b_idle
boot time till here (boot bsp start) 30342
Before zw_init_i2c_hw
Before zw_init_common_interface
BCHP_EBI_CS_BASE_0 0x1e00000c
BCHP_EBI_CS_CONFIG_0 0x02000411
BCHP_EBI_CS_BASE_1 0x1c00000c
BCHP_EBI_CS_CONFIG_1 0x07000410
BCHP_EBI_CS_BASE_2 0x00000000
BCHP_EBI_CS_CONFIG_2 0x07000000
BCHP_EBI_CS_BASE_3 0x00000000
BCHP_EBI_CS_CONFIG_3 0x07000000
boot time till here (boot bsp end) 30366
boot time till here (bsettop boot board impl done) 30388
boot time till here (xpt done) 30881
boot time till here (video done) 31199
boot time till here (xvd done) 32071
boot time till here (audio done) 32240
boot time till here (user io done) 32241
boot time till here (hdmi done) 32243
boot time till here (pboot done) 32243
boot time till here (bsettop init) 32244
broadcom create task 32 file_io_0
broadcom create task 32 file_io_1
boot time till here (main()) 32261
create heap
boot time till here (os init done) 32276
pin mux: 4040bc = a241209
pin mux: 4040c0 = 45ö1120
DDR PLL: 106818 = 126
gpio dir: 400728 = fffffdff
gpio val: 400724 = 22400
hw ver 000
>>> Warning...Manual forced HW version to 8
 <<<boot time till here 32291
tast_create in
boot time till here (tuner init start) 32292
mux: 4040b0 = 92492d9
400708 = ffffefff
400704 = 4c0e5c5
task_create out tuner 6151
zw_uart7401_init channel A, baud = 9600
zw_uart7401_init channel B, baud = 115200
zw_uart7401_init done
boot time till here (io init done) 32295
boot time till here (av hal init done) 32423
>> zw_frontend_init -->
zw_tc90517_register
entered into zw_gfx_hal_init
config graphics 0
Read TC90517 register C5h:  0
TC90517 not found!
zw_tc90507_register
TC90507 not found!
Error: No tuner installed ...
boot time till here (tuner init done) 32454

Ficam aparecendo insistentes mensagens mount status 00000000 , como eu já havia dito antes.

Quando faz o scan automático, aparecem mensagens assim (em meio aos mount status):
Código: [Selecionar]
SCAN >>> ZW_TUNER_NOT_LOCKED
Inside ZW_SCAN_XPNDR_NOT_FOUND
Inside AUTO_SCAN_TUNE_IDLE
Inside AUTO_SCAN_END
Frank LED 0x2, set 0x0
[TUNER] Set Check Signal 0
ucFrontendHandle >= ucFrontendCtrlCount
Frank LED 0x2, set 0x0
zw_scan_startTSScan success
Inside AUTO_SCAN_TUNE
« Última modificação: Abril 04, 2011, 05:05:45 am por rafael_netto »

Offline zeurt

  • Seeder
  • Colaboradores
  • Papagaio
  • *
  • Mensagens: 333
  • Aprovação: +47/-0
    • Ver Perfil
Re: Firmware do conversor digital Zinwell ZBT-620A "tijolão" com função PVR
« Responder #79 Online: Abril 04, 2011, 10:15:31 pm »
rictad,
Um dos motivos que fizeram o pedroacerbi do HTForum querer vender seu ZBT-601 (para você, por coincidência  :laugh:) foi a questão do limite de 6h de gravação, que ainda está confuso para mim: esse limite existe tanto para ext3 como para FAT32? Esse limite existe tanto para gravações manuais como agendadas?
De qualquer modo achei a seguinte string no zmw_base_zinwell:
Citar
.rodata:0068B058 70 76 72 3A 20 73 74 72+aPvrStreamHasRe:.ascii "pvr: stream has recode 6hrs"<0>
Não existe referência direta à essa string no código (como no caso da string "mke2fs" que você comentou). Portanto para chegar até a referência teria que fazer o mesmo método que você fez para "mke2fs": sabendo o endereço absoluto da string do "limite de 6hrs", procurando nas rotinas relacionadas ao PVR, tentar encontrar a chamada para determinado offset à partir de algum ponteiro, não é?

Outra coisa:
Andei bisbilhotando no zmw_base_zinwell (enviado pelo rictad alguns posts atrás), e encontrei os locais onde estão as strings de todas as mensagens exibidas na tela: fica entre B48426 e B61E9E. Cada String aparece 7 vezes:
1,2,3,4,6: em Inglês
5: em Espanhol
7: em Português
O legal é que esses dados não estão comprimidos. Portanto, imagino que podemos mudá-las à vontade. Bem, acho que não tão à vontade assim, pois temos que respeitar o limite de caracteres que já está lá para cada string: trocar por uma menor pode; já trocar por uma maior ficaria mais complicado... Nos firmwares Mediatek, tinhamos à disposição aqueles programinhas pra mudarmos tudo, inclusive alterando o tamanho das strings se necessário... http://personal.inet.fi/cool/mediatek/programs/mtklangeditor.html
O objetivo disso tudo seria melhorar a tradução das mensagens na tela. Exemplos do que eu vi que poderia ser melhorado (deve haver muito mais...):
"Subtitulo": o ideal seria "Legenda"
"4:3 caixa de letra": o ideal seria deixar "4:3 Letter Box" mesmo
"16:9 tela Wide": o ideal seria deixar "16:9 Wide Screen" mesmo
"HD Tela": O ideal seria "Proporção de Tela HD"
"SD Tela": o ideal seria "Proporção de Tela SD"
"Pillar Box": nesse caso eles não traduziram, e fizeram bem... pois nem imagino uma tradução pra isso  :laugh:
Além dos erros de tradução, ainda podemos ver minúsculas onde não deveriam estar (como destaquei em vermelho), etc.

Última coisa,
rictad, só me confirma uma coisa: as fontes (da GUI, das CC, etc.) estariam no próprio zmw_base_zinwell, não é?
Pergunto isso pois como você já descreveu no início deste tópico, as Closed Captions têm fontes pequenas e ruins, não é? Seria uma modificação muito legal poder melhorar isso... Falando nisso, além da fonte das Closed Captions, existe outro tipo de problema, como posicionamento problemático, caracteres errados, falta de itálico, etc.?
Eu estou pra criar um novo tópico aqui no Forum descrevendo as particularidades (e os problemas) das Closed Captions da TV Digital (tendo como ponto de comparação as CC da TV Analógica). Só pra adiantar, na minha TV Sony 40EX505 eu detectei os seguintes problemas, sendo que alguns são como certeza devidos a TV, outros devidos a transmissão, e outros que eu fiquei na dúvida sobre o causador:
- Ausência de Itálicos: Vendo o mesmo filme da Globo, na TV Analógica tem itálico, e já na TV Digital, nos pontos correspondentes, não tem itálico. Será isso um problema da transmissão, ou da TV? Por tudo que eu pude deduzir até agora, as CC digitais ,até o momento, são "upconverted" à partir das analógicas: elas não são criadas específicamente para TV Digital (com todos os recursos melhores que poderiam ser usados...).
- Falta de sincronia: na TV Analógica estão bem sincronizadas, e na Digital estão atrasadas: já ouvi falar que é problema das transmissoras, mas não tenho certeza...
- Alguns Caracteres especiais/acentuados errados: também não sei quem é o responsável...
- Formatação errada: fica evidente quando se compara com as CC dos filmes da Globo na TV Analógica, em que as falas ficam localizadas perfeitamente próximas de quem está falando...
- Fonte de tamanho pequeno, e com espaçamento entre os caracteres exagerado...

Só de lembrar como foi feita a engenharia reversa das fontes dos firmwares Mediatek, já dá um certo desespero: http://personal.inet.fi/cool/mediatek/documents/Info%20-%20MT1389%20v0.3b%20English.rtf E pensar que precisa: encontrar onde estão as fontes; fazer a engenharia reversa; criar um programa para trocar/editar as fontes. Nossa! Não sei quando (ou se) eu seria capaz de fazer esse processo completo. O máximo que eu conseguiria no momento seria tentar ajudar um pouco ali e outro aqui...
« Última modificação: Abril 05, 2011, 01:45:00 am por zeurt »

FORUM.RYAN.COM.BR

Re: Firmware do conversor digital Zinwell ZBT-620A "tijolão" com função PVR
« Responder #79 Online: Abril 04, 2011, 10:15:31 pm »