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

0 Membros e 3 Visitantes 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 #90 Online: Abril 09, 2011, 11:47:19 pm »
Sobre o limite de 6h de gravação:
Andei pensando bastante sobre esse limite, e acabei chegando a algumas conclusões.
Acho que tem sentido existir um limite de tempo de gravação. Por exemplo, digamos que alguém tenha um HDD de 1TB e resolve gravar um programa (apertar REC). Digamos que essa pessoa esqueça dessa gravação, saia de casa, volte, durma, etc. Se não houvesse o limite, seria criado um arquivos gigantesco, ocupando quase todo o HDD??? Ou será que independente de existir um limite explícito, existe algum outro tipo de limitação máxima "natural" para o tamanho possível desses arquivos?
Me parece que o limite de 6h é meio arbitrário, poderia ser mais, ou menos (ou será que existe alguma lógica nesse valor?).
De qualquer modo, na minha opinião, o ideal não seria eliminar o limite (justamente para manter o "dispositivo de segurança" que descrevi acima). Acho que o melhor seria o usuário poder escolher o limite máximo em horas, ou até mesmo poder escolher, quase queira, eliminar o limite. Para isso, também seria necessário termos acesso a estrutura do menu, etc.
Se o usuário pudesse escolher o limite máximo de gravação, estariamos criando indiretamente uma função OTR (One Touch Recording) adaptada. Explico: digamos que se queira gravar as próximas 3 horas de um determinado canal. Seria só ir ao menu e determinar o limite máximo de gravação em 3 horas. Daí, era só pressionar REC (não é tão One Touch, mas é quase... :P)
Caso não conseguirmos mesmo ter acesso a estrutura do menu, se eu pudesse escolher, eu manteria um certo limite máximo (12 horas??). Ou atá mesmo criar 2 versões de firmware, atendendo a todos os gostos...  ;D

Se a pessoa usa um HD pré-formatado com FAT32, a gravação será quebrada em vários arquivos (pois FAT32 suporta arquivos até 4GB). Então, neste caso, acho que não haverá problemas. Sem o limite de tempo, a gravação deve acabar quando o HD encher. Eu acho, pois depois que tirei o limite do tamanho mínimo do HD, eu não tentei gravar até encher um disco. Um bom teste seria criar uma partição de 1GB e testar o PVR nela até acabar o espaço para ver o comportamento do aparelho.

Já a formatação própria usa o seguinte comando: "mke2fs -j -i 8388608 -J size=4 -m 0 -O sparse_super /dev/sdaX", em que X é o número da primeira partição válida encontrada. Ele cria um sistema de arquivos ext3 (ext2 + journal) sem definir explicitamente o tamanho do bloco. Este é calculado heuristicamente considerando-se o tamanho total do sistema de arquivos. Se o HD for de 1TB, ele deve usar um bloco de 4KB, o que permitiria 1 arquivo de até 2TB (claro, limitado pelo tamanho do disco a 1TB). Então, neste caso, podemos ter um super arquivo que pode atrapalhar a manipulação. E também não sabemos qual o comportamento no momento em que o disco acabar. Precisamos fazer testes, mas acho que 24 horas para o tempo máximo de gravação contínua é suficiente.

Estrurura de dados do Firmware:
Nos últimos dias, eu tenho estudado a parte de Pure Data do firmware (a parte .data no IDA). Descobri bastante coisa interessante. Falta MUITA coisa ainda, é claro. Mas já é um começo, já dar pra visualizar o "esqueleto" principal da estrutura de dados. Inclusive, acho que encontrei o provável local das fontes (posso estar enganado, mas evidências iniciais indicam isso).
Estou com o rascunho aqui, e após aprimorar um pouco mais essa versão preliminar ALFA, eu postarei esses achados iniciais...

Boa notícia! Estamos aguardando.

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 #91 Online: Abril 10, 2011, 01:00:22 am »
Olhando no IDA agora, acho que descobri onde está o limitador de 6 horas contínuas de gravação. :laugh: Se estiver certo, pode ser alterado para mais horas ou retirado. Mas só poderei testar quando meu 601 chegar, pois por enquanto estou sem nenhum STB Zinwell aqui. Se funcionar, postarei os detalhes.

FORUM.RYAN.COM.BR

