Смекни!
smekni.com

Комбинированное звуковое USB-устройство с функциями автономного MP3-плеера и поддержкой Bluetooth (стр. 15 из 17)

Также были рассмотрены современные средства разработки компании Atmel, популярный проводной интерфейс USB и популярный беспроводной интерфейс Bluetooth.

Разработанное устройство отличается функциональностью и широкими возможностями по расширению этой функциональности, заложенными на начальном этапе проектирования и поддерживаемыми широкими аппаратными возможностями устройства. Тем самым заложена возможность дальнейшего развития проекта. Возможна модификация программной составляющей проекта, так и некоторая доработка аппаратной части, например поддержка MMC, SD или microSD карт памяти.


Литература

1. Агуров П. В. Интерфейсы USB. Практика использования и программирования. – СПб.: БХВ-Петербург, 2004 г.

2. Агуров П. В. Последовательные интерфейсы ПК. Практика программирования. – СПб.: БХВ-Петербург, 2004 г.

3. Ан П. Сопряжение ПК с внешними устройствами. – Пер. с англ. – М.: ДМК Пресс, 2001 г.

4. Гребнев В. В. Микроконтроллеры семейства AVR фирмы Atmel. – М.: ИП РадиоСофт, 2002 г.

5. Стешенко В. Б. P-CAD. Технология проектирования печатных плат. – СПб.: БХВ-Петербург, 2003 г.

6. Фрунзе А. В. Микроконтроллеры? Это же просто! Т. 1. – М.: ООО “ИД Скимен”, 2002 г.

7. Фрунзе А. В. Микроконтроллеры? Это же просто! Т. 2. – М.: ООО “ИД Скимен”, 2002 г.

8. Фрунзе А. В. Микроконтроллеры? Это же просто! Т. 3. – М.: ООО “ИД Скимен”, 2003 г.

9. Lennart Yseboodt, Michael De Nil. EFSL - Embedded Filesystems Library - 0.3. 2005 г.

10. Олег Вальпа. Устройство флеш-памяти с USB интерфейсом. //СОВРЕМЕННАЯ ЭЛЕКТРОНИКА. – 2006 г, № 5, с. 56-59.

11. Олег Пушкарёв. Применение MMC-карт в микроконтроллерных системах. //СОВРЕМЕННАЯ ЭЛЕКТРОНИКА. – 2006 г, № 1, с. 46-49.

12. Дмитрий Тумайкин. Реализация интерфейса USB в микроконтроллерных устройствах. //СОВРЕМЕННАЯ ЭЛЕКТРОНИКА. – 2007 г, № 2, с. 34-37.

13. Дмитрий Чекунов. Практикум программиста USB-устройств. Часть 1. EZ-USB FX2LP – универсальное USB-решение. //СОВРЕМЕННАЯ ЭЛЕКТРОНИКА. – 2005 г, № 4, с. 70-77.

14. Дмитрий Чекунов. Практикум программиста USB-устройств. Часть 2. Разработка аппаратно-программного ядра USB-устройства. //СОВРЕМЕННАЯ ЭЛЕКТРОНИКА. – 2005 г, № 5, с. 66-73.

15. Дмитрий Чекунов. Практикум программиста USB-устройств. Часть 2. Разработка аппаратно-программного ядра USB-устройства. //СОВРЕМЕННАЯ ЭЛЕКТРОНИКА. – 2005 г, № 6, с. 66-74.

16. Дмитрий Чекунов. Практикум программиста USB-устройств. Часть 3. Расширение функций ядра USB-устройства. //СОВРЕМЕННАЯ ЭЛЕКТРОНИКА. – 2006 г, № 2, с. 70-77.

17. ГОСТ 2.104 – 68 Единая система конструкторской документации. Основные надписи. Введ. 01.01.71. – 9с. – Группа Т52.

18. ГОСТ 2.316-68 Единая система конструкторской документации. Правила нанесения на чертежах надписей, технических требований и таблиц. Введ. 01.01.71. – 7с. – Группа Т52.

19. ГОСТ 2.702-75 Единая система конструкторской документации. Правила выполнения электрических схем. Введ. 01.07.77. – 22с. – Группа Т52.

20. ГОСТ 2.605-68 Единая система конструкторской документации. Плакаты учебно-технические. Введ. 01.01.71. – 10с. – Группа Т52.

