UART на Ritmix RZX-50

Наш читатель Antony прислал замечательный материал — опыт подключения Ritmix RZX-50 через UART к настольному компьютеру. Что это такое, и зачем это нужно — расскажет он сам.

Аннотация:
в данной статье рассматривается доработка Ritmix RZX-50, обеспечивающая доступ пользователя к последовательному интерфейсу процессора JZ4755.

Статья может быть интересна разработчикам ПО для RZX-50.

Что такое UART и зачем он нужен?

Из житейского опыта понятно, что для связи компьютеров удобно использовать кабели с небольшим количеством проводников. Чем меньше проводников в кабеле тем, вероятно, кабель будет тоньше, легче, дешевле, ремонтопригоднее. Список достоинств можно продолжать. Однако внутри СБИС, как правило, информация передаётся в параллельном виде. UART’ы как раз и были разработаны для преобразования информации из параллельного представления в последовательное и обратно. UART — (Universal Asynchronous Receiver/Transmitter) — электронный узел, который преобразует данные, поступившие на его вход по параллельной шине (например, 8-разрядной) в последовательную форму. UART производит и обратную операцию — преобразует поступившие по последовательной шине данные в параллельную форму.
Для передачи преобразованных в последовательную форму данных могут использоваться различные стандарты: RS232C, RS422, RS485.
Наиболее распространённым UART’ом для ПЭВМ является NS16550А, работающий совместно с преобразователем уровней для RS232C.
Первые UART’ы появились в ранних ЭВМ (простейший преобразователь из параллельного кода в последовательный — сдвиговый регистр с возможностью параллельной загрузки данных). Скорости передачи данных в те времена были небольшие: единицы — десятки байт в секунду. Со временем они несколько возросли — NS16550А в ПЭВМ обычно поддерживает скорости передачи от 300 до 115200 бит/с.
Казалось бы, причём тут Ritmix RZX-50? Тут надо пояснить дополнительно. Последовательные интерфейсы RS232 оказались очень удобны для подключения терминала пользователя к ЭВМ. Действительно, используя только три провода RS232 (один провод для передачи от пользователя к ЭВМ, ещё один провод для передачи от пользователя к ЭВМ и ещё один, т. н. общий провод) можно организовать двусторонний обмен данными. Эпоха RS232-терминалов уже прошла, однако в некоторых областях, далёких от массового потребителя,старые методы работы остались. Дело в том, что программировать UART гораздо проще, чем другие устройства ввода-вывода. Поэтому UART широко используется в качестве устройства для взаимодействия с пользователям всякими программами начального пуска, работающими на процессоре до старта основной операционной системы.
Подобные программы, как правило, стартуют из небольшого ПЗУ, имеют небольшой размер и устроены крайне незатейливо — для них простота UART как нельзя кстати. Другое использование UART — выдача отладочной информации. Представьте, что вы занимаетесь переносом ядра ОС (например, ядра Linux) на новый процессор, а ядро упорно не желает стартовать, зависая в самом начале своей работы. В этой ситуации до инициализации каких-нибудь дисплейных драйверов дело даже не доходит, и вывести отладочную информацию просто некуда. Вот тут и помогает UART (в современных процессорах для встраиваемых применений он, как правило есть, и часто даже не один). Достаточно в самом начале отлаживаемой программы (в описываемом случае — ядра ОС) проинициализировать UART, т.е. выставить режим передачи и скорость обмена, после чего открывается возможность практически в любой момент отправлять через него символы, указывающие, какую часть своего жизненного пути уже прошла программа, помогая, таким образом, найти проблемный участок кода.
В RZX-50 используется микропроцессор JZ4755. В документе указано, что в процессор встроен один UART. Вывод UART’а процессора RZX-50 позволит получить доступ к загрузчику операционной системы U-Boot, а также к консоли Linux.

Что понадобится для работы?

  •  Ritmix RZX-50;
  •  часовые отвёртки;
  •  паяльные принадлежности;
  •  отрезок провода (сойдёт 1 метр МГТФ 1×0,2);
  •  преобразователь уровней RS232 <-> LV-TTL (или его заменитель); см. вот этот пример. Зачем нужен такой преобразователь описано ниже;
  • ПЭВМ с COM-портом или портом USB (в зависимости от используемого преобразователя уровней RS232 <-> LV-TTL).

Разборка

