Секреты UOC — инициализация

Теме UOC TDA93xx/TDA95xx посвящено немало книг, где авторы пытаются выдать инфу из даташита за сакральные знания, а вот о действительно настоящих секретах почему-то умалчивают.

Например, почему у телемастеров не всплывает вопрос: почему некоторые модели телевизоров на ИМС TDA9381 позволяют регулировать геометрию, хотя в даташите чётко написано, что для этого нужна как-минимум ИМС TDA9383. Почему обвязка UOC в таких телевизорах такая, как будто там установлена TDA9383, в частности конденсатор AVL? Почему в телевизорах с приёмником иногда устанавливают ИМС TDA9351, хотя для этого нужна ИМС семейства UOC+, т.е. ИМС 95ой серии? Как на TDA9350 сделать SECAM-телевизор или как на TDA9389 сделать телевизор PAL/SECAM, хотя «от рождения» там должен жить только NTSC?

Вопросов много, а вот ответ на них довольно прост: все ИМС семейства UOC имеют один и тот же кристалл видеопроцессора (Octava) — всё дело в начальной инициализации «секретного» регистра (boot-регистра) 🙂 Ведь не просто так NXP (ex.Philips) навязывают свой программный продукт GTV на базе которого разработчики должны делать свой софт: без него ни черта не получится. Самое обидное, что упоминания о такой необходимой операции, как инициализация нет нигде: ни в даташитах, ни в замечаниях по применению. Возможность UOC отключать шину Октавы от внешних выводов позволяет замаскировать процесс инициализации от внешнего трассировщика — грамотно сделано, однако.

Фирменном загрузчик через регистр TXT22 выковыривает информацию о конфигурации ИМС из памяти фонтов (адреса 9FEh…9FFh в CHARROM) и согласно своей внутренней таблице определяет, какое значение boot-регистра надо записать. Данные в ячейки CHARROM 9FEh…9FFh заносятся при изготовлении ИМС, согласно маркированному на ней типу (т.е. ИМС производится не совсем с чистой памятью), а вот фирменный загрузчик следит за тем, чтобы ИМС работала так, как она промаркирована. Почти однозначно определить тип ИМС можно считав 12ти разрядное значение по адресу 0BFEh в CHARROM, которое также программируется при производстве ИМС. «Секретный» конфигурационный регистр находится в регистровом пространстве Октавы по адресу 0FFh. Инициализацию Октавы желательно производить сразу после подачи на неё питания, иначе конфигурация не будет принята ИМС. Соответствие битов регистра фичам UOC было выяснено опытным путём; установка бита в ‘1’ активирует фичу, в ‘0’ — деактивирует, причём намертво: запись регулировочных значений бесполезна, такое чувство, что отключается часть ИМС, которая отвечает за функцию, управляемую битом
B.6 - QSS=1
B.5 - FMRadio=1
B.4 - EW=1/AVL=0
B.3 - AM=1
B.2 - SECAM=1
B.1 - NTSC=1
B.0 - PAL=1

Ниже приводится немного упрощённый код старта Октавы, используемый в нашем софте. Следует пояснить, что

STREG — массив IDATA из 5ти элементов, в него считываются 5 байт статуса, возвращаемые UOC,
VPREG — массив IDATA где хранятся все регистры UOC, номер элемента соотв.номеру регистра,
wrb_Octava — записывает данные R5 в регистр R7 Октавы,

wra_Octava — записывает все регистры Октавы (все VPREG ).

;______________________________________________________________
StartOctava:
; процедура старта Octav'ы
;  IN - нет
; OUT - C==1, если ошибка
; CHG - ALL(ex.DPTR)

BOOT_OCTAVA     EQU     07h     ; значение boot-регистра для TDA9351PS 

        mov     R2,#10h         ; количество повторов стартовой процедуры
stro_lp:
        mov     R6,#0FFh        ; кол-во чтений бита POR
