rictad,
Você já conseguiu alguma pista sobre a localização e funcionamento das rotinas do menu? Pergunto isso pois, caso seja possível o suporte a NTFS, talvez seja necessária a seleção do tipo de sistema de arquivos usado (ext3 ou NTFS), através do menu...
Olá
zeurt! Consegui apenas algumas poucas coisas em relação à GUI. Acho que é possível redirecionar os apontamentos às strings "Sim" e "Não" (no menu que pergunta se deseja formatar) para strings "FAT32" (ou "NTFS") e "ext3", por exemplo. Daí a escolha "ext3" continuará executando o comando "mke2fs", que foi fácil de achar procurando por essa string no código. Mas ainda não procurei descobrir como é feita a execução desse comando. Descobrindo como, será possível redirecionar a outra opção à execução de um comando "mkfs.vfat" ou "mkntfs" de uma forma semelhante, eu acho.
1- Modificações de firmware no WDTV: http://root.unknown.sk/wdtv/wiki/doku.php?id=wdtv_firmware_hacks
Pode-se observar no link que passei, que existem 2 tipos principais de firmware alternativo para o WDTV, sendo um tradicional, e outro chamado ext3-boot, que de certa maneira lembra o Mini Modo de Desenvolvimento que você quer implantar para o Zinwell (ou seja, o boot é feito pelo pendrive, o qual deve conter o firmware a ser testado: o interessante é que nesse caso não há a limitação de tamanho da flash, podendo-se criar firmwares de tamanhos bem grandes...).
Isso é interessante. Tem até versão com suporte a CD/DVD externo.
Consegui retirar o bug do closed caption na versão 1.14.4. Então fiz as modificações para aceitar os 3 controles, incluí suporte ao controle do Semp DC2008H (ainda não testado). Agradecimentos ao
rafael_netto pelos códigos daquele controle. Retirei a limitação do tamanho mínimo dos HDs externos (que era de 32 GB) e fiz a versão para o "tijolão". Antes de disponibilizar os firmwares, vou explicar o que foi feito.
Eu obtive a versão 1.14.2, que parece ter sido usada como testes para a função PVR com agendamento. Agradecimentos ao
JC. Essa versão, assim como a 1.13.6, não possui bug algum no closed caption. Não testei tudo, então não sei como estavam as demais funções. Mas o closed caption estava funcionando normalmente. O que ocorre é que esses firmwares tem duas rotinas relacionadas ao CC. Uma é para habilitar/desabilitar o closed caption e a outra é para mostrar/ocultar a legenda do CC, mesmo ele estando habilitado. No firmware 1.14.4, a rotina que habilita a legenda é a
sub_45ACD4. Para habilitar, devemos chamá-la com o valor 1 no registrado $a0. Para desabilitar, o valor deve ser 0. Já a rotina que deixa ou não ser mostrado o quadro de legendas do CC é a
sub_4A2F18 e também tem como entrada o registrador $a0. Para chegar a essas rotinas, procurei pelas strings "Enable CC" e "Show CC" que são mostradas no console (com cabo serial) quando habilitamos ou desabilitamos o closed caption.
O motivo para ter duas talvez seja o desejo ou necessidade de "desabilitar" temporariamente o closed caption enquanto se faz alguma operação. Por exemplo, ao se conectar um dispositivo na entrada USB, aparece na tela o quadro de mensagens com a informação "USB Conectado!". Se o CC estiver habilitado, poderia dar problemas. O mesmo poderia acontecer ao acessar o menu. Porém, ao que parece, as próprias rotinas da interface gráfica se encarregam de resolver esse conflito, desabilitando temporariamente a visualização do CC enquanto alguma outra informação é exibida na tela. Por isso, não havia nenhuma preocupação em desabilitar o CC quando se exibia mensagens na tela nas versões 1.13.6 e 1.14.2.
Já na versão 1.14.4, estranhamente as rotinas responsáveis pela exibição do closed caption (as duas) são chamadas pela rotina que exibe a informação de dispositivo USB conectado/desconectado. E isso ocorre duas vezes, sendo a primeira para desabilitar o CC, antes da exibição da mensagem, e a segunda para habilitar, após a exibição. Há também outra rotina que as chama, duas vezes e da mesma forma. Essa rotina é bem grande e tem relação com diversas funções que exibem informações na tela, entre elas a de atualização de firmware. E, por fim, outra rotina faz três chamadas, mas sempre ligando o CC. Essa parece estar ligada à programação de canais.
Portanto, ao todo são 3 bugs de CC. Eu simplesmente retirei essas chamadas anormais às rotinas "Enable CC" e "Show CC" e tudo voltou a funcionar como deveria. Seguem os pontos:
.text:0045AD20 18 97 99 8F la $t9, sub_4A2C58 # Mostra 'Enable CC'
.text:0045AD24 21 20 00 00 move $a0, $0 # Bug CC desliga
.text:0045AD28 09 F8 20 03 jalr $t9 ; sub_4A2C58 # Mostra 'Enable CC' -- alterar para nop
.text:0045AD2C 02 91 10 00 srl $s2, $s0, 4
.text:0045AD30 18 00 BC 8F lw $gp, 0x40+var_28($sp)
.text:0045AD34 21 20 00 00 move $a0, $0
.text:0045AD38 3C 97 99 8F la $t9, sub_4A2F18 # Mostra 'Show CC'
.text:0045AD3C 09 F8 20 03 jalr $t9 ; sub_4A2F18 # Mostra 'Show CC' -- alterar para nop
.text:0045B0B4 18 97 99 8F la $t9, sub_4A2C58 # Mostra 'Enable CC'
.text:0045B0B8 02 AA 02 92 lbu $v0, (byte_C3AA02 - 0xC40000)($s0)
.text:0045B0BC 05 00 40 14 bnez $v0, loc_45B0D4
.text:0045B0C0 01 00 04 24 li $a0, 1 # Bug CC liga
.text:0045B0C4 1C 00 BF 8F lw $ra, 0x20+var_4($sp)
.text:0045B0C8 18 00 B0 8F lw $s0, 0x20+var_8($sp)
.text:0045B0CC 08 00 E0 03 jr $ra
.text:0045B0D0 20 00 BD 27 addiu $sp, 0x20
.text:0045B0D4 # ---------------------------------------------------------------------------
.text:0045B0D4
.text:0045B0D4 loc_45B0D4: # CODE XREF: sub_45B094+28_j
.text:0045B0D4 09 F8 20 03 jalr $t9 # -- alterar para nop
.text:0045B0D8 00 00 00 00 nop
.text:0045B0DC 10 00 BC 8F lw $gp, 0x20+var_10($sp)
.text:0045B0E0 3C 97 99 8F la $t9, sub_4A2F18 # Mostra 'Show CC'
.text:0045B0E4 09 F8 20 03 jalr $t9 ; sub_4A2F18 # Mostra 'Show CC' -- alterar para nop
.text:004A809C 18 97 99 8F la $t9, sub_4A2C58 # Mostra 'Enable CC'
.text:004A80A0 01 00 02 24 li $v0, 1
.text:004A80A4 8C 4C 62 A0 sb $v0, 0x4C8C($v1)
.text:004A80A8 09 F8 20 03 jalr $t9 ; sub_4A2C58 # Mostra 'Enable CC' -- alterar para nop
.text:004A80AC 21 20 00 00 move $a0, $0 # Bug CC desliga
.text:004A80B0 18 00 BC 8F lw $gp, 0x40+var_28($sp)
.text:004A80B4 21 20 00 00 move $a0, $0
.text:004A80B8 3C 97 99 8F la $t9, sub_4A2F18 # Mostra 'Show CC'
.text:004A80BC 80 80 92 8F la $s2, unk_CB0000
.text:004A80C0 09 F8 20 03 jalr $t9 ; sub_4A2F18 # Mostra 'Show CC' -- alterar para nop
.text:004A8670 18 97 99 8F la $t9, sub_4A2C58 # Mostra 'Enable CC'
.text:004A8674 8C 4C 60 A0 sb $0, 0x4C8C($v1)
.text:004A8678 09 F8 20 03 jalr $t9 ; sub_4A2C58 # Mostra 'Enable CC' -- alterar para nop
.text:004A867C 01 00 04 24 li $a0, 1 # Bug CC liga
.text:004A8680 18 00 BC 8F lw $gp, 0x60+var_48($sp)
.text:004A8684 3C 97 99 8F la $t9, sub_4A2F18 # Mostra 'Show CC'
.text:004A8688 09 F8 20 03 jalr $t9 ; sub_4A2F18 # Mostra 'Show CC' -- alterar para nop
.text:004A868C 01 00 04 24 li $a0, 1
.text:004D2CE0 18 97 99 8F la $t9, sub_4A2C58 # Mostra 'Enable CC'
.text:004D2CE4 01 00 04 24 li $a0, 1 # Bug CC liga
.text:004D2CE8 09 F8 20 03 jalr $t9 ; sub_4A2C58 # Mostra 'Enable CC' -- alterar para nop
.text:004D2CEC E0 AF 40 A2 sb $0, -0x5020($s2)
.text:004D2CF0 10 00 BC 8F lw $gp, 0x28+var_18($sp)
.text:004D2CF4 3C 97 99 8F la $t9, sub_4A2F18 # Mostra 'Show CC'
.text:004D2CF8 09 F8 20 03 jalr $t9 ; sub_4A2F18 # Mostra 'Show CC' -- alterar para nop
.text:004D2CFC 01 00 04 24 li $a0, 1
.text:004D2D70 01 00 04 24 li $a0, 1 # Bug CC liga
.text:004D2D74 18 97 99 8F la $t9, sub_4A2C58 # Mostra 'Enable CC'
.text:004D2D78 09 F8 20 03 jalr $t9 ; sub_4A2C58 # Mostra 'Enable CC' -- alterar para nop
.text:004D2D7C E0 AF 40 A2 sb $0, -0x5020($s2)
.text:004D2D80 10 00 BC 8F lw $gp, 0x28+var_18($sp)
.text:004D2D84 3C 97 99 8F la $t9, sub_4A2F18 # Mostra 'Show CC'
.text:004D2D88 09 F8 20 03 jalr $t9 ; sub_4A2F18 # Mostra 'Show CC' -- alterar para nop
.text:004D2D8C 01 00 04 24 li $a0, 1
.text:004D2E78 18 97 99 8F la $t9, sub_4A2C58 # Mostra 'Enable CC'
.text:004D2E7C 01 00 04 24 li $a0, 1 # Bug CC liga
.text:004D2E80 09 F8 20 03 jalr $t9 ; sub_4A2C58 # Mostra 'Enable CC' -- alterar para nop
.text:004D2E84 E0 AF 40 A2 sb $0, -0x5020($s2)
.text:004D2E88 10 00 BC 8F lw $gp, 0x28+var_18($sp)
.text:004D2E8C 01 00 04 24 li $a0, 1
.text:004D2E90 3C 97 99 8F la $t9, sub_4A2F18 # Mostra 'Show CC'
.text:004D2E94 09 F8 20 03 jalr $t9 ; sub_4A2F18 # Mostra 'Show CC' -- alterar para nop
.text:004D2E98 01 00 11 24 li $s1, 1
Com relação ao tamanho mínimo permitido para o HD, a rotina que calcula o espaço disponível é esta:
.text:004B2A98 sub_4B2A98: # CODE XREF: sub_4786EC+FC_p
.text:004B2A98 # sub_4D4C48+B58_p
.text:004B2A98 # DATA XREF: ...
.text:004B2A98
.text:004B2A98 var_18 = -0x18
.text:004B2A98 var_10 = -0x10
.text:004B2A98 var_C = -0xC
.text:004B2A98 var_8 = -8
.text:004B2A98
.text:004B2A98 71 00 1C 3C 18 D2 9C 27 la $gp, unk_70D218
.text:004B2AA0 21 E0 99 03 addu $gp, $t9
.text:004B2AA4 D8 FF BD 27 addiu $sp, -0x28
.text:004B2AA8 20 00 BF AF sw $ra, 0x28+var_8($sp)
.text:004B2AAC 10 00 BC AF sw $gp, 0x28+var_18($sp)
.text:004B2AB0 34 80 84 8F la $a0, aWarningUnknown # "Warning: unknown JFIF revision number %"...
.text:004B2AB4 70 8E 99 8F la $t9, sub_4B28A4
.text:004B2AB8 18 00 A5 27 addiu $a1, $sp, 0x28+var_10
.text:004B2ABC 1C 00 A6 27 addiu $a2, $sp, 0x28+var_C
.text:004B2AC0 09 F8 20 03 jalr $t9 ; sub_4B28A4
.text:004B2AC4 00 D6 84 24 addiu $a0, (aMntUsb - 0x690000) # "/mnt/usb"
.text:004B2AC8 10 00 BC 8F lw $gp, 0x28+var_18($sp)
.text:004B2ACC 18 00 A5 8F lw $a1, 0x28+var_10($sp)
.text:004B2AD0 1C 00 A6 8F lw $a2, 0x28+var_C($sp)
.text:004B2AD4 34 80 84 8F la $a0, aWarningUnknown # "Warning: unknown JFIF revision number %"...
.text:004B2AD8 30 8A 99 8F la $t9, sub_666260
.text:004B2ADC 82 2A 05 00 srl $a1, 10
.text:004B2AE0 82 32 06 00 srl $a2, 10
.text:004B2AE4 18 00 A5 AF sw $a1, 0x28+var_10($sp)
.text:004B2AE8 1C 00 A6 AF sw $a2, 0x28+var_C($sp)
.text:004B2AEC 09 F8 20 03 jalr $t9 ; sub_666260
.text:004B2AF0 8C 9E 84 24 addiu $a0, (aTotalDAvailD - 0x690000) # "\n>>> total = %d avail = %d \n"
.text:004B2AF4 18 00 A2 8F lw $v0, 0x28+var_10($sp)
.text:004B2AF8 10 00 BC 8F lw $gp, 0x28+var_18($sp)
.text:004B2AFC 20 00 BF 8F lw $ra, 0x28+var_8($sp)
.text:004B2B00 00 7D 42 2C sltiu $v0, 0x7D00
.text:004B2B04 08 00 E0 03 jr $ra
.text:004B2B08 28 00 BD 27 addiu $sp, 0x28
.text:004B2B08 # End of function sub_4B2A98
Vejam que no final temos
4B2B00 00 7D 42 2C sltiu $v0, 0x7D00. Isso é o mesmo que dividir o valor de $v0 por 0x7D00 = 32.000. Há duas chamadas para esse rotina: uma antes de começar uma gravação OTR e outra que eu acho que é antes de aceitar um agendamento de gravação. As mudanças estão explicadas nos comentários:
.text:004787E4 9C 8C 99 8F la $t9, sub_4B2A98 # verifica tamanho
.text:004787E8 09 F8 20 03 jalr $t9 ; sub_4B2A98 # verifica tamanho
.text:004787EC 00 00 00 00 nop
.text:004787F0 12 00 40 14 bnez $v0, loc_47883C # se não zero, limite de tamanho nao atingido (32G)
.text:004787F0 # mudar para nop ignora o tamanho
.text:004787F4 10 00 BC 8F lw $gp, 0x20+var_10($sp)
.text:004D579C 9C 8C 99 8F la $t9, sub_4B2A98 # verifica tamanho
.text:004D57A0 09 F8 20 03 jalr $t9 ; sub_4B2A98 # verifica tamanho
.text:004D57A4 00 00 00 00 nop
.text:004D57A8 56 00 40 14 bnez $v0, loc_4D5904 # se não zero, limite de tamanho nao atingido (32G)
.text:004787F0 # mudar para nop ignora o tamanho
.text:004D57AC 18 00 BC 8F lw $gp, 0xE8+var_D0($sp)
Por fim, apenas para indicar onde ocorreram as mudanças que já haviam sido explicadas para a versão 1.13.6:
- a rotina "pre-executa 8051 fp init" é a sub_4526A0;
- a rotina "executa 8051 fp init" é a sub_4DD3E8;
- a chamada à "executa onboard fp init", que deve ser alterada para iniciar o painel do "tijolão", está em 0x4006AC;
- em .got:00BBA4F foi incluído o endereço da "pre-executa 8051 fp init";
- e em .got:00BBA4E8 o apontamento foi de alterado de "executa onboard fp init" para "executa 8051 fp init".
A nova rotina para interpretar as teclas dos diversos controles começa em
sub_791250. Eu alterei levemente o início da rotina utilizada por mim na versão 1.13.6, apenas para incluir a checagem do código mestre do Semp, e acrescentei a rotina inteira de interpretação do controle remoto retirada do firmware daquele STB, a qual eu achei com ajuda dos códigos que o
rafael_netto me passou. É interessante notar que a rotina do Semp devolve os mesmos códigos de função e no mesmo registrador ($v0), o que facilitou o seu "transplante". Porém, a sua estrutura é arquitetada de um modo diferente, o que parece indicar que o compilador usado era de outra versão ou estava com alguma opção de otimização modificada. A chamada para esta minha rotina é feita em 0x43E144, onde originalmente havia o filtro para o código mestre do controle (que eu retirei).
À tarde eu disponibilizo os firmwares, tanto para o ZBT-633 como para o ZBT-620A "tijolão". Estou chamando de 1.14.4 "beta" porque ainda precisamos testar o controle do Semp e quero incluir o mini modo de desenvolvimento, que está quase pronto. Também gostaria de arrumar algumas strings mal traduzidas que deixaram no firmware original, como "Dispositivo do formato", que deveria ser "Formatando dispostivo".