Вот краткая инструкция по разборке RZX-50:

  • из задней крышки необходимо извлечь четыре резиновые пробки,закрывающие головки винтов (это можно сделать маленькой плоской часовой отвёрткой);
  • отвернуть освободившиеся винты;
  • после того, как винты отвёрнуты, задняя крышка  держится только за счёт защёлок; необходимо её «оторвать». После снятия задней крышки нашему взгляду отрывается сторона печатной платы без смонтированных элементов, к которой приклеен аккумулятор.

В принципе тут можно прекратить демонтаж, пропустить раздел «Некоторые технические подробности» и сразу перейти к подсоединению проводов, о чём повествует раздел «Куда паяться?».

Некоторые технические подробности

Ниже, описано как опытным путём удалось определить места на плате, куда выведен UART процессора.
В спецификации на процессор имеется перечень выводов корпуса. Вот выводы, важные для UART:

Tаблица 1

обозначение номер ножки комментарий
UART1_RxD 28
UART1_TxD 33
VSS 21, 105, 144, 160 IO and CORE digital ground

В этой заметке предложен вариант разбора, при котором чёрная пластмассовая рамка, фиксирующая экран остаётся на месте а для доступа к смонтированным на плате микросхема предлагается отогнуть экран.Но, как видно по приведённым там же фотографиям рамка закрывает выводы процессора с 1го по 44й, затрудняя доступ к UART1_RxD и UART1_TxD. Планку придётся демонтировать. Вид платы с демонтированной рамкой представлен на рисунке 1.

рисунок 1 — по ту сторону экрана

На рисунке прекрасно видно JZ4755 с заботливо пронумерованными на плате выводами. Нас интересуют выводы 28 и 33 (см. таблицу 1). Подпаяться непосредственно к выводам процессора не тривиально. При помощи тестера несложно убедиться, что выводы 28 и 33 идут на другую сторону печатной платы, почти под самым процессором на самом краю платы гуманный разработчик разместил две контактные площадки. Паяться надо к ним (см. рисунок 2).
Отдельный восторг вызывает использование Micro-SDHC 4 класса в качестве загрузочного ПЗУ. На указанной карточке хранится как загрузчик, так и ядро ОС вместе с корневой файловой системой и приложениями пользователя.

Куда паяться?

Куда паяться ясно из рисунка 2 — две соблазнительные контактные площадки расположены на краю печатной платы.

рисунок 2 — куда паяться

Внимание! На рисунке указаны обозначения UART1_TXD и UART1_RXD так же как в документации на процессор. Т.е.

  • UART1_TXD — это тот провод, по которому JZ4755 «передаёт» данные;
  • UART1_RXD — это тот провод,  по которому JZ4755 «принимает» данные.

Внимание! На линиях UART1_TXD и UART1_RXD необходимо поддерживать уровни LV-TTL (грубо говоря, логическая единица +3,3 В, логический ноль 0 В). Непосредственное подсоединение линий UART1_TXD и UART1_RXD к соответствующим линиям COM-порта ПЭВМ невозможно: для интерфейса RS232 используются другие уровни сигналов (логическая единица −12 В, логический ноль +12 В). Для подключения к COM-порту необходимо использовать специальный согласующий преобразователь на базе микросхемы MAX232 или аналогичной.

Другой вариант — использовать устройство, подобное описанному на этой странице.
При подключении к ПЭВМ UART1_RXD соединить с передающим проводом ПЭВМ, а UART1_TXD с приёмным. Не забудьте также соединить «общие провода».

Примечание: на рисунке в качестве общего провода RS232 использован минус аккумулятора, хотя на плате есть немало альтернативных мест (см., например, таблицу 1).

Результаты доработки

Подключаем свежедоработанную RZX-50 к ПЭВМ через RS232. На ПЭВМ запускаем программу эмулятора терминала (minicom в Linux). Настраиваем эмулятор терминала на режим 57600 8N1 (т.е. скорость 57600 бит/с, 8 бит данные, один стоп-бит, без контроля чётности). Управление потоком должно быть отключено.

Включаем RZX-50. В эмуляторе терминала увидим следующее:

U-Boot 1.1.6-geca6e655-dirty (Aug 18 2011 - 20:41:34)