Re: Firmware do conversor digital Zinwell ZBT-620A "tijolão" com função PVR
« Responder #91 Online: Abril 10, 2011, 01:00:22 am »

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 #92 Online: Abril 11, 2011, 08:04:24 pm »
Oi rictad,

Será que você poderia disponibilizar as versões do zmw_base_zinwell que você obteve pelo método alternativo (aquelas que não dá pra extrair pelo Unsquashfs). Por exemplo: as versões do "tijolão", e se você tiver alguma aí também do Semp e/ou do Aiko seria muito bom (aliás, desses 2 últimos, tem como extrair pelo Unsquashfs, ou também não?).

Quanto mais zmw_base_zinwell, dos mais variados modelos, das mais variadas versões, eu puder ver (e comparar), melhor vai poder ser a minha análise da estrutura de dados do firmware. Eu tenho todos os zmw_base_zinwell dos ZBT-601/633 que extrai dos .zim do site da Ivision (5 até agora). O problema é que a estrutura de dados deles é tão parecida que a comparação entre eles acaba não ajudando tanto... Tenho a esperança que a comparação com as outras versões que eu ainda não tenho possa ser mais frutífera... Obrigado!
« Última modificação: Abril 11, 2011, 09:08:26 pm por zeurt »

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 #93 Online: Abril 12, 2011, 05:13:50 am »
Oi rictad,

Será que você poderia disponibilizar as versões do zmw_base_zinwell que você obteve pelo método alternativo (aquelas que não dá pra extrair pelo Unsquashfs). Por exemplo: as versões do "tijolão", e se você tiver alguma aí também do Semp e/ou do Aiko seria muito bom (aliás, desses 2 últimos, tem como extrair pelo Unsquashfs, ou também não?).

Quanto mais zmw_base_zinwell, dos mais variados modelos, das mais variadas versões, eu puder ver (e comparar), melhor vai poder ser a minha análise da estrutura de dados do firmware. Eu tenho todos os zmw_base_zinwell dos ZBT-601/633 que extrai dos .zim do site da Ivision (5 até agora). O problema é que a estrutura de dados deles é tão parecida que a comparação entre eles acaba não ajudando tanto... Tenho a esperança que a comparação com as outras versões que eu ainda não tenho possa ser mais frutífera... Obrigado!

Beleza! Os zmw_base_zinwell que tenho e que foram extraídos pelo método alternativo são os das versões 1.7.2 do ZBT-620A e do ZBT-633, além do da versão 1.0.14c do SEMP. Este último foi-me enviado pelo rafael_netto. Seguem os três em anexo.

Não cheguei a extrair os binários das versões 1.5.5, mas devem ter uma estrutura bem semelhante à das versões 1.7.2. Também não extraí o do Aiko quando testei.

Como você relatou, as versões mais novas (1.13.x, 1.14.x e 1.15.x) do site da Ivison, bem como as modificadas aqui no fórum, são compatíveis com o unsquashfs 3.1. Para outras pessoas que também precisarem, as versões oficiais para o ZBT-601 e ZBT-633 podem ser encontradas aqui. A versão 1.11.6 do ZBT-601 parece ser do tipo que necessita do método alternativo. Como eu estou mexendo no 601, deverei extrair o zmw_base_zinwell dessa versão também.

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 #94 Online: Abril 13, 2011, 12:32:13 am »
Obrigado, 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 #95 Online: Abril 16, 2011, 02:51:02 am »
Oi gente,

Estou demorando para divulgar os meus achados sobre a estrutura de dados do firmware porque a cada dia surgem novas questões, novas decobertas, etc. Aí eu acabo me envolvendo nesses "quebra-cabeças", e também acabo adiando os relatos, pensando em trazer algo já mais completo...

De qualquer modo, resolvi deixar aqui um "aperitivo" sobre o que eu estou preparando...
Mostro abaixo algumas telas de background que eu localizei no firmware do ZBT-601 v.1.15.4, extraí, e converti para bitmaps tradicionais. É interessante notar que no firmware do Zinwell existem telas de background/logotipos da Telesystem, Zirok, LBSat, Aiko, e Cromus. E por sinal, são todos muito feinhos, hein...  :laugh: Sorte que aparentemente não será difícil trocar tudo isso por algo melhor...
Mostro também como aparece um bitmap na parte de dados do firmware. No exemplo, mostro um icone de uma seta para esquerda. Cada pixel é representado por uma palavra de 2 bytes, sendo que o padrão de cores utilizado é o RGB 5-6-5 de 16 bits.

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 #96 Online: Abril 16, 2011, 03:15:30 am »
Oi gente,

