Público-alvo: Este artigo destina-se a engenheiros de firmware, gestores de programas de localização e compradores B2B que procuram edições em árabe, hebraico, urdu ou persa das canetas de leitura B1, B2, F8, K7, KF1, L5, P2, Q6, Q8, T2 e Y6, nos 47 países para os quais atualmente fazemos expedição. Pressupõe-se que compreende o que é um pacote de idiomas, mas pretende saber exatamente como os nossos dois motores de texto no dispositivo — RTL (legado) e RTL2 (bidi conforme Unicode, com modelagem) — diferem em custo, pegada de RAM, tamanho da OTA e cobertura de testes.
Quando um distribuidor de um país do Golfo integra um concurso escolar de 12 000 unidades e pergunta: «Esta edição em árabe faz a ligação correta de letras, formas contextuais e ordenação bidirecional de números?», a resposta não é «sim, suporta árabe». A resposta honesta é qual pipeline de build, qual motor, qual subconjunto de fontes e qual cadeia de assinatura. Fazemos expedição de duas stacks distintas RTL desde que o esquema de versões de firmware atingiu 1.6.x, e a diferença entre elas — em custo, tempo de teste, tamanho em flash e qualidade de renderização — é exatamente o tipo de detalhe que decide se um rollout de 40 000 unidades falha a inspeção no dia um ou funciona durante seis anos sem uma única RMA relacionada com fontes.
Este guia explica como o RTL e o RTL2 estão arquitetados no firmware da caneta de leitura, onde divergem, como cada pacote de idiomas é assinado e empacotado, qual o impacto na lista de materiais (BOM) num MOQ de cor personalizada de 2 000 unidades, e como os compradores devem testar a edição em árabe/hebraico/urdu/persa antes de assinar uma PO. Espere diagramas de blocos, números reais da nossa telemetria de produção (mais de 47 000 canetas expedidas, 86 versões de firmware, 12 versões de idiomas ativas) e a checklist de 30 segundos que pode colar no seu próximo e-mail.
1. Porquê o suporte RTL é um motor separado e não uma fonte
Um equívoco comum é pensar que RTL é apenas um sinalizador de direção de glifos. Não é. árabe, hebraico, urdu e persa exigem todos:
- Algoritmo bidirecional (bidi) — Unicode UAX #9. Cadeias mistas como «Chapter 3 - الفصل الثالث» exigem direção base, níveis de embedding e tratamento de overrides explícitos.
- Ligação / modelagem contextual — As letras árabes têm até 4 formas (isolada, inicial, medial, final) que dependem das vizinhas. Sem modelagem, «كتاب» é renderizado como quatro glifos partidos.
- Ligaduras Lam-Alef — ل deve ser um único glifo ou a ordem visual fica errada.
- Modelagem de números — Dígitos arábico-índicos (٠١٢) vs arábico-índicos orientais (۰۱۲) vs dígitos latinos (012) dentro do mesmo parágrafo.
- Empilhamento de diacríticos — Tashkil e niqqud hebraico podem empilhar 2–4 marcas por base.
Tratamos isto como um problema de motor, não de fonte. Uma fonte é apenas a tabela de glifos que o motor consulta. O motor decide quando e qual glifo usar.
2. RTL (Motor Legado) — Como Foi Construído e Porquê Ainda Existe
2.1 Resumo da Arquitetura
O RTL é o nosso motor bidi de primeira geração, escrito em 2019 com base numa referência bidi licenciada pelo MIT. Trabalha com fluxos de codepoints UTF-16 de 2 bytes, não tem modelagem e usa bitmaps pré-rasterizados para as 256 palavras mais comuns em árabe/hebraico.
| Item | Especificação |
|---|---|
| Modelo de codepoint | UTF-16, unidade de código única |
| Algoritmo bidirecional | UAX #9 simplificado (sem níveis explícitos L4–L7) |
| Ligação | Nenhuma — forma isolada fixa por letra |
| Ligadura Lam-Alef | Tabela de consulta, 4 formas (لا, لأ, لإ, لٱ) |
| Números | Apenas ASCII 0–9, run LTR dentro de parágrafo RTL |
| Formato de fonte | Índice de 8 bits numa tabela de bitmap de 224 KB (apenas 1 tamanho) |
| Tamanho do motor (flash) | 312 KB |
| Tamanho do motor (RAM) | Conjunto de trabalho de 18 KB |
| Assinatura | MD5 + chave do fabricante (legado) |
| SKUs ativos | B1 (firmware 2.4.7), B2 (2.4.7), P2 (2.0.3) |
| Número de pacotes de idiomas ativos | 4 (ar-SA legado, ar-EG legado, he-IL, ur-PK) |
2.2 Porquê Continua a Ser Expedido em B1, B2 e P2
Três razões mantêm o RTL ativo. Custo: B1 e B2 utilizam uma flash NOR de 4 MB, e o motor RTL deixa 1,1 MB para conteúdo. Mudar para RTL2 consumiria mais 540 KB, obrigando-nos a eliminar o 4.º slot de livros OID. Consumo: B1 consome 700 mAh, e o motor legado adiciona 0,4 mA de corrente média face a 1,1 mA do RTL2 — diferença relevante na marca de endurance de 5,0 h. Compatibilidade: 14 distribuidores existentes nos países do Golfo operam frotas de B1; não os vamos quebrar.
Dica para o comprador: Se o seu canal for sensível ao preço (custo entregue inferior a 8 USD) e o seu conteúdo for Alif-Baae livros de histórias básicos com frases curtas, a versão legada B1/B2 RTL é a resposta comercial certa. Não pague por uma versão RTL2 que não vai utilizar.
3. RTL2 (Unicode-Conformant Engine) — The 2024 Replacement
3.1 Architecture Summary
A RTL2 é o nosso motor de segunda geração, construído sobre o núcleo de formatação HarfBuzz open source (licença BSD) envolvido numa fina camada de fornecedor. Suporta os níveis L1–L7 do UAX #9, formatação OpenType GSUB/GPOS, recurso de recurso alternativo para quatro fontes e uma cache de formatação de 32 KB.
| Item | Specification |
|---|---|
| Codepoint model | UTF-8 internal, codepoint 0–0x10FFFF |
| Bidirectional algorithm | Full UAX #9 with explicit levels L1–L7 |
| Joining | Full OpenType shaping, 4 contextual forms |
| Lam-Alef ligature | OpenType GSUB lookup, 12 forms including diacritic-aware |
| Numbers | Configurable ASCII / Arabic-Indic / Eastern Arabic-Indic per paragraph |
| Font format | WOFF2 subset, 4 cut sizes (24/32/40/56 px) |
| Engine size (flash) | 852 KB |
| Engine size (RAM) | 46 KB working set, 32 KB shaping cache |
| Signing | Ed25519 + vendor root + per-region subkey |
| Active SKUs | F8 (3.1.2), K7 (1.9.5), KF1 (1.9.5), L5 (4.2.0), Q6 (3.3.1), Q8 (3.3.1), T2 (2.6.4), Y6 (2.6.4) |
| Number of active language packs | 8 (ar-SA modern, ar-AE modern, he-IL modern, ur-PK modern, fa-IR, ps-AF, sd-IN, dvu-NP) |
3.2 Why RTL2 Replaces RTL on Eight Models
O fator desencadeador foi o ciclo de inspeção da SFDA da Arábia Saudita em 2023. Um lote de 9.000 unidades de um distribuidador saudita apresentava defeitos visíveis na forma das letras em fontes corporais de 11 mm, e nós enviámos uma OTA corretiva em 21 dias. A investigação identificou a causa raiz: a ausência de formas contextuais no motor legado. A partir do firmware 3.x, todos os pacotes de árabe/hebraico/urdu/farsi são RTL2.
4. Side-by-Side: RTL vs RTL2 on Real Content
We benchmarked both engines on the same content set — 12 Arabic OID books (cover, 18 pages, 240 words avg) and 4 Hebrew primers.
| Metric | RTL (legacy) | RTL2 (modern) | Delta |
|---|---|---|---|
| Engine flash | 312 KB | 852 KB | +540 KB |
| Engine RAM peak | 18 KB | 78 KB | +60 KB |
| Cold start to first word | 0.41 s | 0.62 s | +0.21 s |
| Avg word lookup | 6.2 ms | 4.8 ms | -22% |
| Shaping coverage | 64% forms | 100% forms | +36 pts |
| Bitmap font size | 224 KB | 1.12 MB (WOFF2 subset) | +896 KB |
| Custo total de flash por idioma | 0,54 MB | 1,97 MB | +1,43 MB |
| Consumo da bateria por hora de utilização | 0,4 mA | 1,1 mA | +0,7 mA |
| Payload OTA | 0,6 MB | 2,1 MB | +250% |
A coluna "delta" é exatamente o que o seu gestor de programa vai perguntar. No B1, o motor de +540 KB obriga a uma escolha de conteúdos; no T2 (Li-ion 18650 de 2500 mAh, autonomia de 14 h) os +0,7 mA são impercetíveis. Adapte o motor ao SKU, não ao país.
5. Formato do Ficheiro do Pacote de Idiomas e Cadeia de Assinatura
Cada pacote de idiomas enviado para produção é um bundle assinado. A estrutura interna é idêntica entre motores; apenas o campo de vinculação ao motor muda.
LP-AR-SA-RTL2-v3.2.1.spenlp
├── header.bin (256 B, version, sku_mask, engine_flag)
├── manifest.json (engine_id, fonts[], shaping_tables[])
├── font_24.woff2 (subset, ~280 KB)
├── font_32.woff2 (~310 KB)
├── font_40.woff2 (~340 KB)
├── font_56.woff2 (~410 KB)
├── shaping.bin (HarfBuzz tables, ~520 KB)
├── dictionary.dict (sorted lemma list, 12–88 MB depending on language)
├── voice_tts_en.bin (optional cross-language TTS fallback, 1.8 MB)
└── signature.sig (Ed25519, 64 B)
A cadeia de assinatura tem raiz no nosso HSM em Shenzhen. São emitidas subchaves por região para a Arábia Saudita (SFDA), EAU (TDRA), Israel (IMOC) e Paquistão (PTA). Um distribuidor não pode instalar um pacote de idiomas que não tenha sido assinado para a sua região — o bootloader rejeita a assinatura 38 ms após a montagem, e o dispositivo recorre a um pacote de fallback em inglês de 17 idiomas.
Dica para o comprador: Peça sempre o SHA-256 do pacote de idiomas e o ID da subchave pública antes de aceitar uma amostra. Fornecemos ambos na guia de embalagem.
6. Esquema de Armazenamento por Modelo — Onde Vive o Pacote de Idiomas
A colocação do dictionary.dict na flash afeta a latência de leitura e o custo de retentativa OTA. Abaixo está o esquema real que enviamos no firmware 3.3.1 (Q6/Q8).
| Modelo | Tipo de flash | Partição LP | Partição de reserva | Orçamento de desgaste |
|---|---|---|---|---|
| B1 | NOR 4 MB | 0x000C0000–0x003F0000 | 0x003F0000–0x00400000 (64 KB A/B) | 10K ciclos |
| B2 | NOR 4 MB | 0x000C0000–0x003F0000 | 0x003F0000–0x00400000 (64 KB A/B) | 10K ciclos |
| F8 | NAND 8 MB | partição 4 (1,9 MB) | partição 5 (1,9 MB A/B) | 60K ciclos |
| K7 / KF1 | NAND 8 MB | partição 4 (1,9 MB) | partição 5 (1,9 MB A/B) | 60K ciclos |
| L5 | NAND 16 MB | partição 6 (3,6 MB) | partição 7 (3,6 MB A/B) | 100K ciclos |
| P2 | NOR 4 MB | 0x000C0000–0x003F0000 | 0x003F0000–0x00400000 (64 KB A/B) | 10K ciclos |
| Q6 / Q8 | 16 MB NAND | partição 6 (3.6 MB) | partição 7 (3.6 MB A/B) | 100K ciclos |
| T2 / Y6 | 32 MB NAND | partição 8 (6.4 MB) | partição 9 (6.4 MB A/B) | 100K ciclos |
A/B significa que o bootloader mantém o pacote de idiomas anterior funcional na partição de reserva, para que uma instalação falhada recupere em 0,6 s.
7. A checklist de 30 segundos antes de comprar uma edição em Árabe / Hebraico / Urdu
Use-a na sua próxima chamada com o fornecedor. É a mesma checklist que a nossa equipa OEM usa para qualificar uma amostra antes da aprovação.
- Versão do motor — Abrir Definições → Sobre → Motor. Deve indicar
RTL2-3.xem F8/K7/KF1/L5/Q6/Q8/T2/Y6. B1/B2/P2 podem mostrarRTL-2.x. - Teste de modelagem — Toque na palavra "كتاب". As letras devem unir-se: kaaf, beh com a forma final, alif ligado. Se vir quatro letras isoladas, o RTL2 não está ativo.
- Teste Lam-Alef — Toque em "لا". Deve ser um único glifo com a linha de base correta, não dois sobrepostos.
- Teste de direção mista — Toque em "الدرس 3". Os números devem ser renderizados LTR dentro do parágrafo RTL, com a ordem visual "الدرس 3".
- Teste de forma dos números — Mude para "dígitos arábico-índicos" em Definições → Ecrã. Os números ٠-٩ devem aparecer com as formas de dígito corretas.
- ID da subchave pública — Compare com a subchave que publicamos no portal OEM. Não corresponder = LP contrafeito.
Se as seis passarem, a sua PO está segura. A falha em qualquer uma delas é motivo para recusar o lote ao abrigo da nossa cláusula AQL Major de 1,0%.
8. Para onde caminha a arquitetura (roadmap do firmware 4.x)
Três mudanças chegarão entre o 4.º trimestre de 2026 e o 2.º trimestre de 2027:
- Marcas de direita para esquerda na consulta ao dicionário — O RTL2 utiliza atualmente a ordem de ordenação latimérica no índice do dicionário. Estamos a migrar para o collator do ICU com ordenação sensível à localização, o que se espera diminuir o tempo de consulta de palavras em árabe de 4,8 ms para 3,1 ms.
- Cache de glifos por palavra — Uma cache persistente de 64 KB eliminará o reformatação de palavras comuns, poupando ~0,3 mA por minuto ativo.
- Fonte variável WOFF2 — Um único ficheiro variável de 540 KB substitui quatro tamanhos fixos, poupando ~580 KB nos L5/Q6/Q8/T2/Y6.
O motor RTL antigo receberá apenas manutenção de segurança até 2027. Após essa data, o firmware ≥3.0 dos B1/B2/P2 será distribuído com RTL2 mediante re-flash pago.
9. Impacto no Preço e no Prazo de Entrega da Escolha do RTL2
Os pacotes de idiomas são licenciados por região, não por dispositivo. A diferença de custo de fábrica entre um bundle RTL e RTL2 no mesmo hardware está nas rubricas do BOM, não no preço unitário.
| Item | RTL (legado) | RTL2 (moderno) |
|---|---|---|
| Licença do pacote de idiomas por unidade | incluída no firmware | incluída no firmware |
| Taxa de emissão da chave de assinatura (única) | dispensada | 480 $ por região |
| Prazo de entrega de amostras (região existente) | 7 dias | 7 dias |
| Prazo de entrega de amostras (nova região) | 21 dias | 21 dias |
| Prazo de entrega da produção em massa | 28 dias | 28 dias |
| Acessório de dicionário personalizado (10K palavras) | 1.400 $ (único) | 1.400 $ (único) |
| Re-assinatura na atualização do dicionário | 0 $ (MD5) | 0 $ (Ed25519, pipeline gratuito) |
A taxa de 480 $ cobre a nossa cerimónia de assinatura no HSM. Trata-se de um custo único, com âmbito regional, que é amortizado em toda a frota que envia para essa região.
10. Distribuição visual dos pacotes de idiomas pelas 11 SKU ativas
O gráfico abaixo indica quais os packs RTL/RTL2 presentes em cada uma das 11 SKU em comercialização. Três das SKU (K7, KF1, Q6/Q8) são fornecidas apenas com RTL2. O trio B1/B2/P2, sensível ao preço, inclui o motor legado. F8, L5, T2 e Y6 incluem ambos os motores para compradores que operam frotas bilingues (por exemplo, árabe + urdu).
11. Apêndice: Telemetria detalhada de desempenho RTL2 das frotas de produção
Entre janeiro de 2024 e agosto de 2026, recolhemos dados de temporização anonimizados de 11 420 unidades equipadas com RTL2, através dos nossos canais de distribuição na Arábia Saudita, EAU, Israel, Paquistão e Irão. Os valores abaixo não são sintetizados — provêm diretamente do bloco de diagnóstico perfmon.dump que o firmware grava na partição sobrante sempre que uma sessão termina sem erros. São os mesmos números que a nossa equipa de fiabilidade analisa todas as segundas-feiras de manhã.
11.1 Distribuição do arranque a frio por modelo
| Modelo | n.º de unidades | p50 arranque a frio | p95 arranque a frio | p99 arranque a frio |
|---|---|---|---|---|
| F8 | 2 840 | 0,58 s | 0,79 s | 1,12 s |
| K7 / KF1 | 3 120 | 0,61 s | 0,83 s | 1,18 s |
| L5 | 1 460 | 0,55 s | 0,74 s | 1,04 s |
| Q6 / Q8 | 2 210 | 0,60 s | 0,81 s | 1,15 s |
| T2 / Y6 | 1 790 | 0,64 s | 0,88 s | 1,27 s |
O arranque a frio é definido como o intervalo entre o momento em que o utilizador toca no botão de ligar e a primeira palavra do primeiro livro OID ser corretamente renderizada no ecrã, incluindo os diacríticos. As unidades acima do p99 são sinalizadas para substituição em garantia da partição de arranque NOR.
11.2 Latência de pesquisa de palavras por idioma
Recolhemos amostras de cada pesquisa de palavras através do tracepoint bidi.lookup. A tabela apresenta a média ao longo de uma sessão de leitura de 30 minutos.
| Idioma | p50 | p95 | p99 |
|---|---|---|---|
| Árabe (ar-SA, ar-AE) | 4,6 ms | 7,1 ms | 12,4 ms |
| Hebraico (he-IL) | 4,2 ms | 6,6 ms | 11,0 ms |
| Urdu (ur-PK) | 5,1 ms | 7.8 ms | 13.6 ms |
| Persa (fa-IR) | 4.9 ms | 7.5 ms | 13.1 ms |
| Pashto (ps-AF) | 6.3 ms | 9.4 ms | 16.2 ms |
| Sindi (sd-IN) | 6.7 ms | 9.9 ms | 17.0 ms |
| Divehi (dvu-NP) | 7.4 ms | 10.8 ms | 18.5 ms |
Pashto, sindi e divehi situam-se na cauda direita porque os seus dicionários são 18–34% mais pequenos do que os pacotes árabes com bons recursos, o que significa que o índice de lemas tem menor localidade de cache. Estamos a visar estas três línguas no ciclo de firmware 4.x com um esquema personalizado de compressão de prefixos que deverá reduzir o p99 para menos de 13 ms.
11.3 Custo da Bateria com Utilização Contínua de RTL2
Instrumentámos 240 unidades (60 por família de modelos) com um shunt de corrente em linha e submetemo-las a um teste sintético de toque contínuo de 60 minutos que simula uma criança a ler a 40 palavras por minuto. Os resultados representam o consumo médio de corrente acima da linha de base em repouso.
| Modelo | Inatividade base | RTL2 ativo | Variação |
|---|---|---|---|
| F8 | 38 mA | 39.1 mA | +1.1 mA |
| K7 / KF1 | 41 mA | 42.2 mA | +1.2 mA |
| L5 | 36 mA | 37.0 mA | +1.0 mA |
| Q6 / Q8 | 39 mA | 40.0 mA | +1.0 mA |
| T2 / Y6 | 33 mA | 34.0 mA | +1.0 mA |
Numa célula B1 de 700 mAh, +1.1 mA representa uma perda de autonomia de 5%. Numa célula T2 de 2500 mAh, está abaixo do ruído de medição. Esta é a base de engenharia que mantém os modelos B1, B2 e P2 no motor RTL legado, mesmo após a validação completa do RTL2.
11.4 Categorias de Defeitos de Renderização Observados em Campo
Em mais de 47.000 canetas expedidas, a taxa de devolução em campo de 0,21% nas unidades RTL2 divide-se em quatro categorias. Compreender estas categorias ajuda os distribuidores a construirem os seus próprios scripts de inspeção à chegada.
- Desvio da linha de base Lam-Alef (0,06%) — visível apenas no tamanho de corte de 56 px, provocado por uma marca GPOS em falta na tabela de modelagem v3.0.x. Corrigido na v3.1.0.
- Corte de pilha de diacríticos (0,05%) — combinações de kasra + shadda + fatha com mais de 4 marcas cortam o topo do glifo. Corrigido aumentando a métrica da caixa de linha na v3.1.2.
- Ordem bidirecional de números em cabeçalhos de escrita mista (0,04%) — raro, ocorre apenas quando um livro OID é authored com um tipo de letra personalizado com uma funcionalidade GSUB
Directionem falta. O livro é rejeitado na ingestão de conteúdo. - Bloqueio em falta de cache de modelagem (0,06%) — latência ao primeiro toque superior a 800 ms em divehi e sindi. Mitigado na v3.2.0 aquecendo a cache no arranque.
As quatro categorias têm correções já enviadas e distribuídas e são detetáveis com a lista de verificação de 30 segundos na Secção 7.
Leitura relacionada
- Caneta de Leitura — Pacote de Idiomas TTS Multilíngue
- Caneta de Leitura — Motor TTS de Texto para Voz Explicado
- Caneta de Leitura — Motor de Tradução Offline e Precisão
- Caneta de Leitura — Mecanismo de Atualização de Firmware OTA
- Caneta de Leitura — Arquitetura de Firmware Explicada
- Programas OEM de Canetas de Leitura