Wysłany: 14 Mar 2004 21:26 Programowanie AMR, DSP, COBBA i obsługa HW/SW w DCT3
W związku z notorycznym brakiem czasu na dokończenie tutoriala Repair DCT3... Przedstawię garść informacji które mogą się przydać userom zaawansowanym w modyfikacjach SW w modelach DCT3...
Wszystkie opisywane informacje w niniejszym dokumencie dotyczą modelu 33XX.
Podziękowania dla: Exitusa, g3ggO, petera Hanzela, AlexD, TechTron, NokRev, Tomasa, Marcina Wiącka i innych osób, które brały udział w projekcie Blacksphere , jak też dla tych, którzy wspomogli mnie w opracowaniu tych informacji.
W dniu dzisiejszym zaczniemy od mapy pamięci obszaru I/O MADa...
I/O zakres (00020000-000200FF)
Adres / długość / zawartość
(Zapis/Odczyt)
00 1 [CTSI] DCT3 ASIC version Primary hardware version
- identyfikacja wersji HW telefonu
(O) 00001111 Revision
(O) 11110000 Version
01 1 [CTSI] MCU reset control register
- rejestr stanu oraz sterowania zerowaniem SW
(O) 00000001 Enabled after powerup (powód:wyłączenie zasilania)
(O) 00000010 Last reset was by watchdog (powod:watchdog)
(Z/O) 00000100 SW reset (zerowanie)
02 1 [CTSI] DSP reset control register
- rejestr stanu i zerowania DSP
(Z/O) 00000001 Enable DSP (włączenie DSP, 0=OFF)
(Z/O) 00000010 Enabled after setup in task (0=gdy ostatnie zadanie spowodowało reset DSP)
03 1 [CTSI] ASIC watchdog write register Load the ASIC watchdog timer with a certain number of seconds.
- rejestr watchdoga, gdy osiągnie zero, powoduje wywołanie funkcji SW reset
(Z) 0xFF disables the dog (wyłączenie watchdoga)
04 2 [CTSI] Sleep clock counter Reads the current value of the 16 bit timer.
(O) - 16 bitowy licznik zegara czasu rzeczywistego (SLEEP MODE) w CONNT
0C 1 [CTSI] Interrupt control register
(Z/O) - zarządzanie przerwaniami
00000001 Global FIQ enable
00000010 Global FIQ disable
00000100 Global IRQ enable
00001000 Global IRQ disable
00100000 IRQ 8 line active
01000000 IRQ 8 mask
0D 1 [CTSI] Clock control register Controls the various clock lines in the system
(Z/O) - rejestr sterujący zegarem systemowym
00000001 ARM clock
00000010 sleep clock (power OFF)
00000100 GENSIO clock (must be enabled for CCont and LCD) (oparty na odświerzaniu LCD)
00001000 Enabled in firmware init - reason unknown (zegar programowy)
00100000 SIM clock
01000000 SIM (programowy, sterowany z SIM)
0E 1 [CTSI] Interrupt trigger register The lines that trigger IRQ5 and IRQ6
- rejestr monitorujący przerwanie IRQ5 i IRQ6
(O) 00000001 IRQ 5
(O) 00000010 IRQ 6
0F 1 [CTSI] Programmable timer clock divider
- programowany dzielnik licznika zegara systemowego
(O) - nastawa dzielnika
(Z) - maksymalna wartość licznika zegara (zegar dzielony przez tą wartość +1)
10 2 [CTSI] Programmable timer counter Reads the current value of the 16 bit programmable timer
(O) - wartość licznika zegara (drugi odczyt licznika, przed jego przeładowaniem nie uaktualnia tej komórki)
12 2 [CTSI] Programmable timer destination When the 16 bit programmable timer (above) reaches this value, the programmable timer interrupt is generated.
(Z/O) - rejestr ustawiający wartość licznika po której nastąpi przeładowanie
19 1 [PUP] MBUS status
- sterowanie sprzętowe transmisją
(Z/O) 00000111 Number of bits transmitted/received (rejestr szeregowy-numer bitu na lini)
(O) 00010000 MBUS send ready (gotowość do nadawania)
(O) 00100000 MBUS receive byte available (odebrano bajt danych)
(O) 01000000 txd bit ready (flasher) = SCL = FBUS_RX (taktowanie w trybie flash)
(Z/O) 10000000 txd bit (flasher) = Serial data out = FBUS_TX
1A 1 [PUP] MBUS RX/TX Bytes are sent to and received from the line in this register.
(Z/O) - bufor transmisji
1C 1 [PUP] Buzzer clock divider Buzzing frequency is 13000000/div
(Z) - rejestr dzielnika buzerra
1E 1 [PUP] Buzzer volume
(Z) - poziom głośności buzerra
20 1 [PUP] McuGenIO signal lines (0=low 1=high)
- linie sygnałowe MCU_GEN I/O
(Z/O) 00000001 CCUT (EM)
(O) 00000110 Numer wersji MADa
(Z/O) 00001000 LCD leds on/off
(Z/O) 00010000 CHARLIM (EM)
22 1 [PUP] DSP Fbus Mode
- sterowanie trybem rozszerzonym komunikacji Fbus via DSP
(Z/O) 00100000 DSP mode (włączenie rozszerzenia komend 0x40 i sub 0x80 - zaleca się nie korzystać)
24 1 [PUP] McuGenIO I/O direction
(Z/O) - ustawianie kierunku portu MCU_GEN (0=wejście/1=wyjście)
2A 1 [UIF/KBGPIO] Keyboard COL signal lines
(Z/O) - sterowanie sygnałem COL klawiatury (0=niski/1=wysoki)
2B 1 [UIF/KBGPIO] Keyboard COL
(Z/O) - rejestr powtórzony (zaleca się nieużywać)
2C 1 [UIF/GENSIO] CCont write
(Z) - linia Tx danych do CCONT
2D 1 [UIF/GENSIO] GENSIO start transaction
(Z) 00100101 (0x25)włączenie nadawania do CCONT lub LCD (przy włączonej tranmisji, przejście CCONT w tryb pracy SHUT_DOWN, powoduje zawieszenie SW)
(Z) 00011111 Serial clock speed divisor (dzielnik zegara transmisji, 0x00=fast (60Mb/s) - 0x1f=slow (950kb/s)
(Z) 00100000 Select/enable (wyłączenie reakcji CCONT i LCD na komendy - nigdy nie wyłączać!)
2E 1 [UIF/GENSIO] LCD data write
(Z) - linia Tx danych do LCD
32 1 [UIF] CTRL I/O 2
- rejestr kontrolny nr. 2
(Z/O) 00100000 Reset LCD (FraCtrl) (zerowanie LCD 0=reset 1=włączony)
(Z/O) 10000000 Another really cool and fluffy output bit
6A 1 [UIF/KBGPIO] Keyboard COL 2
(Z/O) - linie COL klawiatury
6B 1 [UIF/KBGPIO] Keyboard COL interrupt
(Z/O) - sterowanie przerwaniami z lini COL (1=maskowanie)
6C 1 [UIF/GENSIO] CCont read
(O) - odczyt danych z CONNT
6D 1 [UIF/GENSIO] GENSIO status
- rejestr statusu portu GENS_I/O
(O) 00000001 Ready for data write (gotowość do zapisu)
(O) 00000010 Ready for transaction (gotowość wykrywania kolizji)
(O) 00000100 Ready for data read (gotowość do czytania)
6F 1 [UIF/GENSIO] GENSIO (3/SELECT1)
(Z/O) - port I/O
AA 1 [UIF/KBGPIO] Keyboard COL I/O direction
(Z/O) - sterowanie przepływem lini COL klawiatury (0=wejście 1=wyjście)
AB 1 [UIF/KBGPIO] Keyboard COL 3
(Z/O) - linia COL3 klawiatury
AD 1 [UIF/GENSIO] GENSIO (1/SELECT2)
- port GENS_I/O 1 (wybrany jako drugi)
AE 1 [UIF/GENSIO] GENSIO (2/SELECT2)
- port GENS_I/O 2 (wybrany jako drugi)
AF 1 [UIF/GENSIO] GENSIO (3/SELECT2)
- port GENS_I/O 3 (wybrany jako drugi)
B0 1 [UIF] CTRL I/O 0 direction (2) See port 0x30
B1 1 [UIF] CTRL I/O 1 direction (2) See port 0x31
B2 1 [UIF] CTRL I/O 2 direction (2) See port 0x32
B3 1 [UIF] CTRL I/O 3 direction (2) See port 0x33
ED 1 [UIF/GENSIO] GENSIO (1/SELECT3)
- port GENS_I/O 1 (wybrany jako trzeci)
EE 1 [UIF/GENSIO] GENSIO (2/SELECT3)
- port GENS_I/O 2 (wybrany jako trzeci)
EF 1 [UIF/GENSIO] GENSIO (3/SELECT3)
- port GENS_I/O 3 (wybrany jako trzeci)
F0 1 [UIF] CTRL I/O 0 input (0x30)
(O) - wejście portu sterującego 0 (porty pracują w trybie bitowym)
F1 1 [UIF] CTRL I/O 1 input (0x31)
(O) - wejście portu sterującego 1
F2 1 [UIF] CTRL I/O 2 input (0x32)
(O) - wejście portu sterującego 2
F3 1 [UIF] CTRL I/O 3 input (0x33)
(O) - wejście portu sterującego 3
Przerwania:
W modelach 331x występują następujące przerwania:
- FIQ (DSP control)
- IRQ (przerwania maskowalne MADa)
- ICCONT (przerwania CCONTa)
FIQ:
FIQ 8ct_timer (przerwanie timera EM i DEVIO)
FIQ 7SIMCardDetX (wyjęcie baterii)
FIQ 6SIM UART (przerwanie z portu SIM)
FIQ 5I/O 0x04 FIQ 4timer (programowany timer)
FIQ 3MBUS TxD (gotowość)
FIQ 2MBUS RxD (gotowość)
FIQ 1MDISND (pusta kolejka)
FIQ 0MDIRCV (nowe dane na stosie)
IRQ:
IRQ 8NOP (No Operation - disables itself)
IRQ 7NOP (No Operation)
IRQ 6HEADDET (detekcja zestawu słuchawkowego)
IRQ 5HOOKDET (detekcja zestawu głośnomówiącego)
IRQ 4DSP (żądanie dostępu do zasobów)
IRQ 3Wake up from sleep (pobudka z uśpienia)
IRQ 2CContINT (inicjalizacja CCONTa)
IRQ 1 NOP[/color]
IRQ 0Keyboard (przerwanie od klawiatury)
CContInt:
INT 3CHARGER (ładowanie)
INT 4RTC-SEC (przerwania od zegara)
INT 5RTC-MIN INT 6RTC-DAY INT 7RTC-ALR (przerwanie od alarmu)
Mapa pamięci MCU:
000000000000FFFFRAM (= 00100000-0010FFFF)
0001000000010FFFDSP shared memory 00020000000200FFIO (Primary I/O range, configures peripherals)
0003000000030001DSPIF (API control register)
0004000000040003MCUIF (Secondary I/O range, configures memory ranges)
001000000011FFFFRAM 00200000003FFFFFFlash ROM 00400000005FFFFFFlash ROM 2 (=00200000-003FFFFF if flash only 2MB)
00600000007FFFFFExternal ROM/RAM; empty (0x00)
.................................................................................................................................
Mapa pamięci DSP
Adres...... Program ....... Data
0000
............. Reserved ....... MMR
0060
............. Reserved ....... Scratch pad RAM
0080
............. DARAM 0 ....... DARAM 0
0800
............. DARAM 1 ....... DARAM 1 - (AMR accessible)
1000
............. DARAM 2 ....... DARAM 2
2000
............. Program ........ DARAM 2
............. ROM
4000
............. Program ........ Reserved
............. ROM
B000
............. Program ........ Data ROM
............. ROM
F000
............. Program ........ Program
............. ROM .............. ROM (mirror)
FFFF
MCUIF (40000-40003)
DSP komunikuje się z pamięcią oraz jednostką stałoprzecinkową za pomocą magistrali BusC.
Magistrala ta realizuje:
konfigurowanie pamięci
dekodowanie i wybór układu
Programowe regulowanie czasu oczekiwania (busy wait cycle)
sterowanie szyną danych (8/16 bitów)
Zerowanie Pamięci (on reset) 0x7F 0x0F 0x?? 0xC3
Timer 1: (taktujący)
I/O 0x04 (halfword) odczyt aktualnej wartości
(zegar taktowany jest częstotliwością 1057 Hz; wartość 0x7FFF powoduje wyzwolenie przerwania)
ASIC watchdog timer
I/O 0x03 (byte) Czas pętli w sekundach. Wartość 0xFF wyłącza watchdoga. Dojście licznika do zera powoduje reset MADa
CCont watchdog timer
CCont 0x05 - Czas pętli w sekundach. Wartość 0x3F wyłącza watchdoga. Dojście licznika do zera powoduje uruchomienie procedury Turned OFF
Do edycji kodu pod ASMa DCT3, używamy kompilatora z C o nazwie GCC (ostatnia wersja 3.3) najlepiej wersja 2.14, gdyż nowa nie zawiera bibliotek "binutils" z konfiguracjami dla DCT3. (wersja dla linuxa)
Nasz MAD2PR a właściwie Texas Instruments TMS320C54x wymaga biblioteki "binutils tic54x" w której zawarte są też dane dla COBBA i HAGARa.
Budowa MADa:
MAD ma wbudowaną pamięć ROM o wielkości 48kB - bez możliwości flashowania, w której znajduje się procedura boot DSP.
Oprócz tego jest normalnym kontrolerem zawierającym porty I/O port (pa0..paXXX), timery, kontroler przerwań, UARTs i system kolejkowania.
No i najważniejsze...w MADa został wbudowany 32 bitowy procesor DSP (digital signal procesor).
Standartowo po resecie, wszystkie przerwania są nieaktywne, poza IRQ 4 , które jest aktywizowane sprzętowo.
# BSCR (Bank Switching Control Register)
orm #0x0008,*(0x29)
andm #0xFFF7,*(0x29)
Inicjalizacja DSP odbywa się poprzez wspomnianą pamięć 48kB ROM...w wszystkich 3310,3330 oraz 3410 znajduje się ta sama wersja ROM : B60.6.756
Ponieważ nie ma możliwości flashowania pamięci ROM w której zaszyte są procedury DSP, stworzono możliwość uaktualnienia oprogramowania, poprzez użycie pamięci współdzielonej przez MADa i DSP.
Do tego celu używa się protokołu CodeBlock niekompatybilnego z MDI
Nie możesz pisać nowych tematów Nie możesz odpowiadać w tematach Nie możesz zmieniać swoich postów Nie możesz usuwać swoich postów Nie możesz głosować w ankietach Nie możesz załączać plików na tym forum Nie możesz ściągać załączników na tym forum