Exibir mensagens

Esta seção lhe permite ver todas as mensagens deste membro. Note que você só pode ver as mensagens das áreas às quais você tem acesso.


Tópicos - rictad

Páginas: 1
1
O STB Zinwell ZBT-620A começou a ser vendido no Brasil há uns 2 anos e pouco, eu acho. É chamado de "tijolão", pois tem uma carcaça do tamanho de um vídeo cassete, apesar de ter uma pequena placa Zinwell 620 dentro. O "tijolão", devido a novas versões de firmware e uma carcaça um pouco diferente, também chegou a ser vendido como "620C" ou "620CZ", mas o hardware ainda era o do 620A, com o mesmo controle remoto. Porém, a empresa que comercializava os aparelhos Zinwell aqui no Brasil (Ekotech) foi descredenciada pela marca taiwanesa e passou a se autodenominar Zinwellbr (apesar de não ter mais nenhuma ligação com a Zinwell) e vender aparelhos chineses similares com nomes parecidos (ZBT 620N, ZBT 650N). Bom, a Zinwell licenciou uma nova empresa no Brasil, chamada Ivison, que herdou a assistência aos equipamentos Zinwell vendidos anteriormente e também passou a comercializar o aparelho como ZBT-620C numa versão "slim", mas que depois foi rebatizado de ZBT-633, para não ser confundido com o 620N da Zinwellbr. O problema é que o ZBT-620C/ZBT-633 slim, apesar de ter o hardware ainda identificado como "620A" na informação do firmware, possui algumas pequenas diferenças que não permitem o intercâmbio total do firmware. Seu painel frontal é diferente e seu controle remoto é do padrão Zinwell, preto e menor.

No site da Ivison passaram a oferecer um firmware para o ZBT-633 slim com função PVR (ainda que sem agendamento: a gravação é somente OTR e começa ao se apertar a tecla vermelha do controle). Como o 620C slim é exatamente o mesmo aparelho, essa versão também serve nele. Já o antigo 620A "tijolão" não pode ser atualizado com ela, devido às diferenças apontadas acima. Ou seja, ficou fora do suporte, apesar de ter sido herdado pelo nova licenciada. A atualização praticamente mata o aparelho: além do controle remoto não funcionar, o painel frontal não é inicializado e não funciona mais. A única forma de operá-lo é conseguir o controle remoto do slim. Mas não tem como voltar para a versão de firmware anterior, pois a nova versão é incompatível com desatualizações. Futuramente vou explicar o porquê. Algumas pessoas caíram nessa "armadilha" e tiveram que mandar seus aparelhos para a assistência técnica.

Devido a essa confusão de nomes e modelos, vou usar sempre os termos "ZBT-620A" ou "tijolão" para designar o Zinwell ZBT-620A/C/CZ versão "tijolão" de controle remoto grande prateado e os termos "ZBT-633" ou "slim" para designar o Zinwell ZBT-620C/633 versão slim de controle remoto menor preto.

A última versão do firmware do ZBT-620A é a 1.7.2. Essa versão está disponível também para o ZBT-633, mas elas não são intercambiáveis por causa das diferenças de hardware descritas acima (controle remoto e painel frontal). Já a última versão para o slim, com suporte a PVR, é a 1.13.6.

Basicamente o que eu fiz foi pegar os firmwares 1.7.2 do ZBT-633 e do ZBT-620A, extrair os executáveis principais de ambos e comparar seu código MIPS com o IDA. Achei as rotinas do remoto e de inicialização do painel frontal. A partir daí, extraí o executável do firmware 1.13.6 do ZBT-633, que tem a função PVR.  Então incluí no código suporte ao controle remoto e ao painel frontal do ZBT-620A e suporte ao controle de TV Samsung BN59-00604A, com função STB. Ou seja, 3 controles remotos funcionam com o firmware agora e ele inicia o painel frontal do ZBT-620A. Assim, montei um firmware para o "tijolão", com PVR e funcional.

O controle Samsung deve ser programado com o código 015 na função STB para funcionar. Essa codificação foi escolhida porque é das primeiras que possui mais teclas funcionando e mais fabricantes correspondentes, segundo a lista de códigos disponível no manual Samsung (Philips, DirecTV...). Provavelmente outros controles universais para STB devem ter alguma codificação correspondente e também funcionem. Algumas teclas têm função extra caso continuem sendo apertadas por mais de 1 segundo. Segue a tabela de correspondência de teclas desse controle que eu incluí no firmware:

TeclaFunçãoFunção ao segurar
SourceResoluçãoResolução
Channel +/-Channel +/-Channel +/-
MenuMenuAudio
ExitSairPicture
EnterEnterTecla vermelha - REC
InfoInfoSubtitle
Teclas de Navegação      Teclas de Navegação      Teclas de Navegação