Estou demorando para divulgar os meus achados sobre a estrutura de dados do firmware porque a cada dia surgem novas questões, novas decobertas, etc. Aí eu acabo me envolvendo nesses "quebra-cabeças", e também acabo adiando os relatos, pensando em trazer algo já mais completo...

De qualquer modo, resolvi deixar aqui um "aperitivo" sobre o que eu estou preparando...
Mostro abaixo algumas telas de background que eu localizei no firmware do ZBT-601 v.1.15.4, extraí, e converti para bitmaps tradicionais. É interessante notar que no firmware do Zinwell existem telas de background/logotipos da Telesystem, Zirok, LBSat, Aiko, e Cromus. E por sinal, são todos muito feinhos, hein...  :laugh: Sorte que aparentemente não será difícil trocar tudo isso por algo melhor...
Mostro também como aparece um bitmap na parte de dados do firmware. No exemplo, mostro um icone de uma seta para esquerda. Cada pixel é representado por uma palavra de 2 bytes, sendo que o padrão de cores utilizado é o RGB 5-6-5 de 16 bits.

Boa, zeurt:clapping:

Eu estava pensando em remover o logo, pois a exibição dele faz a inicialização demorar um pouco. Já havia começado a identificar a rotina responsável. Mas agora haverá a possibilidade de personalização para o usuário.  :)



Bom, o meu ZBT-601 chegou e eu pude confirmar que o firmware do ZBT-601 é praticamente o mesmo firmware do ZBT-633 tornando-os compatíveis, considerando que os aparelhos utilizam o mesmo controle remoto. Eu instalei o firmware original 1.14.7 da Ivison do ZBT-633 no ZBT-601 e o aparelho funcionou normalmente, com exceção do painel frontal. Os blocos LOAD, ROOT e KERNEL são idênticos. As poucas diferenças estão no bloco CODE, mais especificamente no arquivo zmw_base_zinwell.

O que não permite instalar os firmwares trocados de forma imediata é o customer number: 6 (0x0006) para o ZBT-601 e 262 (0x0106) para o ZBT-633. Mas com o ZimView é possível alterar o customer number, o que permite intercâmbio de firmwares entre o ZBT-633 e o ZBT-601. Para voltar ao firmware correto do aparelho, o CN deste deve ser alterado também, já que o zmw_base_zinwell irá procurar pelo CN do aparelho a que ele corresponde. Lembrando apenas que isso não deve ser feito com o firmware original do ZBT-620A "tijolão" que, apesar de também possuir o customer number 262, tem um controle remoto incompatível com os ZBT-601 e ZBT-633.

Assim, continuarei trabalhando com o firmware 1.14.4 beta, agora também com uma versão adaptada para o ZBT-601, que inicializa corretamente o painel frontal daquele aparelho. A versão oficial 1.15.4 do ZBT-601 parece não possuir nenhuma grande diferença em relação à 1.14.7 do ZBT-633. Além disso, eu notei que a mesma possui um pequeno bug que liga o closed caption após um pendrive ficar alguns minutos conectado: aparece a informação de que o USB foi desconectado seguida da informação de que o mesmo foi conectado e o CC liga.

A rotina que inicializa o painel frontal do ZBT-601 é a seguinte:

