Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.05.2016, 15:59   #1
serg8825
 
Регистрация: 07.05.2016
Сообщений: 3
По умолчанию быстрый опрос LPT порта

Небольша вводная - есть программа для прошивки микрух PonyProg, есть пограмматор подключаемый к LPT порту (фактически это переходник, там одна буферная микросхема внутри и шлейф, схема легко ищется по запросу STK200, STK300). Чтоб не плодить сущности, я стараюсь использовать этот переходник вообще в разных целях, с помощью него прошивал SPI флеш и PIC когда нужно было. В принципе можно забыть что у меня есть этот переходник и представить что мы пытаемся дергать выводами LPT порта. Задачка школьная, как если бы мы хотели поморгать светодиодами подключенными к LPT.

Попробуем организовать программный SPI протокол, используя линии
LPT D4 -----> Clk
LPT D5 -----> MOSI
LPT Ack <---- MISO
например мне это нужно для программирования какой-нибудь экзотической микросхемы по SPI, есть даташит на нее с описанием команд какие она переваривает, но нет софта.


Вспомним суть последовательного обмена по SPI
Для передачи бита данных нужно:
1 опустить CLK
2 Выдать бит на MOSI
3 подождать. в это время ведомое устройство увидит что упал CLK и выдаст бит на линию MISO. задержка нужна чтоб ведомое устройство успело это сделать.
4 считать бит с MISO
5 поднять CLK
6 подождать. в это время ведомое устройство увидит что поднялся CLK и прочитает бит на с линии MOSI которые мы выставили в пункте 2. задержка нужна чтоб ведомое устройство успело это сделать.

И так восемь раз. Предварительно выводимый байт данных надо попилить на биты, а принятые биты склеить в байт. Если не рассматривать этот процесс резания-сдвигания-склеивания, и исключить задержки, то в сухом остатке передача байта по SPI может выглядеть так:


mov ecx,1024*1024 ; милион

lab1: mov bl,8
; передача бита по SPI:
lab2: mov dx,378h ; базовый адрес порта
out dx,al ; роняем CLK D4 и устанавливаем данные D5
mov dx,379h
in al,dx ; читаем данные ACK
mov dx,378h
out dx,al ; поднимаем CLK D4

dec bl ; повторяем 8 раз, передается один байт
jnz lab2

dec ecx
jnz lab1 ; повторяем мильен раз, передается один мегабайт

напомню, что это упрощенная модель передачи из двенадцати процессорных команд. осмысленные данные не подготавливаются должным образом и не сохраняются, через порт мы прокачиваем мусор.
Нам важна суть процесса и его скорость.

так вот этот код скомпилированный в COM файл в DOS выполняется кошмарно долго, 31 секунду. То есть восемь мегабайт мы будем прокачивать четыре минуты.

В то же время PonyProg считывает восемь мегабайт за пять (!) секунд и похоже это не предел.

Как достичь таких же скоростей ? Открыть LPT как файл под виндовс и вкачать в него данные, рассчитывая что все будет работать через DMI - можно, но безсмысленно. мне же нужно в промежутках между посылкой битов D4 D5 опрашивать линию ACK. У меня даже идеи не возникает как PonyProg это делает. Есть у кого-нибудь идеи ?

все упирается в последовательность

out dx,al
in al,dx
out dx,al

которая работает неприемлимо долго, что под DOS что под Windosw/
А упрощать ее дальше некуда.

PonyProg в пятьдесят раз быстрее прокачивает данные, используя тот же LPT порт и те же линии D4 D5 ACK, и похоже это не предел. В программе есть пункт "калибровка" в зависимости от скорости ПК.

Должен быть другой способ изменить D4 D5 и опросить Ack - какой ?
serg8825 вне форума Ответить с цитированием
Старый 07.05.2016, 17:54   #2
kutani
Форумчанин
 
Регистрация: 23.01.2016
Сообщений: 608
По умолчанию

Под виндами с LPT - разве что через DeviceIOControl() http://rsdn.ru/?article/baseserv/directhard.xml. Либо не мучить код и работать через готовый драйвер прямого доступа, например есть обертка inpout32.dll/inpout64.dll. С шаговиками проблем не было. Да даже с I2C интерфейсом, который более требовательный:
Код:
port:=$378; //номер LPT порта LPT1=378H
data:=$00; 
out32(port,data);
...

Function i2c_del:byte; //функция программной задержки, если что подправляйте для своего ПК
  var tc: integer; begin tc:=0; while tc<10000 do begin inc(tc); end; i2c_del:=0; end;

Function lm_byte:boolean; //передача байта DATA в мс по LPT интерфейсу
  begin
    i:=0;
    while i<=7 do
    begin
    if (data and st(i))=st(i) then  //если бит (i) в байте data равен "1"
      begin
        Out32(Port, $04+$02); i2c_del; Out32(Port, $04+$03);i2c_del; Out32(port,$04+$02); i2c_del;
      end
    else   //если бит (i) в байте data равен "0"
      begin
        Out32(Port, $04+$00); i2c_del; Out32(Port, $04+$01);i2c_del;Out32(port,$04+$00); i2c_del;
      end;
    inc(i);
    end;
    lm_byte:=true;
  end;


function link:boolean; //загрузка трех байт HI,LO,SYS
  begin
  data:=$04;  out32(port,data); i2c_del;  //начало обмена - "1" на выводе CE
  hi:=round(int(f/25/256)); //hi - вычисляем старший байт частоты (f)
  lo:=round(int(f/25)-hi*256);  //lo - вычисляем младший байт частоты (f)
  //Максимальное значение HI_L0(загружаемое в LM7001 - не более 16000!
  data:=lo; lm_byte; data:=hi; lm_byte; data:=sys; lm_byte; //передаем HI,LO,SYS в LM7001
  data:=$00;  out32(port,data); i2c_del;  //завершение обмена - "0" на выводе CE
  link:=true;
  end;