Também deixei uma versão com a inicialização original do painel frontal do ZBT-633, mas com o suporte aos 3 controles, de forma que os firmwares tornaram-se razoavelmente intercambiáveis. O máximo que acontece ao se instalar o firmware modificado no aparelho errado é que o painel frontal não funciona. Mas como os controles de ambos os aparelhos são suportados, o usuário ainda poderá operar normalmente o STB e atualizar com o firmware correto.
A atualização da versão 1.7.2 para a 1.13.6 seria, a princípio, irreversível, devido à estrutura do arquivo de firmware, como vou explicar em outro post. Mesmo quando se atualiza com o firmware original, a documentação diz que não é possível retornar. Mas eu criei uma versão especial de retorno para a 1.7.2 apenas para o ZBT-620A "tijolão", para quem quiser voltar para a versão oficial, seja qual for o motivo. Já quem possuir o ZBT-633 poderá voltar normalmente para versão 1.13.6 oficial baixada no site da Ivision, mas não poderá voltar para a 1.7.2, como já não era possível mesmo.

Existem alguns clones Zinwell no mercado brasileiro (como os Aiko, Zirok, Semp etc) que talvez possam funcionar com os firmwares disponibilizados aqui. Mas só atualize se tiver absoluta certeza de que o firmware Zinwell é compatível com o seu aparelho e que você tenha ao menos um controle compatível com os 3 mencionados aqui. Tem alguns que são clones do "tijolão", com o controle prata grande. Outros são clones do slim. E tem outros que não tem correspondência de controle remoto e você pode ficar sem operar o STB. Então, se não for Zinwell ZBT-620/633, tenha cuidado! Mas se você já usa ou usou um firmware Zinwell ZBT-620, ou o do "tijolão" ou o do slim, poderá atualizar.

Posteriormente vou postar mais informações neste tópico. Vou fazer um resumo sobre a estrutura geral do firmware, vou mostrar como eu fiz as alterações e postar as rotinas do IDA. Aparentemente, a Ivision está terminando uma nova versão com agendamento de gravação. Deve ser só para o slim novamente. Se o padrão do firmware se mantiver, talvez eu possa criar uma versão com agendamento de gravação para o "tijolão" também.

Seguem os arquivos de firmware. Lembre-se, atualizar o firmware é uma operação segura, mas envolve alguns riscos. Tenha certeza de não desligar o aparelho enquanto o processo não terminar totalmente. De preferência, use no-break para evitar quedas de energia. Caso aconteça alguma falha que provoque a interrupção do processo, você precisará levar seu aparelho para a assistência técnica.


ATENÇÃO:

EDIT: Você só deve atualizar para as versões 1.13.6, inclusive a oficial da Ivision, se o aparelho estiver, no mínimo, com a versão 1.5.5. Caso a versão seja inferior a essa, como a 1.3.7 ou a 1.3.8, você deve atualizar primeiro para a versão 1.5.5 ou versões superiores que estão disponíveis na rede. Explicação nos próximos posts.

A versão 1.13.6a deve ser preferencialmente instalada no Zinwell ZBT-620A "tijolão", de controle grande e prateado. Mas se você instalar no aparelho errado, ainda poderá atualizar com a versão c depois.
Após a atualização, você não poderá instalar as versões antigas 1.7.2 e 1.5.5 oficiais. Caso, por algum motivo, isso seja necessário, você só poderá voltar se utilizar a versão 1.7.2_back especial disponibilizada aqui.

A versão 1.13.6c deve ser preferencialmente instalada no Zinwell ZBT-620C/633 slim, de controle Zinwell menor e preto. Mas se você instalar no aparelho errado, ainda poderá atualizar com a versão a depois. Após a atualização, você só poderá voltar para a versão oficial 1.13.6 disponibilizada no site da Ivision. Não poderá voltar para a versão antiga 1.7.2.

A versão 1.7.2_back 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ê instalar 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.

EDIT: Eu montei uma nova versão 1.7.2_back (1.7.2_back2), menor e mais segura, disponível alguns posts mais à frente. Prefira utilizar a nova versão 1.7.2_back2 em vez dessa 1.7.2_back aqui do post. Também incluí uma variação para ser usada exclusivamente no Zinwell ZBT-620C/633 slim.

Quando você atualizar para a versão 1.13.6, serão gravados 4 blocos na flash. Então você deverá esperar a barra de gravação encher 4 vezes! Se você atualizar a partir da versão 1.7.2 (ou 1.5.5), o STB será reiniciado 2 vezes, a primeira é para apagar a EPROM.
Se você voltar o ZBT-620A "tijolão" para a versão 1.7.2_back, o aparelho poderá travar após as 4 gravações. É normal! Somente quando tiver certeza que a barra encheu e travou, após a quarta gravação, você deverá desligar o aparelho da tomada, depois religá-lo e esperar o mesmo reiniciar 2 vezes.