stro_wtpon:
        lcall   Stop_I2CH0      ; освобождение шины
        lcall   rds_Octava      ; чтение статуса Octava
        jc      stro_ret        ; выход, если чтение неудачное
        mov     R0,#STREG+0     ; загрузка указателя на 1й байт статуса
        mov     A,@R0           ; загрузка 1го байта статуса
        jnb     ACC.7,stro_ponok; если бит POR==0, продолжение процедуры
        djnz    R6,stro_wtpon   ; старта, иначе - ожидание сброса Octav'ы
        setb    C               ; признак ошибки C==1
        sjmp    stro_ret        ; выход при ошибке
stro_ponok:
        mov     R6,#05h         ; всего будет 5 попыток бутировать Octav'у
stro_bootlp:
        mov     A,#BOOT_OCTAVA  ; значение для BOOT для UOC
        mov     R5,A            ; установка параметра
        mov     R7,#0FFh        ; BOOT-регистр
        lcall   wrb_Octava      ; запись конфигурации в BOOT-регистр
        jc      stro_rpt        ; повтор старта, если загрузка
                                ; конфигурации неудачна
        lcall   rds_Octava      ; чтение статуса Octava
        jc      stro_ret        ; выход, если чтение неудачное
        mov     R0,#STREG+3     ; установка указателя на STREG[3]
        mov     A,@R0           ; загрузка STREG[3]
        anl     A,#7Fh          ; выделение CFG-битов
        xrl     A,R5            ; сравнение заказанной и полученной CFG
        jz      stro_bootok     ; переход, если CFG совпала
        djnz    R6,stro_bootlp  ; закрытие цикла попыток установки CFG
stro_bootok:
        lcall   UpdateOctava    ; построение всех регистров Octav'ы
        mov     R0,#VPREG+24h   ; установка указателя на VPREG[24h]
        mov     A,@R0           ; загрузка VPREG[24h]
        orl     A,#04h          ; STB==1
        mov     R5,A            ; установка параметра в R5
        mov     R7,#24h         ; установка номера регистра
        lcall   wrb_Octava      ; запись STB==1, старт строчной развертки
        jc      stro_rpt        ; переход, если ошибка обмена
        lcall   wra_Octava      ; обновление всех регистров (all)
        jnc     stro_ret        ; переход, если обмен OK
stro_rpt:
        djnz    R2,stro_lp      ; закрытие цикла попыток старта Octav'ы
stro_ret:
        ret                     ; выход

В приведённом коде мы инициализируем ИМС TDA9351 — SECAM+NTSC+PAL. Если вдруг нам захотелось на этой ИМС сделать регулировки геометрии и FMRadio, надо просто поменять значение BOOT_OCTAVA на 37h. Этой информации вполне достаточно, чтобы сконфигурировать UOC по своему вкусу. Ниже приводится таблица соответствия значений boot-регистров некоторым типам UOC.

