Скачать.exe, ARM, 7-Zip для Windows Mobile / Windows CE (ARM). Скачать p7zip для Posix/Linux (бинарники и исходный код x86). Статья: "Драйвер с нуля.". Исходник бутлоадера, выводящего на экран "Wct one love" в машинных кодах на. Все файлы системы находятся в папке c:\WINCE600\PLATFORM\Mini2440\. Можно там полазить, посмотреть исходники драйверов и т.д. Сборка WinCE cross compiler из исходников.
В образе системы, который шел в комплекте такой драйвер судя по всему имеется. Интегрируем драйвер GPIO в образ Windows CE 6.0 RC3. Но подключив к WinCE словил облом - похоже работа с HID в. Windows CE (так же известна как WinCE) — это вариант операционной системы Microsoft. Около 50 новых драйверов устройств; Средства испытания и. Согласно программе лицензирования Shared source исходный код может .
Но для начала надо собрать образ винды и залить его в мини. Для этого нам потребуется: 1) Visual Studio 2. Professional с установленными SP1, SP1 Update for Vista (если работаем в Висте/7- ке), SP1 ATL Security Update.
Студенты, школьники и аспиранты студию могут получить легально и бесплатно по программе dreamspark. Windows Embedded CE 6. Platform Builder Windows Embedded CE 6. Platform Builder SP1 Windows Embedded CE 6.
RE2 Platform Builder Windows Embedded CE 6. RE3 Platform Builder. Это добро можно найти на рутрекере ввиде отдельных образов, либо получить через dreamspark в виде одного образа(легально и бесплатно)3) с сайта friendlyarm. Win. CE 6. 0 BSP и SDK. Порядок установки всего этого добра: - Microsoft. Также в висте/7- ке на всякий случай лучше все установшики запускать от имени администратора. Все файлы системы находятся в папке c: \WINCE6.
PLATFORM\Mini. 24. Можно там полазить, посмотреть исходники драйверов и т.
Когда все установилось, попробуем собрать образ системы. Запускаем студию, причем ОБЯЗАТЕЛЬНО от имени администратора, иначе будут косяки при сборке образа! Жмем File- Open- Project/Solution..
На скриншоте показано окно студии с открытым проектом. В закладке Catalog Item View можно выставляя или убирая галочки по всякому менять параметры будущего образа (вырезать ненужный софт - игры к примеру, добавить или убрать дрова, уточнить включенную в образ версию . NET Compact Framework (на выбор 2. Для сборки образа выбираем Build- Advanced Build Commands- Clean Sysgen и ждем некоторое время, иногда может показаться что построение образа зависло, но это не так, надо ждать. Когда в окне Output студии появится что- то типа: Mini. Mini. 24. 40 - 0 error(s), 6.
Build: 1 succeded or up- to- date, 0 failed, 0 skipped============значит все готово к заливке в мини 2. Идем в папку c: \WINCE6. OSDesigns\Mini. 24. Mini. 24. 40\Rel. Dir\Mini. 24. 40. Теперь будем его заливать. Предполагается, что у нас уже поставлен драйвер USB из комплекта поставки, есть необходимые шнурки и прошит загрузчик последней версии в мини.
Запускаем DNW. exe 2) Configuration- Options. Выставляем номер своего COM- порта, скорость 1. Download address 0x. Жмем ОК. 3) Подсоединяем к мини USB шнурок, COM- портовый шнурок и шнурок питания(ПИТАНИЕ НЕ ВКЛЮЧАЕМ!), переключатель S2 переводим в положение NOR. В DNW Serial Port- Connect. Теперь включаем питание мини с помощью переключателя S1. В окне DNW появится нечто подобное: 5) Жмем f для форматирования NAND памяти.
Жмем v для заливки свежего supervivi. Предварительно надо скачать с friendlyarm. NAND памяти. Как определить объем NAND: На плате ищем модуль памяти Samsung, смотрим маркировку: K9. F1. 20. 8 > 6.
MB NAND Flash. K9. F1. G0. 8 > 1.
MB NAND Flash. K9. F2. G0. 8 > 2. MB NAND Flash. K9. F8. G0. 8 > 1. MB NAND Flash. 7) Выбираем USB Port - Transmit, указываем путь к файлу supervivi- XXX (XXX = размер NAND), ждем окончания загрузки.
Теперь грузим nboot. Жмем n, USB Port - Transmit, выбираем версию nboot согласно используемому экрану nboot.
Ждем окончания загрузки. Грузим бутлого. Жмем l, USB Port - Transmit, выбираем файл bootlogo. Грузим образ системы.
Жмем w, USB Port - Transmit, выбираем недавно созданный NK. По завершению загрузки образа мини загрузится сама. Теперь можно ее выключить, вернуть переключатель в положение NAND и работать с системой. По умолчанию в системе есть драйвера для работы с переферией (GPIO, ADC), но они предполагают написание кода на С++. Мне же было интересно создавать приложения используя преимущества C# + . NET Compact Framework. Один хороший человек Domodom http: //www.
GPIO средствами C# + . NET Compact Framework (http: //www. A- GPIO- driver- for- mini. Скачиваем драйвер с его сайта и приступаем к интеграции в образ системы.
Скачиваем архив, 1) папку gpio кладем в \WINCE6. PLATFORM\Mini. 24. SRC\DRIVERS 2) файл gpio. C: \WINCE6. 00\PLATFORM\Mini. SRC\INC3) в файл \WINCE6. PLATFORM\Mini. 24. SRC\DRIVERS\dirs дописываем строку gpio 4) в файл \WINCE6.
PLATFORM\Mini. 24. FILES\platform. bib дописываем строку gpio.
Все, драйвер интегрирован в систему. Чуть позже расскажу как написать первое приложение чтобы помигать диодами и считывать нажатия кнопок, как написать приложение для работы с COM- портом, как подключить BT USB донгл и повесить его на виртуальный COM- порт.
На тот день мои познания в C/C++ ограничивались программой Hellow Word, и поэтому на вопрос: . На следующий день я узнал, что на свете существуют MSDN и DDK. Вскоре я понял, что не все Windows одинаковые, оказалось, что мой драйвер должен работать под Win. NT. У меня ушло больше месяца на то, чтобы скомпилировать и запустить свой первый Драйвер. По правде сказать, это был не совсем мой Драйвер, а точнее - это был genport из NTDDK. Но радовался я так, как будто минимум написал свою ОС.
Недавно мне пришлось опять вернуться к Драйверу. И вот вчера я, наконец- то, сдал работающий драйвер и решил написать эту небольшую статью, для того, чтобы как- то систематизировать то, что я узнал, и, чтобы когда мне снова придется взяться за драйвер, было от чего отталкиваться. Люди, знающие что такое IOCTL, DEVICE.
Эта статья для тех, кто, возможно, никогда не слышал слово ДДК, и кто до сего дня никогда не заглядывал в исходники драйверов. И еще, я буду довольно- таки подробно описывать многие, даже очевидные вещи, поэтому напомню о том, что данная статья рассчитана на людей с очень малым опытом программирования, какой был у меня, когда я занялся написанием драйверов. Первое, с чем сталкивается программист, решивший заняться драйверами, это почти полное отсутствие русскоязычной литературы по данной теме. За год поисков мне удалось найти всего три книги на русском, в которых хотя бы немного говорится о драйверах: -- -- -- -- -- -- -- -- -- -- -- -1.
Издательство . Очень полезная книга для того, что бы понять, как писать драйвера без всякий Wizard- ов. Издательство . Здесь хорошо описывается многоуровневая модель драйверов.
Я ни в коей мере не претендую как на полноту освещения темы написания драйверов, так и на 1. Буду благодарен всем, приславшим мне (0. Надеюсь, эти заметки помогут сэкономить кучу времени и сил. Прежде всего, я бы не рекомендовал (исходя из собственного опыта) пользоваться различными библиотеками (типа Nu.
Mega и всякими другими визардами). В основном из- за того, что даже для написания простейшего драйвера необходимо хотя бы поверхностное представление о том, как он функционирует. И самый простой способ получить представление об этом - написать драйвер самому.
Мне, например, не хватило терпения разобраться с Nu. Mega, и даже оболочки функций динамической загрузки/выгрузки драйвера, предложенные Свен Шрайбером в своей книге, я предпочел переписать. Итак, начнем. Для начала надо установить на компьютер Visul C++ 6. MSDN и NTDDK установку проводить желательно именно в этом порядке. Лично я пользуюсь редактором Ultra. Edit для работы с текстами драйверов, но, в принципе, исходный код драйвера можно набирать в любом текстовом редакторе, хоть в Note. Pad. Создадим папку, в которой мы будем работать с драйвером (пусть это будет C: my.
Driver). В этой папке создадим 5 файлов: 1. В SOURCES скопируйте следующее: TARGETNAME=my. Drv. TARGETPATH=obj. TARGETTYPE=DRIVERSOURCES=my. Drv. c My. Drv. rc В MAKEFILE скопируйте следующее: !
INCLUDE $(NTMAKEENV)makefile. В my. Drv. rc скопируйте следующее: #include < windows.
VER. Итак, по порядку: #define NT. Этим функциям можно дать произвольные имена, НО их сигнатура (состав параметров с типом возвращаемого значения) жестко заданы системой. Эта функция должна содержать все действия по его инициализации. В качестве первого параметра наша функция получает указатель на объект драйвера типа PDRIVER.
При загрузке драйвера системы создается объект драйвера (driver object), олицетворяющий образ драйвера в памяти. Мишка Тедди В Векторе. С другой стороны, объект драйвера представляет собой структуру, содержащую необходимые для функционирования драйвера данные и адреса функций.
В процессе инициализации драйвера (в Driver. Entry()) создаются один или несколько объектов устройств (device object), олицетворяющие те устройства, с которыми будет работать драйвер.
Этот самый device object необходим для правильного функционирования драйвера и создается (как и в нашем случае) даже тогда, когда драйвер не имеет отношения к какому- либо реальному устройству. Далее, в первых строках Driver.
Entry мы определяем используемые в ней данные, в т. Системные программы взаимодействуют с объектом устройства, созданным драйвером, посредством указателя на него. Однако для прикладных программ объект устройства представляется одним из файловых объектов, и обращение к нему осуществляется по имени (в приложении мы будем использовать функцию Create. File()). Надо иметь в виду, что объект устройства должен иметь два имени, одно - в пространстве имен NT, другое - в пространстве имен Win. Эти имена должны представлять собой структуры UNICODE. Имена объектов устройств составляются по определенным правилам. NT- имя предваряется префиксом Device, а Win.
При указании имен в Си- программе знак обратной косой черты удваивается. Для того, чтобы указанное в программе драйвера имя можно было использовать в приложении для открытия устройства, следует создать символическую связь между обоими заданными именами устройств.
Для этого используем функцию Io. Create. Symbolic. Link(). Следующая обязательная операция - создание объекта устройства - осуществляется вызовом функции Io. Create. Device(). Первый параметр этой функции - это указатель на объект драйвера, поступающий в Driver. Entry(). Второй параметр определяет размер расширения устройства - структуры, которая служит для передачи данных между функциями драйвера (состав этой структуры произволен и полностью определяется разработчиком). Третий параметр - созданное ранее NT- имя устройства.
Далее идут: тип устройства (FILE. Наконец, последний параметр является выходным - через него функция возвращает указатель на созданный объект устройства. Далее необходимо занести в объект драйвера адреса основных функций, включенных программистом в текст драйвера. Массив Major. Function является одним из элементов структурной переменной.
В этот массив мы и заносим адреса основных функций (т. Завершается функция оператором return с указанием кода успешного завершения. Функция Driver. Unload() вызывается при выгрузке драйвера.
Здесь мы должны выполнить действия по удалению объекта устройства, созданного в Driver. Entry(). Функции Driver.
Open и Driver. Close в нашем случае ничего не делают и возвращают просто STATUSS. Кстати, все эти функции тоже могут иметь произвольные имена, но передаваемые им параметры строго фиксированы. Эта функция вызывается каждый раз, когда драйверу приходит IRP- пакет с каким либо IOCTL.
Грубо говоря, IRP- пакет - это структура, передавая указатель на которую, приложение может общаться с драйвером (как, впрочем, и драйвер может общаться с другим драйвером). Более подробное описание того, что такое IRP- пакет, можно найти здесь http: //www. IRP- пакет содержит так называемый системный буфер, служащий для обмена информацией (переменная System. Buffer). Таким образом, нам надо получить доступ к IRP- пакету, а через него к System. Buffer. Для этого объявляем переменную irp.
Stack типа указателя на стековую область ввода- вывода PIO. В нашем случае тип этой переменной - PULONG, в действительности тип передаваемых данных может быть каким угодно.
С помощью функции Io. Get. Current. Irp. Stack. Location() в переменную irp. Stack помещается адрес стековой области ввода- вывода, а в переменную io. Buffer заносится адрес системного буфера из структуры IRP.
Системный буфер входит в объединение (union) с именем Associated. Irp, поэтому мы используем конструкцию Irp- > Associated.
Irp. System. Buffer. Конструкция switch- case анализирует содержимое ячейки Io.