2
Olá jmaraujo,

Olhando nos ARM codes do seu firmware, eu havia identificado a rotina sub_E64C como possível responsável pela exibição das legendas, mas achei ela muito diferente das usadas nos aparelhos LG. Porém, com o email que você me mandou, com várias identificações encontradas por você dos pontos mostrados no texto "MPEG4 Subtitle Display in ARM", eu pude confirmar que é ela mesma. Interessante que a rotina que origina a chamada a ela, que começa em sub_AEE4, é idêntica à que eu já identifiquei em alguns aparelhos LG.

Bom, o maior problema dessa rotina é que não dá para identificar de forma clara em que posição de RAM fica o buffer de legenda. Parece que o caractere é lido neste trecho:

Código: [Selecionar]
ROM:0000E6F0 60 1C                       ADDS    R0, R4, #1
ROM:0000E6F2 21 1C                       ADDS    R1, R4, #0
ROM:0000E6F4 75 5C                       LDRB    R5, [R6,R1]     ; le caractere?
ROM:0000E6F6 00 06                       LSLS    R0, R0, #0x18
ROM:0000E6F8 00 0E                       LSRS    R0, R0, #0x18
ROM:0000E6FA 04 1C                       ADDS    R4, R0, #0
ROM:0000E6FC 0D 2D                       CMP     R5, #0xD

A posição inicial do buffer está carregada em R6. Porém, o registrador R6 não tem a posição carregada diretamente. Isso ocorre aqui:

Código: [Selecionar]
ROM:0000E66A 08 9E                       LDR     R6, [SP,#0x38+var_18]
ROM:0000E66C 01 36                       ADDS    R6, #1
ROM:0000E66E 30 78                       LDRB    R0, [R6]
ROM:0000E670 01 36                       ADDS    R6, #1

Ele é carregado com o conteúdo de uma posição relativa ao Stack Pointer e depois incrementado 2 vezes. Então fica mais difícil saber exatamente o valor da primeira posição do buffer e procurar a região em que o buffer é preenchido, com a leitura do buffer primário (se é que no Philips tem isso).

De qualquer forma, a própria rotina que exibe a legenda possui um contador próprio para percorrer o buffer de legenda, de forma que é possível para você colocar um filtro de tags. Se olharmos novamente o trecho de leitura do caractere, podemos ver o contador:

Código: [Selecionar]
ROM:0000E6F0 60 1C                       ADDS    R0, R4, #1       ; adiciona 1 a R4, que é o contador, e guarda o valor em R0 para atualizar R4 depois.
ROM:0000E6F2 21 1C                       ADDS    R1, R4, #0       ; temporariamente copia o valor atual do contador em R1
ROM:0000E6F4 75 5C                       LDRB    R5, [R6,R1]      ; le caractere, na posição atual R6+R1 = R6+R4
ROM:0000E6F6 00 06                       LSLS    R0, R0, #0x18    ; ainda não entendi essa sequencia, muito utilizada no ARM. a primeira multiplica R0 por 2^18
ROM:0000E6F8 00 0E                       LSRS    R0, R0, #0x18    ; a segunda divide R0 por 2^18. R0 fica com o mesmo valor (R4 + 1). a utilidade deve ser zerar
                                                                  ; alguma flag ou truncar alguns bits de R0
ROM:0000E6FA 04 1C                       ADDS    R4, R0, #0       ; o contador R4 é atualizado com o valor em R0, que é R4+1
ROM:0000E6FC 0D 2D                       CMP     R5, #0xD         ; caractere é quebra de linha?

A partir de ROM:0000E6F0, você pode tentar fazer algumas modificações, com um salto para uma rotina que filtra as tags. Segue um exemplo:

Código: [Selecionar]
ROM:0000E6F0 21 1C                       ADDS    R1, R4, #0       ; temporariamente copia o valor atual do contador em R1
ROM:0000E6F2 75 5C                       LDRB    R5, [R6,R1]      ; le caractere, na posição atual R6+R1 = R6+R4
ROM:0000E6F4 XX XX XX XX                 BL      filtra_tag
ROM:0000E6F8 04 1C                       ADDS    R4, R0, #0       ; o contador R4 é atualizado com o valor em R0, que é R4+1
ROM:0000E6FA 00 00                       NOP                      ; pseudo nop
ROM:0000E6FC 0D 2D                       CMP     R5, #0xD
....................................................................
....................................................................
             3C 2D    filtra_tag         CMP     R5, #0x3C        ; caractere ="<"?
             06 D1                       BNE prossiga             ; se não, vai embora
             01 31    procura_fim_tag    ADDS    R1, R1, #1       ; se sim, atualiza contador para procurar fim da tag ">"
             75 5C                       LDRB    R5, [R6,R1]
             3D 2D                       CMP     R5, #0x3D        ; caractere =">"?
             FB D1                       BNE procura_fim_tag      ; se não, volta e continua procurando
             01 31                       ADDS    R1, #1           ; se sim, atualiza contador para próximo caractere fora da tag
             75 5C                       LDRB    R5, [R6,R1]
             F6 E7                       B filtra_tag             ; e se o próximo caractere for outra tag?
             48 1C   prossiga            ADDS    R0, R1, #1       ; atualiza contador em R0 para ser repassado a R4 depois
             00 06                       LSLS    R0, R0, #0x18
             00 0E                       LSLS    R0, R0, #0x18
             70 47                       BX LR                    ; retorna

O problema dessa modificação é que ela considera que o buffer é infinito. Então, se tivermos uma tag enorme, por exemplo <akjkj............asas> maior que o buffer de legenda ou ainda se a tag começar em um quadro de legenda e só terminar em outro (são 2 situações bem raras, só uma legenda feita propositalmente com defeito teria isso), poderemos ter falhas na exibição da legenda. Caso queira evitar esse tipo de coisa, pode dar uma olhada no trecho que verifica o limite do contador R4:

Código: [Selecionar]
ROM:0000E7D8             loc_E7D8                                ; CODE XREF: sub_E64C:loc_E78E_j
ROM:0000E7D8                                                     ; sub_E64C+14A_j ...
ROM:0000E7D8 03 98                       LDR     R0, [SP,#0x38+var_2C]
ROM:0000E7DA 84 42                       CMP     R4, R0
ROM:0000E7DC 88 D3                       BCC     loc_E6F0

Espero ter ajudado. Tudo isso é hipotético, pois precisa ser testado de fato.

3
O zeurt encontrou o Simple ARM Assembler (aasm), um Assembler gratuito para instruções ARM, mas não havia o binário para Windows. Então usei o Cygwin (http://www.cygwin.com/) e o compilei para Windows x86. Estou enviando o arquivo zipado com o aasm.exe e também com a documentação no formato texto Windows. O site de distribuição, http://intranet.cs.man.ac.uk/Study_subweb/Ugrad/coursenotes/komodo/assembler/ nos dá essa liberdade.

Ele deve ser executado pelo Prompt de Comando do Windows. É bem simples de utilizar e suporta o modo Thumb. Você pode usar o Bloco de Notas e escrever, por exemplo:

Código: [Selecionar]
THUMB
INICIO ADD R0, R1, R1
ADD R2, R1, R1
LSL R1, R2, #3
BNE INICIO

A primeira linha diz que será usado o modo Thumb (16 bits). A segunda possui um label. Já vi que no modo Thumb, os mnemônicos que o IDA chama de ADDS, LSLS e LSRS devem ser escritos como ADD, LSL e LSR, respectivamente. Deve haver mais algumas diferenças em outros mnemônicos, consultem a documentação. Se você não sabe o que é modo Thumb ou como são as instruções do ARM, veja um pouco do assunto a partir deste post: http://ryan.com.br/smf/index.php?topic=392.msg9177215#msg9177215.

Após salvar o arquivo, você pode usar o comando aasm.exe -h - (caminho_do_arquivo\nome_do_arquivo) para ver o hexadecimal gerado na tela ou aasm.exe -h (nome_do_arquivo_de_saida) (caminho do arquivo\nome do arquivo) para gerar um arquivo texto com o hexadecimal. Veja que no primeiro caso, em vez do nome do arquivo de saída, foi usado apenas o símbolo "-". O arquivo de saída não pode ser visualizado corretamente no Bloco de Notas pois ele não está no formato texto Windows. Use outro visualizador. Sugiro o Programmer’s Notepad (http://www.pnotepad.org/) que é muito bom e gratuito. Apesar de não ser possível gerar o binário puro, é possível gerar o ELF com o comando aasm.exe -e (nome_do_arquivo_de_saida) (caminho do arquivo\nome do arquivo). Você pode abrir o arquivo de saída ELF num editor hexadecimal e retirar apenas a parte do seu código (após o cabeçalho).

Há várias outras opções, consultem a documentação. Como não trabalhei com esse software, não conheço suas limitações e nem seus bugs.

O aasm é voltado para o KMD, (http://brej.org/kmd/index.html), um debugger gráfico com suporte ao ARM. Como ele pode complementar o IDA, tentei também instalá-lo com o Cygwin, mas não consegui devido a problemas com a biblioteca GTK. Mas acho que ainda é possível, só é preciso resolver as dependências. Seria mais fácil para os usuários Windows utilizarem-no com o Cygwin, sem que precisem instalar o Linux inteiro. Como usuário Linux, ainda não tive a oportunidade de instalá-lo diretamente. Mas já observei que há pocotes compilados para o Ubuntu.

Páginas: 1