Código: [Selecionar]
.text:004DB904                          # executa frontpanel init do ZBT-601
.text:004DB904
.text:004DB904                         sub_4DB904:
.text:004DB904
.text:004DB904                         var_18          = -0x18
.text:004DB904                         var_14          = -0x14
.text:004DB904                         var_10          = -0x10
.text:004DB904                         var_8           = -8
.text:004DB904                         var_4           = -4
.text:004DB904
.text:004DB904 6E 00 1C 3C AC 43 9C 27                 la      $gp, unk_6E43AC
.text:004DB90C 21 E0 99 03                             addu    $gp, $t9
.text:004DB910 D8 FF BD 27                             addiu   $sp, -0x28
.text:004DB914 24 00 BF AF                             sw      $ra, 0x28+var_4($sp)
.text:004DB918 20 00 B0 AF                             sw      $s0, 0x28+var_8($sp)
.text:004DB91C 18 00 BC AF                             sw      $gp, 0x28+var_10($sp)
.text:004DB920 AC 80 90 8F                             la      $s0, unk_D50000
.text:004DB924 34 80 85 8F                             la      $a1, aWarningUnknown
.text:004DB928 98 8B 99 8F                             la      $t9, sub_451D98
.text:004DB92C D0 D7 04 26                             addiu   $a0, $s0, (unk_D4D7D0 - 0xD50000)
.text:004DB930 09 F8 20 03                             jalr    $t9 ; sub_451D98
.text:004DB934 20 DB A5 24                             addiu   $a1, (a7401uarta_0 - 0x690000)  # "7401UARTA"
.text:004DB938 18 00 BC 8F                             lw      $gp, 0x28+var_10($sp)
(...)
(...)
(...)
.text:004DBA6C
.text:004DBA6C                         loc_4DBA6C:                              # CODE XREF: sub_4DB904+150_j
.text:004DBA6C 24 00 BF 8F                             lw      $ra, 0x28+var_4($sp)
.text:004DBA70 20 00 B0 8F                             lw      $s0, 0x28+var_8($sp)
.text:004DBA74 08 00 20 03                             jr      $t9
.text:004DBA78 28 00 BD 27                             addiu   $sp, 0x28
.text:004DBA78                          # End of function sub_4DB904

Assim como a "executa 8051 fp init" do ZBT-620A, ela também depende e é chamada pela rotina "pré-executa fp init". Portanto, a versão 1.14.4 beta para o ZBT-601, à qual eu denominei 1.14.4b beta, foi criada a partir da versão 1.14.4a beta do ZBT-620A aqui do tópico, bastando apenas alterar 1 apontamento na GOT (endereço da rotina "executa 8051 fp init" para o endereço da "executa frontpanel init do ZBT-601" acima).

Além disso, para manter o customer number do ZBT-601, garantindo a compatibilidade com futuras versões de firmware para o aparelho, tive que achar a rotina que verifica o CN e modificá-la. A rotina é a sub_49E880 e o trecho alterado é o seguinte:

Código: [Selecionar]
.text:0049E910 09 F8 20 03                             jalr    $t9
.text:0049E914 21 20 40 02                             move    $a0, $s2
.text:0049E918 21 28 40 00                             move    $a1, $v0
.text:0049E91C 01 06 02 24                             li      $v0, 0x601       # 601 = 0x106 = 262 no ZimView (customer number)
.text:0049E91C                                                                  # alterar para 0x600 = 0x006 = 6 no ZimView
.text:0049E920 1A 00 A2 10                             beq     $a1, $v0, loc_49E98C
.text:0049E924 10 00 BC 8F                             lw      $gp, 0x40+var_30($sp)
.text:0049E928 34 80 84 8F                             la      $a0, aWarningUnknown  # "Warning: unknown JFIF revision number %"...
.text:0049E92C 30 8A 99 8F                             la      $t9, sub_666260
.text:0049E930 01 06 06 24                             li      $a2, 0x601
.text:0049E934 09 F8 20 03                             jalr    $t9 ; sub_666260
.text:0049E938 98 82 84 24                             addiu   $a0, (aIncorrectSWCus - 0x690000)  # "Incorrect S/W customer code from USB S/"...

Parece que o valor mostrado no ZimView não considera que o código é little-endian.  ???
« Última modificação: Abril 16, 2011, 06:52:02 am por rictad »

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 #97 Online: Abril 16, 2011, 06:02:00 am »
Consegui retirar a limitação de 6 horas contínuas para a gravação. Para o agendamento, o limite ficou em 23 horas e 59 minutos devido à forma de como o mesmo é feito: na tela de agendamento não é possível escolher a data do fim das gravações mas apenas a data e hora do início, a hora final, o canal a ser gravado e o modo (diário, semanal, uma vez etc).

