Сначала, спасибы ув.
Virtual-у, благодаря которому получилось разобраться с выводом символов на экран XDS8003D.
Теперь, все по-порядку...
Дисплей приставки управляется контролером
TM1668На просторах интернета доступны доки по ним
TM1668-ETC.pdf и
TM1668-Shenzhen.pdf , но к сожалению иероглифы читать сложно, хотя схемы там доходчиво разрисованы.
(Можно по аналогии глянуть из похожего контролера
TM1628english.pdf)
LED-дисплей в приставке XDS8003D такой:
- VDF | +
- VDF1.jpg (260.31 KiB) Viewed 13083 times
Задействованы все 10 цифирь (DIG), причем в последней задействованы 5 из 7 сегментов (на свободные 6 и 7 можно повесить управление светиками - на предыдущей схеме они дорисованы внизу. Об этом ниже).
Так как я закоротил дергалку питания, то красный светик теперь совсем не задействован.
Чтобы управлять синим и красным светодиодами через контролер, необходимо внести изменения на плате (но не обязательно, если не хотите этого делать)
- XDS8003D_Power_LED_Control | +
- XDS8003D_Power_LED_Control2.jpg (1.11 MiB) Viewed 13083 times
Теперь о выводе информации на экран.
Не буду сильно расписывать (у меня технически это плохо получится), но следует сказать, что в рассматриваемом способе, вывод осуществляется горизонтально для двух групп цифирь (DIG1-DIG8 и DIG9-DIG10), так как первые лежат по четной адресации, а вторые в нечетной.
На каждую цифирю (группу) от 1 до 7 команд по принципу, включил/выключил сегмент.
Последовательность очередности показана на рисунке (из документации)
- SEG_1668 | +
- SEG_1668.png (49.01 KiB) Viewed 13083 times
Для каждой цифири своя адресация, но команда влияет на всю строку.
Поэтому, действует принцип сложения.
На примере Первой группы (DIG1-DIG8)
в 3-ей цифири отобразил цифру 1
- | +
- #12345678
A00000000 ;$REG32 $VFDO 0x00C044;$REG32 $VFD_WRCTL 0x1370
B00100000 ;$REG32 $VFDO 0x08C244;$REG32 $VFD_WRCTL 0x1370
C00100000 ;$REG32 $VFDO 0x08C444;$REG32 $VFD_WRCTL 0x1370
D00000000 ;$REG32 $VFDO 0x00C644;$REG32 $VFD_WRCTL 0x1370
E00000000 ;$REG32 $VFDO 0x00C844;$REG32 $VFD_WRCTL 0x1370
F00000000 ;$REG32 $VFDO 0x00CA44;$REG32 $VFD_WRCTL 0x1370
G00000000 ;$REG32 $VFDO 0x00CC44;$REG32 $VFD_WRCTL 0x1370
в 4-ой цифири отобразил цифру 1
- | +
- #12345678
A00000000 ;$REG32 $VFDO 0x00C044;$REG32 $VFD_WRCTL 0x1370
B00010000 ;$REG32 $VFDO 0x10C244;$REG32 $VFD_WRCTL 0x1370
C00010000 ;$REG32 $VFDO 0x10C444;$REG32 $VFD_WRCTL 0x1370
D00000000 ;$REG32 $VFDO 0x00C644;$REG32 $VFD_WRCTL 0x1370
E00000000 ;$REG32 $VFDO 0x00C844;$REG32 $VFD_WRCTL 0x1370
F00000000 ;$REG32 $VFDO 0x00CA44;$REG32 $VFD_WRCTL 0x1370
G00000000 ;$REG32 $VFDO 0x00CC44;$REG32 $VFD_WRCTL 0x1370
теперь в 3-ей и 4-ой цифири отобразил цифру 1 (значения адресов складываются)
- | +
- #12345678
A00000000 ;$REG32 $VFDO 0x00C044;$REG32 $VFD_WRCTL 0x1370
B00110000 ;$REG32 $VFDO 0x18C244;$REG32 $VFD_WRCTL 0x1370
C00110000 ;$REG32 $VFDO 0x18C444;$REG32 $VFD_WRCTL 0x1370
D00000000 ;$REG32 $VFDO 0x00C644;$REG32 $VFD_WRCTL 0x1370
E00000000 ;$REG32 $VFDO 0x00C844;$REG32 $VFD_WRCTL 0x1370
F00000000 ;$REG32 $VFDO 0x00CA44;$REG32 $VFD_WRCTL 0x1370
G00000000 ;$REG32 $VFDO 0x00CC44;$REG32 $VFD_WRCTL 0x1370
Это самый простой пример с 2мя задействованными цифирями. Когда они задействуются все (8 в строке), то в уме уже не посчитаешь, нужен алгоритм...
Я переложил работу по вычислению (складыванию адресов) Excel'ю.
- VFD_XDS8003D | +
Файлик делал под Офисом 2003. Пришлось встроить в файл пару макросов по конвертации, поэтому чтобы расчеты работали, в безопасности по макросам (Сервис - Макросы - Безопасность) поставьте "Средний уровень безопасности", а при открытии файла разрешайте макросы...
Теперь от теории к применению.
Можете запустить PuTTY и поэкспериментировать...
Сначала упростим ввод адресов регистров (описано в шапке темы)
- Code: Select all
VFD_CTL=0xB8007200
VFD_WRCTL=0xB8007204
VFDO=0xB8007208
VFD_ARDCTL=0xB800720C
VFD_KPADLIE=0xB8007210
VFD_KPADHIE=0xB8007214
VFD_SWIE=0xB8007218
REG32="/usr/local/etc/mos/bin/gpio -n:p"
SEND4=0x00F0
SEND3=0x0070
SEND2=0x0030
SEND1=0x0010
D0=0x0
DF=0xFFFFFFFF
Теперь инициализация дисплея
- Code: Select all
#init
$REG32 $VFD_CTL
$REG32 $VFD_ARDCTL 0x00000630
$REG32 $VFD_KPADLIE 0x00000000
$REG32 $VFD_KPADHIE 0x00000000
$REG32 $VFD_SWIE 0x00000000
$REG32 $VFD_CTL 0x0000000D
Задаем яркость дисплея
- Code: Select all
#LED DRIVER TM1668 CONTROL
#for RTD1186DD
#
#SCANNING AND DISPLAY DIMMING
$REG32 $VFDO 0x00008F07;$REG32 $VFD_WRCTL 0x00001330
# ^ ^
# Яркость___________| | (7(выкл.) ; 8(мин.)...F(макс.)
# Кол-во сегментов____|
если а экране уже что-то выводилось (не в данной ситуации), то очищаем экран
- Code: Select all
#clear
#data setting command, normal operation, increament, write to display memory
$REG32 $VFDO 0xC040;$REG32 $VFD_WRCTL 0x00000330
$REG32 $VFDO $D0;$REG32 $VFD_WRCTL $SEND4
$REG32 $VFDO $D0;$REG32 $VFD_WRCTL $SEND4
$REG32 $VFDO $D0;$REG32 $VFD_WRCTL $SEND4
$REG32 $VFDO $D0;$REG32 $VFD_WRCTL 0x10f0
Теперь попробуем вывести торт
- Code: Select all
#data setting command, normal operation, NO increament, write to display memory
# 44 команда C0=(C0 + адрес )
#
#1
$REG32 $VFDO 0x02C044;$REG32 $VFD_WRCTL 0x1370
sleep 1
#2
$REG32 $VFDO 0x02C244;$REG32 $VFD_WRCTL 0x1370
sleep 1
#3
$REG32 $VFDO 0x02CA44;$REG32 $VFD_WRCTL 0x1370
sleep 1
#4
$REG32 $VFDO 0x02CC44;$REG32 $VFD_WRCTL 0x1370
sleep 1
#5
$REG32 $VFDO 0x02C644;$REG32 $VFD_WRCTL 0x1370
sleep 1
#6
$REG32 $VFDO 0x02C444;$REG32 $VFD_WRCTL 0x1370
sleep 1
#7
$REG32 $VFDO 0x02C844;$REG32 $VFD_WRCTL 0x1370
sleep 1
#8+#4, т.к. 8 из группы SPEC_LEFT и гасит #4
#$REG32 $VFDO 0x01CC44;$REG32 $VFD_WRCTL 0x1370
#$REG32 $VFDO 0x02CC44;$REG32 $VFD_WRCTL 0x1370
$REG32 $VFDO 0x03CC44;$REG32 $VFD_WRCTL 0x1370
sleep 1
если немного разобраться с тортом, то семь сегментов у него лежат в одной группе, а еще один лежит в предыдущей группе, поэтому, чтобы вывести этот сегмент, не затерев сегмент на этой же линии в соседней группе, применено сложение адресов.
Как и говорил, вывод информации на дисплей у себя делал через профиль aPower
- XDS8003D | +
Добавил в нем еще несколько групп, которые хотелось бы задействовать.
Некоторые мысли уже реализовал, некоторые еще нет.
Кроме имеющихся стандартно
start, stop, drive, net - хотелось бы добить еще несколько:
spindown_status - зажигать и тушить значок "Pause", когда хард(ы) засыпает(ют)/просыпается(ются)
ftp_status - выводить в первой цифири после "торта" букву "F", когда задействована передача данных по FTP
samba_status - выводить в первой цифири после "торта" букву "S", когда задействована передача данных по Samba
nfs_status - выводить в первой цифири после "торта" букву "N", когда задействована передача данных по NFS
(есть там попытка это сделать, но не работает)
Если кто готов помочь, буду благодарен...