TDA9351PS/N2/x: ID = [9FF]&0Fh | (([9FE]>>2)&30h) = 15h
;
; ID | BOOT | DEVICE
; ---|------|--------------------------------------------------------------
; 00 | 00Bh | TDA9350/N1,TDA9360/N1,TDA9366/N1,TDA9380/N1
; 01 | 00Fh | TDA9351/N1,TDA9352/N1,TDA9361/N1,TDA9381/N1,TDA9382/N1
; 02 | 03Bh | TDA9362/N1,TDA9364/N1,TDA9383/N1,TDA9385/N1
; 03 | 03Fh | TDA9353/N1,TDA9355/N1,TDA9363,TDA9384/N1
; 04 | 07Fh | TDA9365/N1,TDA9386/N1,TDA9555H/N1
; 05 | 04Fh | TDA9367/N1
; 06 | 0FFh | TDA9391,TDA9395
; 07 | 00Ah | TDA9387/N1
; 08 | 03Ah | TDA9388/N1
; 09 | 023h | TDA9550PS/N1,TDA9560H/N1,TDA9580H/N1
; 0A | 027h | TDA9551H/N1,TDA9561PS/N1,TDA9581H/N1,TDA9551PS/N1
; 0B | 06Fh | TDA9552H/N1,TDA9567H/N1,TDA9567PS/N1,TDA9582H/N1,TDA9582PS/N1
; 0C | 033h | TDA9562H/N1,TDA9583H/N1,TDA9583PS/N1
; 0D | 037h | TDA9553H/N1,TDA9563PS/N1,TDA9584H/N1,TDA9584PS/N1
; 0E | 032h | TDA9569H/N1,TDA9588H/N1,TDA9588PS/N1
; 0F | 07Fh | TDA9565PS/N1,TDA9586H/N1,TDA9586PS/N1,TDA9590H/N1,
;    |      | TDA9590PS/N1,TDA9591H/N1,TDA9592H/N1,TDA9592PS/N1,
;    |      | TDA9593H/N1,TDA9593PS/N1,TDA9594H/N1,TDA9594PS/N1
; 10 | 04Fh | TDA9554PS/N1
; 11 | 07Bh | TDA9564H/N1,TDA9585H/N1,TDA9585PS/N1
; 12 | 06Bh | TDA9566H/N1,TDA9566PS/N1
; 13 | 022h | TDA9568H/N1,TDA9587H/N1,TDA9587PS/N1
; 14 | 003h | TDA9350PS/N2,TDA9360PS/N2
; 15 | 007h | TDA9351PS/N2,TDA9381PS/N2
; 16 | 017h | TDA9353PS/N2,TDA9363PS/N2,TDA9384PS/N2
; 17 | 013h | TDA9362PS/N2,TDA9383PS/N2
; 18 | 043h | TDA9366PS/N2
; 19 | 002h | TDA9387PS/N2
; 1A | 012h | TDA9388PS/N2
; 1B | 07Ah | TDA9589H/N1,TDA9589PS/N1
; 1C | 047h | TDA9352PS/N2,TDA9367PS/N2,TDA9382PS/N2
; 1D | 053h | TDA9364PS/N2,TDA9385PS/N2
; 1E | 05Fh | TDA9365PS/N2,TDA9386PS/N2
; ----------------------------------------
; TDA9351PS/N2/1 9FE=767h 9FF=F5h BFE=C0Bh
; TDA9351PS/N2/2 9FE=767h 9FF=F5h BFE=C0Ch
; TDA9351PS/N2/3 9FE=767h 9FF=F5h BFE=C0Dh
; ----------------------------------------
; TDA9353PS/N2/1 9FE=767h 9FF=2F6h BFE=C1Fh
; TDA9353PS/N2/2 9FE=767h 9FF=2F6h BFE=C20h
; TDA9353PS/N2/3 9FE=767h 9FF=2F6h BFE=C21h
; ----------------------------------------
; TDA9381PS/N2/0 9FE=765h 9FF=F5h BFE=D36h
; TDA9381PS/N2/1 9FE=765h 9FF=F5h BFE=D37h
; TDA9381PS/N2/2 9FE=765h 9FF=F5h BFE=D38h
; TDA9381PS/N2/3 9FE=765h 9FF=F5h BFE=D39h
; ----------------------------------------
; TDA9551PS/N1/1 9FE=727h 9FF=4FAh BFE=9FFh
; TDA9551PS/N1/2 9FE=727h 9FF=4FAh BFE=A00h
; TDA9551PS/N1/3 9FE=727h 9FF=4FAh BFE=A01h
; ----------------------------------------
; TDA9581PS/N1/1 9FE=725h 9FF=4FAh BFE=B2Bh
; TDA9581PS/N1/2 9FE=725h 9FF=4FAh BFE=B2Ch
; TDA9581PS/N1/3 9FE=725h 9FF=4FAh BFE=B2Dh