Esse forma mais simples é bem interessante. A data final é calculada automaticamente, sendo no mesmo dia, caso a diferença entre as horas final e inicial forem positivas ou em d+1 caso a diferença seja negativa. Assim, por exemplo, se programarmos o início de uma gravação no dia d, hora 13:00 e o término para as 12:59, a data final será em d+1, totalizando 23 horas e 59 minutos. Se a hora final for igual (13:00, no caso do exemplo) ele não aceita, pois considera que há sobreposição de gravação. Esse cálculo já era feito anteriormente, mas limitado a 6 horas. Mais que isso havia o aviso de "hora incorreta informada".

Já para o OTR a ideia foi deixar o limite em 24 horas, para ficar compatível com o limite do agendamento e evitar um arquivo gigante. Como teste, cheguei a fazer duas gravações, uma de aproximadamente de 8 horas e meia e outra de um pouco mais de 10 horas. A primeira foi com OTR e a segunda com agendamento.

Bug

Há um bug no firmware original o qual não consegui retirar e que atrapalha agendamentos superiores a 6 horas. Como explicado, quando se tentava agendar uma gravação com horário de término inferior ao horário inicial, a data de término passava a ser o dia seguinte, desde que não fosse superior a 6 horas. Exemplo: inicio às 22:00 e término às 4:00 era aceito (6 horas de gravação). Já início às 22:00 e término às 21:00 não era aceito, pois totalizaria 23 horas de gravação. Porém, ao se tentar agendar um início na faixa da 0 hora (0:00 a 0:59) e um final em horário anterior, mas na mesma faixa da 0 hora, o aparelho, além de aceitar o agendamento, não atualizava a data em d+1. Exemplo: início 20 de abril à 0:15 e término à 0:10 ele aceitava e colocava a data de término como no próprio dia 20 de abril. Nunca tentei gravar assim e não sei o que acontece. Agora, sem o limite de 6 horas, esse tipo de agendamento continua passando. Por enquanto, a sugestão para quem for fazer uma gravação longa de madrugada é não começar na faixa da 0 hora ou, se começar, terminar no máximo na faixa das 23 horas, a não ser que a diferença seja positiva.

Um pequeno resumo sobre a gravação

Como se sabe, o horário de agendamento segue a informação das emissoras, já que o aparelho não possui timer. A gravação é feita em arquivo único quando o disco está em ext3 ou dividida em arquivos de 3,9GB quando o disco está em FAT32, nomeados com a data e a hora inicial da gravação. Neste último caso, a reprodução do aparelho agrupa os arquivos de forma transparente ao usuário, como se fossem apenas uma gravação.

Durante a reprodução, a navegação pode ser agilizada com o uso das teclas numéricas: o tempo de gravação é dividido em 10 partes iguais e podemos saltar diretamente para cada parte pressionando as teclas de 0 a 9 no controle. Isso funciona bem quando o arquivo é único (ext3). Mas quando estamos em FAT32, gera um certo inconveniente. Cada arquivo de 3,9GB é dividido em 10 partes. Então você só pode saltar entre as partes do arquivo atual.

Nos testes que eu fiz, gravando a Globo HD, no limite de 6 horas foram gerados 10 arquivos, totalizando 39GB. Cada arquivo ficou com 36 minutos, divididos em 10 partes de aproximadamente 3 minutos e 40 segundos (3,6 minutos). Assim, se quisesse saltar para o final da gravação mais rapidamente, teria que apertar  a tecla 9 para ir ao final do primeiro bloco (arquivo), selecionar avanço rápido (32x) e esperar ele passar ao próximo bloco. Ao chegar ao próximo bloco, selecionar avanço normal e apertar 9 novamente para ir ao final do segundo bloco e repetir a operação. Enfim, intercalando saltos de 32,4 minutos com correrias de 3,6 minutos. Quando a gravação for muito grande (por exemplo, 24 horas), isso será muito trabalhoso. Mas acho que o único motivo para se fazer uma gravação tão grande em FAT32 será para se tentar alguma edição posterior no PC. Ainda assim, uma forma de facilitar a exibição de uma gravação grande em FAT32 seria alterar os arquivos textos gerados que agrupam a gravação. Pode-se facilmente dividir uma gravação de 12 horas, com 20 arquivos, em 4 gravações de 3 horas, com 5 arquivos cada. Isso não é difícil, mas é necessário olhar os arquivos para se familiarizar e deduzir como é feito. Existe um arquivo .link com a listagem dos blocos, de mesmo nome do primeiro bloco e um arquivo .info contendo apenas o nome do primeiro bloco e também de mesmo nome deste. No exemplo citado, bastaria criar 4 arquivos .link (com 5 blocos cada) e 4 arquivos .info apontando para o bloco que inicia cada uma das novas "seções" criadas manualmente.