20:41:25 Board: Ingenic CETUS (CPU Speed 432 MHz)
pass
20:41:25 checkboard mv is 4074 read_count is 0
REG_RTC_HWFCR is 0xc80
printf_test_rtc
REG_RTC_RCR is 0xd9
REG_RTC_HWFCR is 0xc80
REG_RTC_HRCR is 0xfe0
REG_RTC_HSPR is 0x12345678
REG_RTC_HWCR is 0x0
REG_RTC_HWRSR is 0x22
REG_RTC_RSR is 0x90b6d4a4
REG_RTC_RSAR is 0xdcda3cd4
DRAM: 64 MB
Flash: 0 kB
Get bootloader message ...
get_bootloader_message:msc read
SD init ok
In handle_bootloader_command ... default ...

NORMAL Booting ...

SD init ok
*** Warning - MMC/SD first load, using default environment

In: serial
Out: serial
Err: serial
Net: No ethernet found.
Hit any key to stop autoboot: 0

MSC readSD init ok
3145728 bytes OK: protocol

## Booting image at 80600000 ...
Image Name: Linux-2.6.24.3L009-g40fe766b-dir
Image Type: MIPS Linux Kernel Image (gzip compressed)
Data Size: 1177155 Bytes = 1.1 MB
Load Address: 80010000
Entry Point: 801f0710
Verifying Checksum ... OK
Uncompressing Kernel Image ... OK

Starting kernel ...

