FT232 Driver [GSoC Task]

Drivers for periphery equipment
  • Пока что я пишу реализацию односвязного списка.
    Now I'm working on single linked list.

    Этот участок кода добавляет экземпляр структуры в список, простой подменой адреса в head.
    This code adds struct in list, by simple address change in head

    Code: Select all

            movi    eax, sizeof.ftdi_context
            call    Kmalloc
            test    eax, eax
            jnz     @f
            mov     esi, nomemory_msg
            call    SysMsgBoardStr
            jmp     .return0
    @@:
            mov     ebx, [head]                             ;Сохраняем указатель на начало списка в ебх
            mov     [head], eax                             ;Делаем новую структура головой списка
            mov     [eax + ftdi_context.next_context], ebx  ;Помещаем в голову указатель на следующую структура
    Этот участок кода удаляет нужный экземпляр стуктуры из списка
    This code deletes given struct from list

    Code: Select all

            mov edi, ftdi_context
            cmp edi, [head]
            jz .unlink_head
            mov eax, [head]
      
      .getnext:  
            mov ebx, eax
            mov eax, [eax+ftdi_context.next_context]        
            cmp eax, [edi]
            jz  .unlink
            jmp .getnext
            
      .unlink:
            mov  ebx+ftdi_context.next_context, [ftdi_context.next_context] ;!!!Возможно проблемы с []        
            jmp  @f
            
      .unlink_head:
            mov head, [ftdi_context.next_context]
      @@:   
            movi eax, ftdi_context
            call Kfree 
    Пока что, ничего из этого не тестировалось, так что, если на лицо явные опечатки или ошибки, не подсказывайте)
    Также у меня уже есть вопрос, как мне правильно пользоваться callback'ами в вызовах USB*TransferAsync? Дело в том, что я не могу понять зачем мне асинхронность, я был бы очень рад если бы функции были блокирующими. Ведь допустим прикладная программа запрашивает данные с устройства, получаются, что они нужны уже и сейчас. Как решается такая проблема? Мне пришло в голову только после вызова USB*TransferAsync впадать в цикл с выходом по флагу, который выставляется в callback'е.

    Nothing of that tested so far, so if you find typos or mistakes, please don't suggest while) Also I have a question about how to use callback in USB*TransferAsync? The point is, I don't understand why I need async, I would be really happy if those functions are blocking. For example, application asks driver to obtain data from device, it turns out that data is needed right now. How to solve this problem? The only way I see now is to put a loop after each USB*TransferAsync, and wait for callback function to raise some flag.
  • It would be appreciated if you write the comments in source code in english :)
    "Any intelligent fool can make things bigger, more complex, and more violent. It takes a touch of genius -- and a lot of courage -- to move in the opposite direction." Albert Einstein
  • No problem) I will, those were the last one in russian)
  • Кстати, что будет, если вторая программа обратиться к драйверу, пока драйвер обрабатывает вызов первой? Выполнение второй программы блокируется в этом месте?

    BTW, what if second program calls driver, while driver is working on first program's call? Will the execution of second program block?
  • Не подумайте, я все также усердно работаю над драйвером) И я никуда непропадал, почти каждый день я онлайн. Несмотря на некоторые несоответсвия с внутренним графиком, я обещаю полный результат в срок: драйвер, прикладные программки, плата. На данный момент драйвер готов на 90%, осталось дописать части кода, отвечающие за: чтение данных с буфера микросхемы, геттеры и сеттеры кол-ва байт, считываемых за один раз (их надобность все еще остается под сомнением). Ну и тестируется уже написанное. Очень надеюсь, что 31 июля представлю полностью укомплектованную версию драйвера.

    Don't worry, I'm still diligently working on driver. And I wasn't missing, I'm online almost every day) Despite of discrepancy with my timeline, I promise complete result: driver, utilities, circuit board. Right now driver is ready for 90%, parts of code left are: reading data from device's buffer, getters and setters for quantity of bytes to process at once. And, of course, I'm testing that I've already done. I hope, I will present fully equipped version of the driver on July, 31.
  • Вот рисунок платы. На ней разведены места под 7 светодиодов и реле, все это может присоединено к пинам FT232 с помощью джамперов. Я предусмотрел место для MAX3232, так что пользователь сможет подключить платы к компьютеру с родным COM-
    портом. Микросхема также подключается к пинам Tx и Rx с помощью джамперов. Лого пока еще не выбрал. Теперь о приятном!) В ближайшем будущем я соберу три таких платы и подарю любому, кто попросит.

    Here is layout of circuit board. It contains 7 LEDs and relay, all of them can be connected to FT232's pins via jumpers. I placed MAX3232 on the board, so user can connect board to PC with standard COM-port. It also can be connected to FT232's Rx and Tx pins via jumpers. Still thinking what Kolibri logo to choose. Now the best part. I'm going to do three circuit boards in the nearest future and present each to somebody)
    Attachments
    cb.JPG
    cb.JPG (99.82 KiB)
    Viewed 14395 times
    Last edited by gtament on Mon Aug 18, 2014 9:04 pm, edited 1 time in total.
  • FT232 Control Center - программа, которая работает с микросхемой FT232, а именно позволяет управлять ее пинами в режиме BitBang (D2XX составляющая драйвера). К сожалению, либо в драйвере, либо в программе есть ошибка, которую на момент этого поста я все еще не исправил. Проблема в том, что микросхема под управлением этой программы не ведет себя, как ожидается.

    FT232 Control Center - application, which works with FT232, allows controlling its pins in BitBang mode (D2XX driver's part). Unfortunately, there is a bug in a driver or in an application, which I haven't corrected at the time of this post. The problem is IC, controlled by this app, doesn't behave as expected.

    Исходник\Source
    Attachments
    prg.jpg
    prg.jpg (26.61 KiB)
    Viewed 14386 times
    Last edited by gtament on Mon Aug 18, 2014 9:17 pm, edited 1 time in total.
  • По поводу VCP, у меня не было возможности полноценно протестировать эту часть. Впрочем, это необязательно, т.к. и D2XX и VCP используют буквально одни и те же процедуры драйвера. А значит, если работает одно, то работает и другое. Хотя программа выше работает не так, как надо. Однако hidnplayr проверил отправку сообщения по протоколу RS-232 и написал мне, что смог прочесть отправленное на другой машине, если я его правильно понял.
    Тем не менее, драйвер готов (если так можно сказать) и никаких изменений в архитектуре не предвидется (все фичи уже на месте), разве что придется править оставшиеся баги и дописать к некоторым процедурам проверку ошибок.

    About VCP, I wasn't able to test this part properly. But it is not that neccessary, because D2XX and VCP use the same driver's procs. So if first works, the second works also. Although application above doesn't work, as it has to. However hidnplayr tested message sending via RS-232 and wrote to me, that he could read sent message on other PC, if I understood him correctly.
    Anyway driver is ready (if I can say so) and no architectural changes needed (all features are already implemented), the only left is to fix last bugs and add error checks to some procs.
  • В связи с вопросом Kopa у меня тоже возник вопрос. В исходниках gtament драйвер называется usbother, ядро тоже грузит автоматически такой драйвер, а в репозитории он вроде называется usbftdi. Где правда?
  • Всем Hi
    Правда в том, что usbother -это общее название всех юсб-драйверов не входящее в состав usb-hid,usb-накопителей и по моему еще usb-принтеров. То есть ели написать драйвер для usb-сетевой карты или usb-модема то в систему его надо прописать с именем usbother. А в репозитории usbftdi-это название проекта.
    Сделай шаг, и дорога появится сама собой

    Стив Джобс
  • Who is online

    Users browsing this forum: No registered users and 4 guests