Can Windows drivers be written in Python?
Adrian Toman
11.3k5 gold badges47 silver badges62 bronze badges
asked Jun 11, 2009 at 13:50
0
Yes. You cannot create the «classic» kernel-mode drivers. However, starting with XP, Windows offers a User-Mode Driver Framework. They can’t do everything, obviously — any driver used in booting the OS obviously has to be kernel-mode. But with UMDF, you only need to implement COM components.
Besides boot-time drivers, you also can’t write UMDF drivers that:
- Handle interrupts
- Directly access hardware, such as direct memory access (DMA)
- have strict timing loops
- Use nonpaged pool or other resources that are reserved for kernel mode
answered Jun 11, 2009 at 14:32
MSaltersMSalters
172k10 gold badges154 silver badges343 bronze badges
5
The definitive answer is not without embedding an interpreter in your otherwise C/assembly driver. Unless someone has a framework available, then the answer is no. Once you have the interpreter and bindings in place then the rest of the logic could be done in Python.
However, writing drivers is one of the things for which C is best suited. I imagine the resulting Python code would look a whole lot like C code and defeat the purpose of the interpreter overhead.
answered Jun 11, 2009 at 14:08
Judge MaygardenJudge Maygarden
26.7k9 gold badges80 silver badges99 bronze badges
A good way to gain insight why this is practically impossible is by reading Microsoft’s advice on the use of C++ in drivers. As a derivative of C, the use of C++ appears to be straightforward. In practice, not so.
For instance, you must decide for every function (and really every assembly instruction) whether it’s in pageable or non-pageable memory. This requires extensions to C, careful use of new C++ features, or in this case a special extension to the Python language and VM. In addition, your driver-compatible VM would also have to deal with the different IRQLs — there’s a hierarchy of «levels» which restrict what you can and cannot do.
answered Jun 11, 2009 at 14:26
MSaltersMSalters
172k10 gold badges154 silver badges343 bronze badges
Python runs in a virtual machine, so no.
BUT:
You could write a compiler that translates Python code to machine language. Once you’ve done that, you can do it.
answered Jun 11, 2009 at 13:53
Mark LuttonMark Lutton
6,9097 gold badges38 silver badges55 bronze badges
1
I don’t know the restrictions on drivers on windows (memory allocation schemes, dynamic load of libraries and all), but you may be able to embed a python interpreter in your driver, at which point you can do whatever you want. Not that I think it is a good idea
answered Jun 11, 2009 at 14:01
David CournapeauDavid Cournapeau
77.2k8 gold badges61 silver badges69 bronze badges
5
Never say never but eh.. no
You might be able to hack something together to run user-mode parts of drivers in python. But kernel-mode stuff can only be done in C or assembly.
answered Jun 11, 2009 at 13:54
MendeltMendelt
36.5k6 gold badges73 silver badges97 bronze badges
3
No they cannot. Windows drivers must be written in a language that can
- Interface with the C based API
- Compile down to machine code
Then again, there’s nothing stopping you from writing a compiler that translates python to machine code
answered Jun 11, 2009 at 13:59
JaredParJaredPar
724k147 gold badges1229 silver badges1448 bronze badges
1
7 ответы
да. Вы не можете создавать «классические» драйверы режима ядра. Однако, начиная с XP, Windows предлагает Структура драйвера пользовательского режима. Очевидно, что они не могут делать все — любой драйвер, используемый при загрузке ОС, очевидно, должен быть в режиме ядра. Но с UMDF вам нужно только реализовать COM-компоненты.
Помимо драйверов времени загрузки, вы также не можете писать драйверы UMDF, которые:
- Обработка прерываний
- Прямой доступ к оборудованию, например прямой доступ к памяти (DMA)
- иметь строгие временные петли
- Использовать невыгружаемый пул или другие ресурсы, зарезервированные для режима ядра.
Создан 11 июн.
Окончательный ответ не возможен без встраивания интерпретатора в ваш драйвер C/assembly. Если у кого-то нет фреймворка, то ответ — нет. Когда у вас есть интерпретатор и привязки, остальная логика может быть выполнена на Python.
Однако написание драйверов — одна из тех задач, для которых С лучше всего подходит. Я предполагаю, что получившийся код Python будет очень похож на код C и перечеркнет смысл накладных расходов интерпретатора.
Создан 11 июн.
Хороший способ понять, почему это практически невозможно, — прочитать Совет Microsoft об использовании C++ в драйверах. Как производная от C, использование C++ кажется простым. На практике не так.
Например, вы должны решить для каждой функции (и действительно для каждой ассемблерной инструкции), находится ли она в страничной или нестраничной памяти. Это требует расширений для C, тщательного использования новых возможностей C++ или, в данном случае, специального расширения для языка Python и виртуальной машины. Кроме того, ваша виртуальная машина, совместимая с драйверами, также должна иметь дело с различными IRQL — существует иерархия «уровней», которые ограничивают то, что вы можете и что не можете делать.
Создан 11 июн.
Python работает на виртуальной машине, так что нет.
НО:
Вы можете написать компилятор, который переводит код Python на машинный язык. Как только вы это сделали, вы можете это сделать.
Создан 11 июн.
Я не знаю ограничений драйверов для Windows (схемы распределения памяти, динамическая загрузка библиотек и все такое), но вы можете встроить интерпретатор Python в свой драйвер, после чего вы можете делать все, что хотите. Не то, чтобы я думаю, что это хорошая идея
Создан 11 июн.
Никогда не говори никогда, но э… нет.
Возможно, вы сможете взломать что-нибудь вместе, чтобы запускать части драйверов пользовательского режима в python. Но что-то в режиме ядра можно делать только на C или ассемблере.
Создан 11 июн.
Нет, они не могут. Драйверы Windows должны быть написаны на языке,
- Интерфейс с API на основе C
- Компилировать в машинный код
Опять же, ничто не мешает вам написать компилятор, который переводит python в машинный код;)
Создан 11 июн.
Не тот ответ, который вы ищете? Просмотрите другие вопросы с метками
python
windows
drivers
or задайте свой вопрос.
7 ответов
Да. Вы не можете создавать «классические» драйверы режима ядра. Однако, начиная с XP, Windows предлагает «Рамка драйверов пользовательского режима» . Они не могут делать все, очевидно — любой драйвер, используемый при загрузке ОС, должен быть в ядре. Но с UMDF вам нужно только реализовать COM-компоненты.
Помимо драйверов загрузки, вы также не можете записывать драйверы UMDF, которые:
- Обработка прерываний
- Непосредственный доступ к оборудованию, например, прямой доступ к памяти (DMA)
- имеют строгие циклы синхронизации.
- Использовать невыгружаемый пул или другие ресурсы, зарезервированные для режима ядра.
MSalters
11 июнь 2009, в 15:43
Поделиться
Хороший способ получить представление о том, почему это практически невозможно, — это прочитать совет Microsoft по использованию С++ в драйверах. Как производная от C, использование С++ представляется простым. На практике это не так.
Например, вы должны решить для каждой функции (и действительно каждой инструкции сборки), будь то в доступной для страниц или нестранимой памяти. Для этого требуются расширения для C, тщательное использование новых возможностей С++ или в этом случае специальное расширение для языка Python и виртуальной машины. Кроме того, ваша совместимая с драйвером VM также должна иметь дело с разными IRQL — там есть иерархия уровней, которые ограничивают то, что вы можете и чего не можете сделать.
MSalters
11 июнь 2009, в 15:16
Поделиться
Окончательный ответ не исключает встраивания интерпретатора в ваш другой драйвер C/assembly. Если у кого-то нет рамки, тогда ответ будет отрицательным. Когда у вас есть интерпретатор и привязки на месте, остальная часть логики может быть выполнена в Python.
Однако писать драйверы — одна из тех вещей, для которых C лучше всего подходит. Я предполагаю, что полученный в результате код Python будет выглядеть очень похож на код C и превзойти цель служебных данных интерпретатора.
Judge Maygarden
11 июнь 2009, в 14:44
Поделиться
Я не знаю ограничений на драйверы для Windows (схемы распределения памяти, динамическая загрузка библиотек и все), но вы можете внедрить интерпретатор python в свой драйвер, после чего вы можете делать все, что хотите, Не то, чтобы я думаю, что это хорошая идея:)
David Cournapeau
11 июнь 2009, в 15:30
Поделиться
Python запускается на виртуальной машине, поэтому нет.
НО:
Вы можете написать компилятор, который переводит код Python на машинный язык. Как только вы это сделаете, вы можете это сделать.
Mark Lutton
11 июнь 2009, в 15:11
Поделиться
Никогда не говори никогда, но эх.. нет
Возможно, вы сможете взломать что-то вместе, чтобы запустить части драйверов в режиме python. Но материал в режиме ядра можно выполнять только в C или сборке.
Mendelt
11 июнь 2009, в 15:32
Поделиться
Нет, они не могут. Драйверы Windows должны быть написаны на языке, который может
- Интерфейс с API на основе C
- Скомпилировать до машинного кода
Тогда опять же ничего не мешает вам писать компилятор, который переводит python на машинный код;)
JaredPar
11 июнь 2009, в 15:12
Поделиться
Ещё вопросы
- 1LINQ группа по сумме имущества
- 1как получить имя функции, вызываемой в классе через конструктор
- 0выделите, чтобы по щелчку и при загрузке страницы
- 0Как извлечь запись из нескольких таблиц в MySQL
- 0Как правильно разместить код на моем сайте? [Дубликат]
- 1Приложение для телефона Windows 8 со ссылками на другие загруженные приложения и магазин
- 0getAverage () отбрасывает последний элемент
- 0Сокеты C ++. const char * прибывает правильно, string.c_str () doenst
- 0Окно входа в систему ионной модели как глобальный метод?
- 0Получение Невозможно получить доступ к памяти при ошибке адреса
- 0скрыть div, когда ввод в поле ввода начинается — jQuery
- 1Разница между glNormal3f и glNormalPointer
- 1Файл сохраняется в формате UTF16. В чем может быть проблема?
- 1оператор if внутри функции
- 1Как я могу включить информацию в мое приложение для Android после компиляции?
- 0Получение двойного свободного или коррупционного (сверху) при закрытии трубы?
- 0Передача параметров из $ http Angular на сервер торнадо Python
- 0Почему Angularjs не работает здесь
- 0Как я могу отобразить данные MySQL в Marquee?
- 1Вложения сообщений отсутствуют при публикации сообщения на домашнем канале Slack App
- 0Можно ли сделать свою собственную функцию winapi, например, getpixel, для работы с окнами?
- 1Ember 2, спектакли с использованием плагина как ember-true-helpers вместо обычного Ember
- 0Инициализация и удаление 2d массива
- 1Почему назначение нового значения свойству элемента управления не меняет его местоположение во время выполнения?
- 0Jquery нажатие клавиш не работает
- 1Фрагмент деятельности с NPE
- 1Response.Write зависает, когда я пытаюсь читать из запроса и писать в ответ одновременно
- 0Форма PHP отправляется с $ _SERVER [«PHP_SELF»], но удаляет .php из URL
- 1отслеживание исходящих SMS
- 1«FileStream или File не существует в текущем контексте», пытаясь получить доступ к объекту File в c #
- 1Лучший способ прочитать большой файл, содержащий однострочную строку в Java IO
- 1Запрос контактов с именем и картинкой URI
- 0Можно ли создать вложенное состояние внутри вложенного состояния?
- 0JQuery Ноти на близком Перейти к URL
- 1Как переопределить все страницы ошибок в бутылке?
- 0Отдельные текстовые поля помещаются обратно в одну переменную и отображаются по-разному
- 0MySQL вставить в разные таблицы на основе столбца из оператора выбора
- 0Соединение рисунков рядом друг с другом под Top Canvas Layer
- 1При использовании Keen запросы с абсолютным таймфреймом с ежемесячными интервалами с использованием JavaScript не разделяются, как ожидалось
- 0доступ к словарю в asp.net с помощью jquery
- 0лучший способ связать переменную и ее идентификатор
- 0MyBatis @Update проблемы с foreach
- 0добавить еще один столбец на основе одной таблицы
- 0Как обновить версию MySQL (innodb) в xampp под ОС Linux
- 1Ракетка: Что означает двойное двоеточие (: :)?
- 1Скопировать объект, сохранить одну ссылку свойства
- 1OpenGL ES 1.1 против 2.0 для 2D-графики, с повернутыми спрайтами?
- 0Не использует Boost Bind
- 0HTML и CSS (панель навигации)
- 0Есть ли какой-либо метод в MySQL, который возвращает разницу между двумя датами в месяцах и днях
If you are a Python programmer, and need a simple USB interface for some hardware, read on…
FTDI are well known for their USB-to-serial chips, but the later models (such as FT2232C and FT232H) have various other capabilities; when combined with Python, you get a simple yet powerful method of controlling & monitoring a wide variety of hardware devices.
Hardware
Various FTDI-equipped modules and cables are available.
A few points to bear in mind:
- The module may need to have some of its pins linked together, otherwise it won’t power up.
- If the module has a 5 Volt output pin, take care when connecting it up; if mis-connected, a sizeable current may flow, causing significant damage.
- Each FTDI device has a unique set of capabilities; check the datasheet to make sure the part has the facilities you need.
Device driver
As standard, when an FTDI device is plugged into a Windows PC, the operating system loads the default Virtual Com Port driver, that can only handle asynchronous serial (RS232-type) protocols. However, we want to be a bit more adventurous, so need to substitute the ‘d2xx’ driver, available from the FTDI drivers page. A quick way to check which driver is active is to look at the Device Manager; if the FTDI part appears as a COM port, it is asynchronous-only.
Use ‘pip’ to install a Python library that will access the d2xx driver; there are several available (such as pyftdi, pylibftdi) but the only one that worked seamlessly with Python 2.7 and 3.x on my systems was the simplest: ftd2xx, which is just a CTYPES wrapper round the d2xx API
pip install ftd2xx
A quick check to see if all is well (Python 2.7 or 3.x):
import sys, ftd2xx as ftd d = ftd.open(0) # Open first FTDI device print(d.getDeviceInfo())
This should print some dictionary entries for the device, e.g.
{'serial': 'FT28C9AHA', 'type': 4L, 'id': 67330064L, 'description': 'DLP2232M A'}
If this fails, it is usually because the device is still using the VCP driver, or the Python library can’t find the necessary FTDI files (ftd2xx.lib, and ftd2xx.dll or ftd2xx64.dll); they need to be somewhere on the executable PATH.
Linux drivers are discussed in the next post.
Pinout
Before sending any data to the device, we need to establish which pins does what, as all pin functions are pre-assigned. Each chip has 1 or more ‘channels’, i.e. protocol engines, so a 2-channel device can drive 2 separate protocol streams, though there may be a limitation on the protocols a channel can handle. Each channel is assigned to one or more ports, which are usually 8-bit, but may have as many as 10 or as few as 4 bits. The first port of the first channel is identified as ADBUS; if that channel has a second port, it would be ACBUS. The first port of the second channel (if present) is BDBUS, the second port of that channel would be BCBUS.
The serial I/O functions are generally constrained to the lower few bits of the first port, the rest of the lines act as general status or handshake I/O. For example, the 2-channel FT2232C device channel A has pins ADBUS 0 – 7 and ACBUS 0 – 3:
CHANNEL A CHANNEL B PIN NAME UART BIT-BANG MPSSE PIN NAME UART BIT-BANG MPSSE ADBUS0 TxD D0 TCK/SK BDBUS0 TxD D0 - ADBUS1 RxD D1 TDI/DO BDBUS1 RxD D1 - ADBUS2 RTS D2 TDO/DI BDBUS2 RTS D2 - ADBUS3 CTS D3 TMS/CS BDBUS3 CTS D3 - ADBUS4 DTR D4 GPIOL0 BDBUS4 DTR D4 - ADBUS5 DSR D5 GPIOL1 BDBUS5 DSR D5 - ADBUS6 DCD D6 GPIOL2 BDBUS6 DCD D6 - ADBUS7 RI D7 GPIOL3 BDBUS7 RI D7 - ACBUS0 TXDEN WR GPIOH0 BCBUS0 TXDEN WR - ACBUS1 SLEEP RD GPIOH1 BCBUS1 SLEEP RD - ACBUS2 RXLED IORDY GPIOH2 BCBUS2 RXLED IORDY - ACBUS3 TXLED OSC GPIOH3 BCBUS3 TXLED OSC -
The GPIOL and GPIOH prefixes refer to the low & high byte output commands that we’ll encounter later when using MPSSE mode for synchronous protocols; also note that channel B is unusable in that mode.
A possible source of confusion is that pins 1 and 2 in MPSSE mode are identified as TDI/DO and TDO/DI, implying that they can act as inputs or outputs. This is incorrect: in MPSSE mode, pin 1 is normally an output, and pin 2 is an input. The reason for the TDI and TDO labels is that they refer to the JTAG protocol, which is defined from the point of view of the device being controlled, not the controller – so the DO and DI labels apply in normal usage.
Also note that the device has a tendency to keep its previous settings, even after a reset. For this reason, all programs using the ftd2xx library normally start by clearing everything in the device to zero, just in case a preceding program has left some settings active. For simplicity, the code given below ignores this requirement, and assumes the device has been re-plugged just before the code was run.
Bitbang mode: toggling an I/O pin
‘bitbashing’ which FTDI call ‘bitbanging’, refers to driving the I/O pins directly, rather than using an I/O protocol embedded in the device.
The FTDI device powers up in ‘reset mode’ and must be set to bitbang mode using the setBitmode function. One advantage of using the Python ftd2xx library is that the function arguments are as documented in the FTDI ‘D2XX Programmers Guide’:
OP = 0x01 # Bit mask for output D0 d.setBitMode(OP, 1) # Set pin as output, and async bitbang mode d.write(str(OP)) # Set output high d.write(str(0)) # Set output low
Having set our chosen pin as an output, and enabled bitbang mode, writing a string to the device handle will set its state. The ‘write’ functions returns the number of characters written, which is 1 in this case. If your application involves sending out a succession of O/P pulses, you’ll want to know how fast the operation is; sending the following commands:
d.write(chr(OP)); d.write(chr(0))
results in a positive pulse somewhere between 500 microseconds and 2 milliseconds wide. This will be too variable and too slow for many applications, so an alternative is to write a string containing multiple data values, e.g.
d.write(chr(OP) + chr(0))
This results in a pulse 50 nanoseconds wide, which is probably too narrow for most applications, however in theory you can just duplicate a command to stretch it out, for example to generate a pulse of 200 nanoseconds:
d.write(chr(OP)*4 + chr(0))
This approach is somewhat inefficient, and works fine on Python 2.7, but not on Python 3.x; if you connect an oscilloscope to the output, you’ll see a couple of cycles of 10 MHz square-wave, instead of a single broad pulse. Using a USB analyser to monitor the data, it is apparent that the code is sending the bytes 01 00 01 00 01 instead of 01 01 01 01 00; the length is correct, but the data values are wrong, because of the different ways Python 2.7 and 3.x store their strings.
Byte values in Python 2.7 and 3.x
The default string type can’t be used for byte data in 3.x, as the characters are 16-bit Unicode values, not bytes. There are various ways round the problem, the simplest is to force the string type to binary:
d.write(b"x01x01x01x01x00")
This is fine for preformatted strings, but gets rather messy if the data is being computed on-the-fly. There are plenty of alternative suggestions on the Internet, but many don’t work in special cases, such as bit 7 being set. The ‘bytearray’ type would be useful, except that it is rejected as an unknown type by the ftd2xx library. The ‘bytes’ datatype is good on v3, but works very differently on v2.7, so for my development I reluctantly decided to store all outgoing data as lists of integers, with a version-dependant conversion function on writing, e.g.
def ft_write(d, data): s = str(bytearray(data)) if sys.version_info<(3,) else bytes(data) return d.write(s) ft_write(d, [OP]*4 + [0])
Slowing down output transitions
Sending multiple output commands to slow down the output transitions is quite inefficient, and unworkable for really long pulses. A better alternative is to program the baud rate generator (the same generator as used for serial communications), which synchronises the transitions, e.g.
d.setBaudRate(9600) ft_write(d, (OP, 0))
The FTDI Application Note states that the output is clocked at 16 times the baud rate, so 9600 baud should result in a timing of 6.51 microseconds per bit. However, on an FT2232H module the time was measured as 20.825 microseconds, so that logic seemingly doesn’t apply to all modules.
Reading input pins
Finally we get to read some data in:
print(d.read(1))
The length of 1 returns an 8-bit value corresponding to the I/O pin states; as before, the returned type depends on the Python version, so I convert it to a list of integers:
def ft_read(d, nbytes): s = d.read(nbytes) return [ord(c) for c in s] if type(s) is str else list(s) print(ft_read(d, 1))
Unused inputs float high, and the last output command drove the ADBUS0 output low, so the value printed is 254 in a list, [254].
You can implement quite complex protocols using simple I/ O commands; write-cycles can be chained to output complex sequences, but there is quite a speed-penalty every time a read-cycle has to be interleaved. In recognition of this, many FTDI chips have a more complex capability, which they call MPSSE (Multi-Protocol Synchronous Serial Engine); that’ll be the subject of a later blog post…
See the next post to run the code on Linux…
Copyright (c) Jeremy P Bentham 2018. Please credit this blog if you are using the information or software in it.
[Python] Разработка и использование pyusb
Из-за потребностей проекта данные пикселей изображения на стороне FPGA должны быть переданы на сторону ПК через протокол USB2.0, поэтому для отправки и получения данных необходима библиотека python pyusb. Ниже описаны методы и проблемы, возникающие при использовании библиотеки pyusb.
1. Введение интерфейса USB
В этом процессе разработки я использовал чип-драйвер Cypress EZ-USB серии CY7C68013A для передачи данных USB на плате разработки FPGA. CY7C68013A — это высокоскоростной протокол связи USB2.0 и совместимый чип управления 8051 В этом чипе содержится 16 КБ встроенной оперативной памяти, вы можете напрямую запустить программу прошивки без дополнительной памяти. Рабочая частота внутреннего 8051 процессора CY7C68013A может составлять 48 МГц, 24 МГц, 12 МГц. На моей плате разработки FPGA 24 МГц используется как вход тактовой частоты. CY7C68013A объединяет 4 FIFO с общим размером 4 Кбайт. Пользователь может настроить его для работы в режиме Master или Slave путем установки. CY7C68013A содержит интерфейс I2C для подключения к внешней EEPROM.Первый пользователь загружает записанный файл микропрограммы .iic в EEPROM. При включении CY7C68013A он автоматически считывает программу EEPROM во внутреннюю память для запуска.
Микросхема CY7C68013A, используемая в этом проекте, настраивает программу встроенного программного обеспечения для работы в ведомом режиме асинхронного чтения-записи FIFO, в котором FIFO EP2 и EP4 задается в качестве порта вывода данных, а FIFO EP6 и EP8. Для порта ввода данных каждый порт содержит два 512-байтовых FIFO.Если 512-байтовый порт считывается пустым или полным, оборудование автоматически переключится на другой 512-байтовый FIFO. На этом внедрение USB-оборудования заканчивается, и если вам нужно изменить режим работы CY7C68013A, конфигурацию портов и сигналов, вы можете узнать больше о программе прошивки CY7C68013A и изменить ее.
2. Установка драйвера USB
1、
Вотссылка на сайтЗагрузите библиотеку libusb.
2、
Дважды щелкните по установке, выберите соответствующий интерфейс USB, установите и создайте папку LibUSB-Win32 (следующий путь не будет отображен)
3、
В каталоге bin в папке LibUSB-Win32 щелкните inf-wizard, чтобы установить драйвер, сгенерировать информацию о драйвере USB и сохранить ее в любом каталоге.
4、
Выберите интерфейс USB для установки в диспетчере устройств, выберите для обновления драйвера, перейдите в каталог только что сгенерированной информации о драйвере USB, начните обновлять драйвер и завершите установку драйвера.
5、
Запишите идентификатор поставщика и идентификатор продукта в информации о драйвере
В-третьих, установка библиотеки pyusb
Здесь нечего уточнять, cmd запускается напрямую
pip install pyusb
В-четвертых, развитие pyusb
Создайте новый проект Python, импортируйте необходимую библиотеку USB, код выглядит следующим образом
import usb.util
# find our device
dev = usb.core.find(idVendor=0x04B4,idProduct=0x1004)
print(dev)
# was it found?
if dev is None:
raise ValueError('Device not found')
Где idVendor = 0x04B4, idProduct = 0x1004, заменяется идентификатором Vender и идентификатором продукта USB-драйвера, который вы только что установили
При запуске программы будет распечатана соответствующая информация об интерфейсе USB.
Затем читайте и пишите USB, код выглядит следующим образом
# set the active configuration. With no arguments, the first
# configuration will be the active one
dev.set_configuration()
def rx_loop():
while(True):
try:
data = dev.read(0x86,512,1000) #read(endpoint, size_or_buffer, timeout = None)
print(data)
except Exception as e:
print(e)
def tx_loop():
while(True):
try:
data = dev.write(0x88,0x55,1000) #write(endpoint, data, timeout = None)
print(data)
except Exception as e:
print(e)
Параметры функций чтения и записи в вышеупомянутом модуле чтения-записи соответственно отмечаются впоследствии,Пожалуйста, измените это самостоятельно
Запустите модуль чтения и записи отдельно, чтобы проверить USB-чтение и запись. Обратите внимание, что из-за характеристик USB-чипа на плате разработки FPGA, которую я использую, емкость четырех FIFO-дисков составляет 512 байт, поэтому длина одного чтения установлена в модуле чтения моего главного компьютера. Это 512 байт. Если он меньше 512 байт, это приведет к проблеме невозможности чтения данных. Он также соответствует модулю записи (записи). Также необходимо записать полные 512 байт, прежде чем сторона ПЛИС получит прошлые данные, отправленные ПК. ,
На этом этапе разработка USB с использованием библиотеки pyusb python даже завершена, поскольку в этом проекте используется базовая функция приемопередатчика USB, программа относительно проста. Для более глубокого развития, пожалуйста, сделайте дальнейшее развитие самостоятельно.
Для перепечатки, пожалуйста, укажите источник
Уведомления
- Начало
- » Python для новичков
- » Можно писать драйвера или нет
#1 Июль 5, 2014 21:23:59
Можно писать драйвера или нет
Добрый вечер !
Скажите можно ли написать на питоне драйвера на 4G модем.
Деля Ubuntu если да то где надо копать спасибо заранее
Офлайн
- Пожаловаться
#2 Июль 6, 2014 03:18:27
Можно писать драйвера или нет
драйвера пишут на C потому что они на низком уровне связанны с ОС. Даже если на Питоне может быть физически и можно, но это делать никто не будет. Вы, точно не напишите, хотя бы потому что задаете такой вопрос. Возьмите драйвера официальные на модем, загляните в исходники, сделайте выводы.
Тема флейм.
_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com
Офлайн
- Пожаловаться
#3 Июль 6, 2014 09:09:40
Можно писать драйвера или нет
Я задал такой вопрос потому что все говорят что на питоне можно писать все.
Можно тогда написать флешь плеер как Adobe Flash Player. Или нет
Офлайн
- Пожаловаться
#4 Июль 6, 2014 09:44:23
Можно писать драйвера или нет
Можно, но не нужно.
Офлайн
- Пожаловаться
#5 Июль 6, 2014 10:19:25
Можно писать драйвера или нет
Можете показать пример программы типа Adobe Flash Player .
Чтобы знать как можно такую программу написать на питоне .
Была пример что и как работает.
Да посоветуйте книги какие по читать.
Если у кого не будь книга Майкд Доусон Программируем на Python.
Дайте ссылку чтобы скачать спасибо заранее
Офлайн
- Пожаловаться
- Начало
- » Python для новичков
- » Можно писать драйвера или нет