Análise técnica aprofundada do layout bidi RTL vs RTL2, modelação de tipos de letra, esquema de armazenamento e assinatura no firmware dos leitores de caneta B1 B2 F8 K7 KF1 L5 P2 Q6 Q8 T2 Y6.

Publicado em: dez 01, 2022 - 26 Visualizações

Arquitetura dos pacotes linguísticos RTL vs RTL2 nos leitores de caneta: como os sistemas de escrita da direita para a esquerda são implementados no firmware

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.

Engine footprint comparison (RTL vs RTL2)

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.

  1. Versão do motor — Abrir Definições → Sobre → Motor. Deve indicar RTL2-3.x em F8/K7/KF1/L5/Q6/Q8/T2/Y6. B1/B2/P2 podem mostrar RTL-2.x.
  2. 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.
  3. Teste Lam-Alef — Toque em "لا". Deve ser um único glifo com a linha de base correta, não dois sobrepostos.
  4. 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".
  5. 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.
  6. 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).

Language pack coverage per SKU (n = 11)

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 Direction em 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

Pedir Orçamento — Obtenha uma Resposta Rápida da Fábrica

Frequently Asked Questions

Quais modelos de canetas de leitura são enviados com o motor RTL2 bidi em 2026?
F8 (firmware 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) e Y6 (2.6.4) são enviados com RTL2 por defeito. B1, B2 (2.4.7) e P2 (2.0.3) continuam a ser enviados com o motor RTL legado porque a sua flash NOR de 4 MB e baterias de 700–800 mAh não suportam o motor de 852 KB mais o subconjunto de fontes WOFF2 de 1,12 MB sem eliminar uma ranhura de conteúdo.
Quanta flash consome cada pacote de idioma RTL2 numa caneta de leitura?
Um pacote de idioma RTL2 consome 1,97 MB na flash, dos quais 852 KB correspondem ao motor, 1,12 MB ao subconjunto de fontes WOFF2 em quatro tamanhos de corte (24\/32\/40\/56 px), 24 KB ao manifesto e à assinatura, e o espaço restante está reservado para patches de dicionário. O pacote RTL legado consome 0,54 MB no mesmo conteúdo.
Um distribuidor pode auto-assinar um pacote de idioma personalizado?
Não. Cada pacote de idioma é assinado por uma subchave Ed25519 com raiz no HSM da nossa fábrica, e o bootloader rejeita bundles não assinados 38 ms após a montagem. Os distribuidores podem solicitar uma subchave com âmbito regional por 480 $ (pagamento único), que lhes permite re-assinar atualizações de dicionário sem devolver o dispositivo à fábrica.
O motor RTL2 suporta dígitos arábico-índicos?
Sim. O utilizador pode alternar as formas dos dígitos por parágrafo através de Definições → Ecrã, escolhendo ASCII (0–9), arábico-índico (٠-٩) ou arábico-índico oriental (۰-۹). A escolha persiste por livro e é gravada nos metadados do livro OID para que uma criança nunca veja formas de dígitos misturadas dentro do mesmo título.
Qual é a taxa de falha do RTL2 vs RTL nos livros OID árabes enviados?
Em mais de 47.000 canetas enviadas e 86 versões de firmware desde 2023, as unidades RTL2 apresentam uma taxa de devolução em campo de 0,21% por qualquer defeito de renderização, enquanto as unidades RTL legadas apresentam 1,34%. A diferença é quase inteiramente motivada por formas contextuais em falta em títulos com muitos diacríticos, uma categoria que o RTL2 resolve através de shaping OpenType GSUB\/GPOS completo.
O seu carrinho
A sua experiência neste site será melhorada ao permitir cookies. Política de Cookies
Chat on WhatsApp