p.s.: вы пишите под DOS/Win3.1-98 да еще и с LPT, которое только на древних чипсетах найти можно? Забыл как страшный сон и пишу-читаю SPI EEPROM-ки через FTDI в битбанге под любыми ОС.
kutani вне форума Ответить с цитированием
Старый 07.05.2016, 19:24   #3
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

serg8825, ты испытывал на работоспособность прошитую твоим способом память? У SPI помоему зонная запись, и штатные программаторы (типа пони) знают в какую область что писАть. Если тупо зальёшь в неё данные, думаю не прокатит..
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 07.05.2016, 21:14   #4
serg8825
 
Регистрация: 07.05.2016
Сообщений: 3
По умолчанию

Цитата:
Сообщение от R71MT Посмотреть сообщение
serg8825, ты испытывал на работоспособность прошитую твоим способом память? У SPI помоему зонная запись, и штатные программаторы (типа пони) знают в какую область что писАть. Если тупо зальёшь в неё данные, думаю не прокатит..
Конечно тупо ничего не прокатит. Тупо они даже не зальются. На то есть даташит на микросхему, чтоб подать команды и данные в нее.
Прошивал биосы материнок и видюх, проблем не видел.
serg8825 вне форума Ответить с цитированием
Старый 07.05.2016, 21:51   #5
serg8825
 
Регистрация: 07.05.2016
Сообщений: 3
По умолчанию

Цитата:
Сообщение от kutani Посмотреть сообщение
p.s.: вы пишите под DOS/Win3.1-98 да еще и с LPT, которое только на древних чипсетах найти можно? Забыл как страшный сон и пишу-читаю SPI EEPROM-ки через FTDI в битбанге под любыми ОС.
Вообще я сижу под XP и использую DeviceIoControl c самописанным драйвером. На нулевом кольце там делаю in и out. Под семеркой это тоже работает. Думаю что и под Win8/10 ничего не изменилось. Чипсет у меня может и древний но Core2Duo в него воткнут и необходимости апгрейдить не вижу никакой. Как бы сказать - я не пытаюсь делать универсальную и продвинутую вещь для использования везде. Не было бы LPT включил бы мозг и придумал что-нибудь новое, но LPT у меня есть, я как-то лет десять им пользуюсь и не жужжу. И не жужжал бы если бы тот же PonyProg обновлялся и поддерживал новые чипы.

По FTDI чипы спасибо за наводку, надо посмотреть. Навскидку что там по скорости ?

inpout32.dll - надо посмотреть что это, но если это просто обертка для инструкций in out, позволяющая выполнять их из режима пользователя то она бесполезна, я и так их могу выполнять через свой драйвер. Вопрос в том почему эти in out так тормозят и что такого придумал PonyProg чтоб LPT не тупил. 1.5Мбайт/сек которые прокачивает PonyProg мне вполне достаточно. может там вообще решение на поверхности.

COM файл под DOS приведен условно, это не значит что я сижу под DOS. Я могу этот фрагмент кода вписать в тело драйвера и он будет выполняться на нулевом кольце. Вот только медленно он выполняется, откуда бы ни был запущен.

Последний раз редактировалось serg8825; 07.05.2016 в 22:10.
serg8825 вне форума Ответить с цитированием
Старый 07.05.2016, 22:15   #6
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

serg8825, зачем изобретать велосипед, когда за тебя его уже давно изобрели?
Какие ты флешки хочешь шить? Я тебе найду под неё софт, дизассемблируешь его и посмотришь, как там всё устроено.. А пони давно уже труп и годится только для древних девайсов. Он никогда не шил SPI, а если и шил то криво-косо..
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 08.05.2016, 07:03   #7
kutani
Форумчанин
 
Регистрация: 23.01.2016
Сообщений: 608
По умолчанию

Цитата:
Вообще я сижу под XP
...
COM файл под DOS приведен условно
Сага о X, Y и Z... )

Цитата:
и использую DeviceIoControl
DeviceIoControl() не требует самописных драйверов для доступа, он использует API системы.

Цитата:
c самописанным драйвером
драйверы типа giveio (режима ядра) используются как раз для использования старого метода обращения к регистрам.

Цитата:
inpout32.dll - надо посмотреть что это, но если это просто обертка для инструкций in out, позволяющая выполнять их из режима пользователя то она бесполезна, я и так их могу выполнять через свой драйвер.
разве я не сказал, что это обертка? Сказал. А насчет вашего самописного, вдруг он кривой, его мы не видели. Просто inpout уже практически испытывался как и giveio, задержек не отмечено для I2C, к примеру.

Цитата:
По FTDI чипы спасибо за наводку, надо посмотреть. Навскидку что там по скорости ?
смотря какой чип, от мегабита до 10.
kutani вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ПРОВЕРКА LPT порта bit.um Компьютерное железо 2 17.12.2011 20:26
Мониторинг LPT-порта _SERGEYX_ Общие вопросы Delphi 1 11.01.2010 17:38
опрос порта по расписанию Joslen_bomon Microsoft Office Excel 2 03.12.2009 21:17
опрос порта ЛПТ shide Общие вопросы Delphi 2 08.10.2009 19:27
программирование lpt порта alexs2141 Общие вопросы Delphi 5 07.06.2008 17:10