Linux version 2.6.24.3L009-g40fe766b-dirty (carlos@carlos-ubuntu11) (gcc 
version 4.3.3 (GCC) ) #347 Thu Sep 8 20:21:33 CST 2011
CPU revision is: 2ed0024f (Ingenic JZRISC)
CPU clock: 432MHz, System clock: 144MHz, Peripheral clock: 144MHz, Memory 
clock: 144MHz
Umido L009 board setup Aug 19 2011 15:11:34
Determined physical RAM map:
memory: 04000000 @ 00000000 (usable)
User-defined physical RAM map:
memory: 04000000 @ 00000000 (usable)
Zone PFN ranges:
Normal 0 -> 16384
Movable zone start PFN for each node
early_node_map[1] active PFN ranges
0: 0 -> 16384
Built 1 zonelists in Zone order, mobility grouping off. Total pages: 16256
Kernel command line: mem=64M console=ttyS1,57600n8 ip=off rootfstype=ext3 
root=/dev/mmcblk0p1 ro
Primary instruction cache 16kB, VIPT, 4-way, linesize 32 bytes.
Primary data cache 16kB, 4-way, VIPT, no aliases, linesize 32 bytes
Synthesized clear page handler (25 instructions).
Synthesized copy page handler (44 instructions).
Synthesized TLB refill handler (20 instructions).
Synthesized TLB load handler fastpath (32 instructions).
Synthesized TLB store handler fastpath (32 instructions).
Synthesized TLB modify handler fastpath (31 instructions).
PID hash table entries: 256 (order: 8, 1024 bytes)
Console: colour dummy device 80x25
console [ttyS1] enabled
Dentry cache hash table entries: 8192 (order: 3, 32768 bytes)
Inode-cache hash table entries: 4096 (order: 2, 16384 bytes)
Memory: 62128k/65536k available (1940k kernel code, 3348k reserved, 
551k data, 132k init, 0k highmem)
Mount-cache hash table entries: 512
net_namespace: 64 bytes
NET: Registered protocol family 16
Total 16MB memory at 0x3000000 was reserved for IPU
Time: jz_clocksource clocksource has been installed.
Total 8MB memory1 at 0x1800000 was reserved for IPU
Power Management for JZ
===== verify ===== policy = ..
===== verify ===== policy = ..
CPU_FREQ: freq_target, policy = 0x810ed980, freq=432000, relation=0
new_index = 5
==== div_of_cclk=1 ====
divisors of I:S:P:M = 1:3:3:3
new frequency is 432000 KHz (REG_CPM_CPCCR:0x40612220)
io scheduler noop registered (default)
carlos tve: pllout2 = 432000000 plck is 22000000
LCDC: PixClock:22736842
FrameBuffer bpp = 16
In jz4750fb_deep_set_mode
fg0_frm_size = 0x3fc00
carlos tve: pllout2 = 432000000 plck is 22000000
LCDC: PixClock:22736842
Out jz4750fb_deep_set_mode
fb0: jz-lcd frame buffer device, using 1024K of video memory
kernel logo display thread start!
JzSOC: char device family.
JZ4740 SAR-ADC driver registered
UDC starting pnp monitor thread
Cable not in!
JZ UDC hotplug driver registered
init rda5807p
Virtual Driver of TCSM registered
Serial: 8250/16550 driver $Revision: 1.5 $ 4 ports, IRQ sharing disabled
serial8250: ttyS0 at MMIO 0x0 (irq = 9) is a 16550A
serial8250: ttyS2 at MMIO 0x0 (irq = 7) is a 16550A
RAMDISK driver initialized: 16 RAM disks of 4096K size 1024 blocksize
loop: module loaded
jz-gpio-keys: scan interval 20ms
input: JZ GPIO keys as /class/input/input0
===== verify ===== policy = ..
===== verify ===== policy = ..
CPU_FREQ: freq_target, policy = 0x810ed980, freq=432000, relation=0
new_index = 5
==== div_of_cclk=1 ====
divisors of I:S:P:M = 1:3:3:3
new frequency is 432000 KHz (REG_CPM_CPCCR:0x40612220)
: No card detect facilities available
mmc0: new high speed SDHC card at address b368
mmcblk0: mmc0:b368 NCard 3878912KiB
mmcblk0: p1 p2 p3 p4
JZ mmc0 driver registered
JZ mmc1 driver registered
register codec 801bbc1c
##### cleared codec reg6
JZ I2S OSS audio driver initialized
kjournald starting. Commit interval 5 seconds
EXT3-fs: mounted filesystem with ordered data mode.
VFS: Mounted root (ext3 filesystem) readonly.
Freeing unused kernel memory: 132k freed
mkdir: cannot create directory '/boot/local': Read-only file system
mkdir: cannot create directory '/usr/local/': No such file or directory
mkdir: cannot create directory '/usr/local/': No such file or directory
mkdir: cannot create directory '/usr/local/': No such file or directory
mkdir: cannot create directory '/usr/local/':kjournald starting. Commit 
interval 5 seconds
No such file or directoEXT3-fs: mounted filesystem with ordered data mode.
ry
mkdir: cannot create directory '/usr/local/': No such file or directory
mkdkjournald starting. Commit interval 5 seconds
ir: cannot create directEXT3-fs warning: maximal mount count reached, running 
e2fsck is recommended
ory '/usr/local/': No such file or directory
/etc/init.d/rcS: line 9: can't create /usr/local/etc/timezone: nonexistent 
directory
EXT3 FS on mmcblk0p3, internal journal
EXT3-fs: mounted filesystem with ordered data mode.
drivers/video/jz4750_lcd.c 3002 lcd_a320_flag is 0
CPU_FREQ: freq_target, policy = 0x810ed980, freq=432000, relation=0
new_index = 5
==== div_of_cclk=1 ====
divisors of I:S:P:M = 1:3:3:3
new frequency is 432000 KHz (REG_CPM_CPCCR:0x40612220)
$$$$$ val = 30, REG_17 = 0x95, REG_18 = 0x0a
CPU_FREQ: freq_target, policy = 0x810ed980, freq=144000, relation=0
new_index = 3
==== div_of_cclk=3 ====
divisors of I:S:P:M = 3:6:6:6
enter jz_init_boot_config
leave jz_init_boot_config
enter jz_scale_divisors...
--1---
--2---
--3---
--4---
leave jz_scale_divisors...
new frequency is 144000 KHz (REG_CPM_CPCCR:0x40614442)

Welcome to dingux
(none) login:

В ответ на запрос login пишем root и сразу попадаем в консоль Linux, где можем проверить тип нашего процессора и посмотреть командную строку ядра.

Welcome to dingux
(none) login: root
Dec 31 17:00:06 login[170]: root login on 'ttyS1'
test string....
# cat /proc/cpuinfo
system type : JZ4750D
processor : 0
cpu model : Ingenic JZRISC V4.15
BogoMIPS : 430.89
wait instruction : yes
microsecond timers : no
tlb_entries : 32
extra interrupt vector : yes
hardware watchpoint : yes
ASEs implemented :
shadow register sets : 1
VCED exceptions : not available
VCEI exceptions : not available

# cat /proc/cmdline
mem=64M console=ttyS1,57600n8 ip=off rootfstype=ext3 root=/dev/mmcblk0p1 ro
#

Наигравшись с командной строкой, выключаем RZX-50 при помощи штатного рычажка. При этом на эмуляторе терминала видим следующее:

--- 2 ---
poweroff wakeup
call user helper..!
Put CPU into hibernate mode.
 



Добавить комментарий

Комментарии доступны через Intensedebate. Включите JavaScript.