Por outro lado, no formato ext3 próprio do aparelho, também podemos ter problemas com gravações muito grandes. Apesar de facilitar a reprodução, já que temos apenas um arquivo para navegar, quanto maior o arquivo, maior o tamanho dos saltos. Em uma gravação de 24 horas teremos 10 partes de 1 hora e 40 minutos cada.

Modificações

Procurei por referências a string que o zeurt havia indicado ("pvr: stream has recode 6hrs") em uma rotina que fazia referências a outras strings relacionadas ao PVR. A rotina é a sub_4BD51C e encontrei as referências nos seguintes pontos, já que o valor de $s5 era 0x690000:

Código: [Selecionar]
.text:004BD814 58 B0 A4 26                             addiu   $a0, $s5, -0x4FA8  # string pvr maximo 6 horas
Código: [Selecionar]
.text:004BD994 58 B0 A4 26                             addiu   $a0, $s5, -0x4FA8  # string pvr maximo 6 horas
Verificando a rotina, há dois pontos em que o cálculo é feito:

Código: [Selecionar]
.text:004BD7B8 49 01 02 3C                             lui     $v0, 0x149       # calculo das 6 horas #1490000 or #9700 =  #1499700
.text:004BD7BC 00 97 54 34                             ori     $s4, $v0, 0x9700

Código: [Selecionar]
.text:004BD94C 49 01 02 3C                             lui     $v0, 0x149       # calculo das 6 horas #1490000 or #9700 =  #1499700
.text:004BD950 00 97 54 34                             ori     $s4, $v0, 0x9700

Deduzi que esses seriam os pontos pois 0x1499700 dividido por 3600 (3600 segundos), depois por 10 e transformado em decimal dá 600 (isso parece BCD para 6 horas, 0 minutos e 0 segundos).

Além desses pontos, existem ainda mais um em outra rotina:

Código: [Selecionar]
.text:004BA72C 49 01 02 3C                             lui     $v0, 0x149       # calculo das 6 horas #1490000 or #9700 =  #1499700
.text:004BA730 00 97 54 34                             ori     $s4, $v0, 0x9700

E uma palavra em:
Código: [Selecionar]
.rodata:0068B490 00 97 49 01             dword_68B490:   .word 0x1499700          # DATA XREF: sub_4BEA88+428_o
.rodata:0068B490                                                                  # sub_4BEA88+430_r ...
.rodata:0068B490                                                                  # limite 6 horas

Essa palavra é referenciada por uma rotina que também está relacionada ao PVR.

Alterar esses valores não permitiu agendamentos superiores a 6 horas. Isso porque essas rotinas apenas verificam se o a gravação atingiu o tempo máximo (e a interrompem). A rotina responsável pelo agendamento e os critérios de aceitação é a sub_4D4C48. Um trecho chamou a atenção:

Código: [Selecionar]
addiu   $v0, $v1, (byte_68D380 - 0x690000)  # 6 horas no agendamento pvr
lbu     $a0, (byte_68D380 - 0x690000)($v1)  # carrega byte 6. 6 horas
lbu     $a2, 2($v0)
lbu     $a1, 1($v0)

Esse trecho carrega em $a0, $a1 e $a2 os valores 0x6, 0 e 0 (bytes que estão a partir de 0x68D380), respectivamente. Isso é BCD, pois somente foi aceito o agendamento de até 23 horas e 59 minutos após eu mudar para 0x24, 0 e 0, respectivamente (ao colocar 0x18, que é 24 em hexadecimal, o limite de horas passou a ser 18 e não 24, o que evidenciou se tratar de BCD). Isso foi mais um indício de que o valor achado anteriormente, 0x1499700, também estava relacionado ao limite.