21. ГОСТ 2.759-82 Единая система конструкторской документации. Обозначения условные графические в схемах. Элементы аналоговой техники. Введ. 01.07.83. – 13с. – Группа Т52.

22. ГОСТ 12.0.004 – 90 ССБТ. Организация обучения безопасности труда. Введ. 01.07.91 – 14с. – Группа Т58.

23. ГОСТ 12.1.005 – 88 ССБТ. Общие санитарно-гигиенические требования к воздуху рабочей зоны. Введ. 01.01.89. – 49с. – Группа Т58.

24. СНиП 2.04.05-91 Строительные нормы и правила. Отопление, вентиляция и кондиционирование. Введ. 01.01.92. – 71с.

25. www.atmel.com.

26. www.bluetooth.org.

27. www.elcp.ru.

28. www.f2move.com.

29. www.maxim-ic.com.

30. www.micronas.com.

31. www.national.com.

32. www.samsung.com.

33. www.st.com.

34. www.vlsi.fi.


Приложение A

Текстпрограммы

AT91UsbSounCard.cpp

// AT91UsbSounCard.cpp // Generated by DriverWizard version DriverStudio 2.0.0 (Build 526)

// Requires Compuware's DriverWorks classes

#define VDW_MAIN

#include <vdw.h>

#include <kusb.h>

#include "AT91UsbSounCard.h"

#include "AT91UsbSounCardDevice.h"

#pragma hdrstop("AT91UsbSounCard.pch")

POOLTAG DefaultPoolTag('19TA');

KTrace t("AT91UsbSounCard");

#pragma code_seg("INIT")

DECLARE_DRIVER_CLASS(AT91UsbSounCard, NULL)