Ao apenas mudar esse ponto, o agendamento superior a 6 horas passou a ser permitido, mas a gravação ainda era interrompida após completar 6 horas. Então, mudando as 4 ocorrências do valor 0x1499700 apontadas anteriormente para o seu quádruplo (0x5265C00) finalmente foi permitido gravar mais que 6 horas.

A dúvida ainda é saber se a mudança daquele valor para o quádruplo realmente limita a gravação em 24 horas. Pode ser que deixe passar, se o cálculo não for tão simples. No caso do agendamento, isso não tem problema, pois a agenda será seguida (eu testei até 10 horas e pouco) e a gravação será limitada a 23 horas e 59 minutos. Já no caso do OTR eu não tive paciência para testar (interrompi com 8 horas e meia). Então, quando disponibilizar o firmware, fica a sugestão para testes.

Eu imagino que o bug da 0 hora esteja na rotina sub_460178, chamada pela que faz o agendamento. Ela é quem recebe os valores e parece fazer os cálculos das diferenças entre os horários. Ainda não tentei entendê-la, mas qualquer mudança nela deverá ser feita com cuidado, já que é chamada por diversas outras rotinas.

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 #98 Online: Abril 16, 2011, 07:03:41 am »
Firmware Rictad versão 1.14.4 beta 2

  • Tempo contínuo de gravação por agendamento aumentado para 23 horas e 59 minutos;
  • Tempo contínuo de gravação OTR aumentado para 24 horas (ainda não testado completamente);
  • Correção de algumas traduções de mensagens exibidas na tela;
  • Disponibilizada uma versão para o ZBT-601.


ATENÇÃO:

Por questão de segurança, assim como ocorre com a versão 1.13.6, só atualize para as versões 1.14.4, 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 as versões 1.5.5 ou 1.7.2 que estão disponíveis na Internet, de acordo com o modelo do seu aparelho.

A versão 1.14.4a beta 2 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 correta depois.
Após a atualização, você não poderá instalar as versões antigas 1.7.2 e 1.5.5 oficiais. Caso isso seja necessário, você só poderá "desatualizar" se utilizar a versão ZBT-620A_1.7.2_back2 especial disponibilizada no tópico.

A versão 1.14.4b beta 2 deve ser preferencialmente instalada no Zinwell ZBT-601. Mas se você instalar no aparelho errado, ainda poderá atualizar com a versão correta depois.
EDIT 30/04/2011: Após o relato abaixo do usuário PedroAcerbi e alguns testes, foi verificado que essa versão só deve ser instalada se a versão atual do ZBT-601 for a 1.11.6 ou a 1.15.4. Caso seja alguma versão 1.14.X, o aparelho deverá ser atualizado antes para a versão 1.15.4 oficial, ou haverá o grande risco de não mais inicializar, sendo recuperável apenas via cabo.
Após a atualização, você poderá voltar para as versões oficiais 1.14.1, 1.14.3, 1.14.4, 1.14.5 e 1.15.4 disponibilizadas no site da Ivision. E assim como ocorre quando se atualiza com as versões oficiais, você não poderá voltar para a versão mais antiga (1.11.6).

A versão 1.14.4c beta 2 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 correta depois. Após a atualização, você poderá voltar para as versões oficiais 1.13.6, 1.14.4 e 1.14.7 disponibilizadas no site da Ivision. E assim como ocorre quando se atualiza com as versões oficiais, você não poderá voltar para as versões mais antigas (1.7.2 e 1.5.5). Caso isso seja necessário, você só poderá "desatualizar" se utilizar a versão ZBT-633_1.7.2_back2 especial disponibilizada no tópico.

Quando você atualizar para a versão 1.14.4 beta 2, serão gravados 4 blocos na flash. Então você deverá esperar a barra de gravação encher 4 vezes! Após a atualização, caso o STB já não esteja atualizado com a versão 1.14.4 oficial, o mesmo será reiniciado 2 vezes, a primeira é para apagar a EPROM.
« Última modificação: Maio 01, 2011, 12:46:17 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 #99 Online: Abril 17, 2011, 09:47:33 pm »
Verificando a rotina, há dois pontos em que o cálculo é feito:

Código: [Selecionar]
.text:004BD7B8 49 01 02 3C                             lui     $v0, 0x149       # calculo das 6 horas #1490000 or #9700 =  #1499700
.text:004BD7BC 00 97 54 34                             ori     $s4, $v0, 0x9700