NTSTATUS AT91UsbSounCard::DriverEntry(PUNICODE_STRING RegistryPath){

t << "In DriverEntry&bsol;n";

KRegistryKey Params(RegistryPath, L"Parameters");// Open the "Parameters" key under the driver

if ( NT_SUCCESS(Params.LastError()) ){

#if DBG

ULONG bBreakOnEntry = FALSE;

Params.QueryValue(L"BreakOnEntry", &bBreakOnEntry);

// Read "BreakOnEntry" value from registry

if (bBreakOnEntry) DbgBreakPoint();// If requested, break into debugger

#endif

LoadRegistryParameters(Params);// Load driver data members from the registry}

m_Unit = 0;

return STATUS_SUCCESS;}

void AT91UsbSounCard::LoadRegistryParameters(KRegistryKey &Params){

m_bBreakOnEntry = FALSE;

Params.QueryValue(L"BreakOnEntry", &m_bBreakOnEntry);

t << "m_bBreakOnEntry loaded from registry, resulting value: [" << m_bBreakOnEntry << "]&bsol;n";}

// End INIT section

#pragma code_seg()

NTSTATUS AT91UsbSounCard::AddDevice(PDEVICE_OBJECT Pdo){

t << "AddDevice called&bsol;n";

AT91UsbSounCardDevice * pDevice = new (

static_cast<PCWSTR>(KUnitizedName(L"AT91UsbSounCardDevice", m_Unit)),

FILE_DEVICE_UNKNOWN, NULL, 0, DO_DIRECT_IO | DO_POWER_PAGABLE )

AT91UsbSounCardDevice(Pdo, m_Unit);

if (pDevice == NULL){

t << "Error creating device AT91UsbSounCardDevice"<< (ULONG) m_Unit << EOL;

return STATUS_INSUFFICIENT_RESOURCES;}

NTSTATUS status = pDevice->ConstructorStatus();

if ( !NT_SUCCESS(status) ){

t << "Error constructing device AT91UsbSounCardDevice"

<< (ULONG) m_Unit << " status " << (ULONG) status << EOL;

delete pDevice;}

else{

m_Unit++;

pDevice->ReportNewDevicePowerState(PowerDeviceD0);}

return status;}

AT91UsbSounCard.h

// AT91UsbSounCard.h // Generated by DriverWizard version DriverStudio 2.0.0 (Build 526)

// Requires Compuware's DriverWorks classes

#ifndef __AT91UsbSounCard_h__

#define __AT91UsbSounCard_h__

#define EOL "&bsol;n"

extern KTrace t;

class AT91UsbSounCard : public KDriver

{SAFE_DESTRUCTORS

public:

virtual NTSTATUS DriverEntry(PUNICODE_STRING RegistryPath);

virtual NTSTATUS AddDevice(PDEVICE_OBJECT Pdo);

void LoadRegistryParameters(KRegistryKey &Params);

int m_Unit;

// The following data members are loaded from the registry during DriverEntry

ULONG m_bBreakOnEntry;};

#endif // __AT91UsbSounCard_h__

AT91UsbSounCardDevice.cpp

// AT91UsbSounCardDevice.cpp Implementation of AT91UsbSounCardDevice device class

// Generated by DriverWizard version DriverStudio 2.0.0 (Build 526)

// Requires Compuware's DriverWorks classes

#pragma warning(disable:4065) // Allow switch statement with no cases

#include <vdw.h>

#include <kusb.h>

#include "AT91UsbSounCardDeviceinterface.h"

#include "AT91UsbSounCard.h"

#include "AT91UsbSounCardDevice.h"

#pragma hdrstop("AT91UsbSounCard.pch")

extern KTrace t;// Global driver trace object

GUID AT91UsbSounCardDevice_Guid = AT91UsbSounCardDevice_CLASS_GUID;

AT91UsbSounCardDevice::AT91UsbSounCardDevice(PDEVICE_OBJECT Pdo, ULONG Unit) :

KPnpDevice(Pdo, &AT91UsbSounCardDevice_Guid){

t << "Entering AT91UsbSounCardDevice::AT91UsbSounCardDevice (constructor)&bsol;n";

if ( ! NT_SUCCESS(m_ConstructorStatus) )// Check constructor status

{return;}

m_Unit = Unit;// Remember our unit number

m_Lower.Initialize(this, Pdo); // Initialize the lower device

m_Interface.Initialize(

m_Lower, //KUsbLowerDevice

0, //InterfaceNumber

1, //ConfigurationValue

0 //Initial Interface Alternate Setting

);// Initialize each Pipe object

SetLowerDevice(&m_Lower);// Inform the base class of the lower edge device object

SetPnpPolicy();// Initialize the PnP Policy settings to the "standard" policy

SetPowerPolicy();// Initialize the Power Policy settings to the "standard" policy}

AT91UsbSounCardDevice::~AT91UsbSounCardDevice()

{t << "Entering AT91UsbSounCardDevice::~AT91UsbSounCardDevice() (destructor)&bsol;n";}

char *PNPMinorFunctionName(ULONG mn){

static char* minors[] = {

"IRP_MN_START_DEVICE",

"IRP_MN_QUERY_REMOVE_DEVICE",

"IRP_MN_REMOVE_DEVICE",

"IRP_MN_CANCEL_REMOVE_DEVICE",

"IRP_MN_STOP_DEVICE",

"IRP_MN_QUERY_STOP_DEVICE",

"IRP_MN_CANCEL_STOP_DEVICE",

"IRP_MN_QUERY_DEVICE_RELATIONS",

"IRP_MN_QUERY_INTERFACE",

"IRP_MN_QUERY_CAPABILITIES",

"IRP_MN_QUERY_RESOURCES",

"IRP_MN_QUERY_RESOURCE_REQUIREMENTS",

"IRP_MN_QUERY_DEVICE_TEXT",

"IRP_MN_FILTER_RESOURCE_REQUIREMENTS",

"<unknown minor function>",

"IRP_MN_READ_CONFIG",

"IRP_MN_WRITE_CONFIG",

"IRP_MN_EJECT",

"IRP_MN_SET_LOCK",

"IRP_MN_QUERY_ID",

"IRP_MN_QUERY_PNP_DEVICE_STATE",

"IRP_MN_QUERY_BUS_INFORMATION",

"IRP_MN_DEVICE_USAGE_NOTIFICATION",

"IRP_MN_SURPRISE_REMOVAL"};

if (mn > IRP_MN_SURPRISE_REMOVAL)return "<unknown minor function>";

else return minors[mn];}

NTSTATUS AT91UsbSounCardDevice::DefaultPnp(KIrp I){

t << "Entering AT91UsbSounCardDevice::DefaultPnp with IRP minor function="

<< PNPMinorFunctionName(I.MinorFunction()) << EOL;

I.ForceReuseOfCurrentStackLocationInCalldown();

return m_Lower.PnpCall(this, I);}

NTSTATUS AT91UsbSounCardDevice::DefaultPower(KIrp I) {

t << "Entering AT91UsbSounCardDevice::DefaultPower&bsol;n";

I.IndicatePowerIrpProcessed();

I.CopyParametersDown();

return m_Lower.PnpPowerCall(this, I);}

NTSTATUS AT91UsbSounCardDevice::SystemControl(KIrp I){

t << "Entering AT91UsbSounCardDevice::SystemControl&bsol;n";

I.ForceReuseOfCurrentStackLocationInCalldown();

return m_Lower.PnpCall(this, I);}

NTSTATUS AT91UsbSounCardDevice::OnStartDevice(KIrp I){

t << "Entering AT91UsbSounCardDevice::OnStartDevice&bsol;n";

NTSTATUS status = STATUS_UNSUCCESSFUL;

AC_STATUS acStatus = AC_SUCCESS;

I.Information() = 0;

acStatus = m_Lower.ActivateConfiguration(1);// ConfigurationValue 1 (the first configuration)

switch (acStatus)

{case AC_SUCCESS:t << "USB Configuration OK&bsol;n";

status = STATUS_SUCCESS;break;

case AC_COULD_NOT_LOCATE_INTERFACE:t << "Could not locate interface&bsol;n";

break;

case AC_COULD_NOT_PRECONFIGURE_INTERFACE:

t << "Could not get configuration descriptor&bsol;n";break;

case AC_CONFIGURATION_REQUEST_FAILED:

t << "Board did not accept configuration URB&bsol;n";break;

case AC_FAILED_TO_INITIALIZE_INTERFACE_OBJECT:

t << "Failed to initialize interface object&bsol;n";break;

case AC_FAILED_TO_GET_DESCRIPTOR:t << "Failed to get device descriptor&bsol;n";break;

case AC_FAILED_TO_OPEN_PIPE_OBJECT:status = STATUS_SUCCESS;

t << "Failed to open pipe object&bsol;n";break;

default:t << "Unexpected error activating USB configuration&bsol;n";break;}

return status; // base class completes the IRP}

NTSTATUS AT91UsbSounCardDevice::OnStopDevice(KIrp I){

NTSTATUS status = STATUS_SUCCESS;

t << "Entering AT91UsbSounCardDevice::OnStopDevice&bsol;n";

m_Lower.DeActivateConfiguration();

return status;

UNREFERENCED_PARAMETER(I);}

NTSTATUS AT91UsbSounCardDevice::OnRemoveDevice(KIrp I){

t << "Entering AT91UsbSounCardDevice::OnRemoveDevice&bsol;n";

m_Lower.ReleaseResources();

return STATUS_SUCCESS;

UNREFERENCED_PARAMETER(I);}

NTSTATUS AT91UsbSounCardDevice::OnDevicePowerUp(KIrp I){

NTSTATUS status = STATUS_SUCCESS;

t << "Entering AT91UsbSounCardDevice::OnDevicePowerUp&bsol;n";

return status;

UNREFERENCED_PARAMETER(I);}

NTSTATUS AT91UsbSounCardDevice::OnDeviceSleep(KIrp I){

NTSTATUS status = STATUS_SUCCESS;

t << "Entering AT91UsbSounCardDevice::OnDeviceSleep&bsol;n";

return status;

UNREFERENCED_PARAMETER(I);}

NTSTATUS AT91UsbSounCardDevice::Create(KIrp I){

NTSTATUS status;

t << "Entering AT91UsbSounCardDevice::Create, " << I << EOL;

status = I.PnpComplete(this, STATUS_SUCCESS, IO_NO_INCREMENT);

t << "AT91UsbSounCardDevice::Create Status " << (ULONG)status << EOL;

return status;}

NTSTATUS AT91UsbSounCardDevice::Close(KIrp I){

NTSTATUS status;

t << "Entering AT91UsbSounCardDevice::Close, " << I << EOL;

status = I.PnpComplete(this, STATUS_SUCCESS, IO_NO_INCREMENT);

t << "AT91UsbSounCardDevice::Close Status " << (ULONG)status << EOL;

return status;}

NTSTATUS AT91UsbSounCardDevice::CleanUp(KIrp I){

t << "Entering CleanUp, " << I << EOL;

return I.PnpComplete(this, STATUS_SUCCESS);}