Código: [Selecionar]
.text:004BD94C 49 01 02 3C                             lui     $v0, 0x149       # calculo das 6 horas #1490000 or #9700 =  #1499700
.text:004BD950 00 97 54 34                             ori     $s4, $v0, 0x9700

Deduzi que esses seriam os pontos pois 0x1499700 dividido por 3600 (3600 segundos), depois por 10 e transformado em decimal dá 600 (isso parece BCD para 6 horas, 0 minutos e 0 segundos).
Genial, rictad!  :clapping:
Dá gosto poder acompanhar as suas descobertas!
Quanto ao número 1499700, ele não poderia ser ao invés de BCD, simplesmente o tempo de gravação em milisegundos? Isso porque 1499700h milisegundos / 3600000 = 6 horas (em decimal). Ou será que o aparelho não opera em milisegundos?
Eu entendo que aquele outro trecho parece mesmo BCD, carregando 6, depois 0, e depois 0, mas talvez o primeiro trecho (do numero 1499700) não seja.
Em resumo, o tempo de agendamento poderia ser aramazenado em BCD, enquanto o tempo de gravação poderia ser armazenado em milisegundos, em uma palavra de 4 bytes em hexadecimal. Daí o tempo máximo possível de gravação seria FFFFFFFF milisegundos, aproximadamente 1193 horas...  :laugh:
Falando nisso, você testou colocar outros valores nesses  6, 0 e 0 para ver o que acontecia? Tipo 0, 15 e 0 para ver se limitava em 15 minutos? Me desculpe por esses preciosismos meio sem finalidade... É que fiquei viajando nesses números...  :-[ No fim essas minhas curiosidades não levam praticamente a lugar nenhum já que o problema principal já foi mais que resolvido!  :)

Já chegou o meu ZBT-601 (na verdade vai ficar com a minha mãe  :P). Testei rapidamente o FW original v 1.11.6, e logo atualizei com a sua última versão. Estou com escassez de HDDs aqui (tenho 2 de 500GB, mas cheios e formatados em NTFS). Um deles tinha uma segunda partição de 16GB em FAT32. Tentei fazer uma gravação com ele: gravou, mas sempre que eu tentava acessar os arquivos do HDD (para poder ver a gravação, ou fotos e musica) o aparelho travava: tinha que pressionar power para fazer o reboot. Já li uns relatos de que um HDD com partições NTFS e FAT32 ou ext3 teria problemas com o aparelho. Isso confere?
P.S.: Eu também testei formatar a segunda partição em ext3, mas os resultados foram os mesmos: travava ao acessar o menu de arquivos. Depois, só pra confirmar, eu atualizei com o FW oficial 1.15.4: também não funcionava, só que ao invés de travar, ele fazia um reboot automático (tanto com FAT32 como com ext3). Daí, eu aumentei a partição para 40GB, para tentar gravar alguma coisa: ele não permitia gravar, alegando a ausencia de partição de pelo menos 32GB válida (mesmo com a partição de 40GB lá! É estranho porque com o seu FW pelo menos a gravação era permitida, só havendo problema no acesso à mesma). Será que o problema seria a ordem das partições? Ou seja, a primeira partição valida teria que ser a ext3 ou FAT32, e como a minha era NTFS não funcionava... Será isso? Falando nisso tem como trocar a ordem das partições? Eu usei o GParted num Live Linux pra manipular e formatar as partições.

Só sei que depois (de volta ao seu FW) fiz um teste de gravação com um pendrive "meia-boca" de 4GB, formatado em FAT32, e funcionou perfeitamente: nem pude verificar travamentos ou qualquer outro problema... Acho que dei sorte...

Quanto ao seu projeto do Mini Modo de Desenvolvimento, me tira uma dúvida: com ele seria possível "testar" os zmw_base_zinwell no pendrive, mesmo sem o cabo e o PC?


« Última modificação: Abril 18, 2011, 08:13:01 pm por zeurt »

FORUM.RYAN.COM.BR

Re: Firmware do conversor digital Zinwell ZBT-620A "tijolão" com função PVR
« Responder #99 Online: Abril 17, 2011, 09:47:33 pm »