AT09337: интерфейс хоста USB для класса HID мыши |
![]() |
Добавил(а) microsin | ||||||||||||||||||
USB Host Interface (UHI) для класса Human Interface Device Mouse (HID Mouse) устройств USB предоставляет интерфейс для конфигурации и управления хостом USB для устройств USB HID мыши. Здесь приведен перевод документации [1]. Схема этой документации следующая: • Обзор API. Дополнительную информацию по библиотеке стека хоста USB - Atmel® Software Framework (ASF) USB Host Stack - см. апноут AVR4950 [2]. [Обзор API] В этом обзоре приведены определения макросов, функций, необходимых для работы хоста HID-мыши. Макрос UHI_HID_MOUSE #define UHI_HID_MOUSE
Глобальное определение, которое содержит стандартное UHI API для UHC (USB Host Core, библиотека ядра хоста USB). Это должно быть добавлено в определение USB_HOST_UHI из файла conf_usb_host.h. UHI для класса устройств USB HID-мыши. Для высокоуровневого приложения используется общее API хоста, предназначенное для этого класса устройств USB. Это API требует только определение callback-функций через следующие определения макросов: Макрос UHI_HID_MOUSE_CHANGE #define UHI_HID_MOUSE_CHANGE(dev, b_plug)
Макрос UHI_HID_MOUSE_EVENT_BTN_LEFT #define UHI_HID_MOUSE_EVENT_BTN_LEFT(b_state)
Макрос UHI_HID_MOUSE_EVENT_BTN_RIGHT #define UHI_HID_MOUSE_EVENT_BTN_RIGHT(b_state)
Макрос UHI_HID_MOUSE_EVENT_BTN_MIDDLE #define UHI_HID_MOUSE_EVENT_BTN_MIDDLE(b_state)
Макрос UHI_HID_MOUSE_EVENT_MOVE #define UHI_HID_MOUSE_EVENT_MUVE(x, y, scroll)
Ниже во врезках приведены описания функций, необходимых для UHC. uhc_enum_status_t uhi_hid_mouse_install (uhc_device_t * dev); Устанавливает интерфейс, выделяет конечные точки интерфейса, если они предоставлены. Таблица 2-1. Параметры uhi_hid_mouse_install.
Возврат: статус установки. Разрешает интерфейс. void uhi_hid_mouse_enable (uhc_device_t * dev); Разрешает интерфейс USB для соответствующего UHI. Таблица 2-2. Параметры uhi_hid_mouse_enable.
Деинсталлирует интерфейс (если он был установлен). void uhi_hid_mouse_uninstall (uhc_device_t * dev); Таблица 2-3. Параметры uhi_hid_mouse_uninstall.
[Быстрый старт UHI-модуля хоста для HID-мыши] В этом руководстве даны пошаговые инструкции запуска модуля хоста для работы с устройствами USB мыши (USB Host Mouse Module, UHI Mouse). Показано, как конфигурировать и использовать этот модуль в различных ситуациях. Рассмотренные ситуации сопровождаются демонстрационными фрагментами кода. Для шагов настройки эти фрагменты могут быть скопированы в функцию инициализации пользователя, в то время как шаги использования могут быть скопированы, к примеру, в тело функции main приложения. В этом примере применен модуль с поддержкой одного класса "USB Host HID Mouse (Single Class support)". Использование модуля с поддержкой нескольких классов "USB Host HID Mouse (Multiple Classes support)" описан в секции "Продвинутые случаи использования". [Настройка] Как и для любого хоста USB, требуются общие шаги по настройки хоста. Обратитесь к разделу "Базовая настройка хоста USB". [Использование] Ниже приведены примеры кода, показывающие пошаговое использование хоста. 1. Создайте файл conf_usb_host.h: #define USB_HOST_UHI UHI_HID_MOUSE
#define UHI_HID_MOUSE_CHANGE(dev, b_plug) my_callback_mouse_change(dev, b_plug)
extern bool my_callback_mouse_change(uhc_device_t* dev, bool b_plug); #define UHI_HID_MOUSE_EVENT_BTN_LEFT(b_state) my_callback_event_btn_left(b_state)
extern void my_callback_event_btn_left(bool b_state); #define UHI_HID_MOUSE_EVENT_BTN_RIGHT(b_state) my_callback_event_btn_right(b_state)
extern void my_callback_event_btn_right(bool b_state); #define UHI_HID_MOUSE_EVENT_BTN_MIDDLE(b_state) my_callback_event_btn_middle(b_state)
extern void my_callback_event_btn_middle(bool b_state); #define UHI_HID_MOUSE_EVENT_MOVE(x, y, scroll) my_callback_event_mouse(x, y, scroll)
extern void my_callback_event_mouse(int8_t x, int8_t y, int8_t scroll); #include "uhi_hid_mouse.h" // В конце файла conf_usb_host.h 2. Добавьте к приложению модуль на языке C: bool my_callback_mouse_change (uhc_device_t* dev, bool b_plug) { if (b_plug) { my_display_on_mouse_icon(); } else { my_display_off_mouse_icon(); } } void my_callback_event_btn_left (bool b_state) { if (b_state) { // Вставьте здесь обработку нажатия левой кнопки мыши ... } else { // Вставьте здесь обработку отпускания левой кнопки мыши ... } } void my_callback_event_mouse (int8_t x, int8_t y, int8_t scroll) { if (!x) { // Обработка перемещения мыши по оси X cursor_x += x; } if (!y) { // Обработка перемещения мыши по оси Y cursor_y += y; } if (!scroll) { // Обработка прокрутки колесика мыши wheel += scroll; } } [Рабочий процесс] Убедитесь, что файл conf_usb_host.h доступен, и содержит следующую конфигурацию для мыши USB: #define USB_HOST_UHI UHI_HID_MOUSE
Примечание: это определяет список интерфейсов UHI, поддерживаемых хостом USB. #define UHI_HID_MOUSE_CHANGE(dev, b_plug) my_callback_mouse_change (dev, b_plug)
extern bool my_callback_mouse_change(uhc_device_t* dev, bool b_plug); Примечание: этот callback вызывается, когда устройство USB HID мыши подключается к хосту или отключается от него. #define UHI_HID_MOUSE_EVENT_BTN_LEFT(b_state) my_callback_event_btn_left(b_state)
extern void my_callback_event_btn_left(bool b_state); #define UHI_HID_MOUSE_EVENT_BTN_RIGHT(b_state) my_callback_event_btn_right(b_state)
extern void my_callback_event_btn_right(bool b_state); #define UHI_HID_MOUSE_EVENT_BTN_MIDDLE(b_state) my_callback_event_btn_middle(b_state)
extern void my_callback_event_btn_middle(bool b_state); #define UHI_HID_MOUSE_EVENT_MOVE(x, y, scroll) my_callback_event_mouse(x, y, scroll)
extern void my_callback_event_mouse(int8_t x, int8_t y, int8_t scroll) Примечание: эти функции обратного вызова (callback) вызываются, когда получено событие устройства USB мыши. Для продвинутого использования модуля UHI CDC см. следующие случаи: • Как разрешить поддержку USB High Speed. Для всех этих трех примеров требуется предварительная настойка UHI. Убедитесь, что для модуля UHI выполнены базовые шаги настройки (см. раздел "Базовая настройка хоста USB"). [Как разрешить поддержку USB High Speed] Содержимое файла conf_usb_host.h: #define USB_HOST_HS_SUPPORT
Убедитесь, что файл conf_usb_host.h и в нем определен макрос USB_HOST_HS_SUPPORT, включающий режим USB high speed для работы с устройствами (скорость обмена до 480 мегабит/сек). В этом случае хост USB может работать сразу с несколькими классами устройств USB. Содержимое файла conf_usb_host.h: #define USB_HOST_UHI UHI_HID_MOUSE, UHI_MSC, UHI_CDC
Убедитесь, что для исходного кода доступен файл conf_usb_host.h, где определены параметры UHI_HID_MOUSE, UHI_MSC, UHI_CDC. Примечание: в макросе USB_HOST_UHI определяется список интерфейсов UHI, поддерживаемых хостом USB. Здесь Вы должны добавить поддержку тех классов устройств USB, которые хотите поддерживать. [Поддержка двойной роли] В этом случае разрешена работа как хоста, так и устройства USB, что называется двойной ролью. Примечание: для плат разработчика компании Atmel переключение между ролями стека USB управляется автоматически благодаря наличия коннектора USB On-The-Go (OTG) и находящемуся в нем сигналу вывода идентификации роли (USB ID pin). Подробнее см. секцию "Двойная роль" в апноуте AVR4950 [2]. Содержимое файла conf_usb_host.h: #define UHC_MODE_CHANGE(b_host_mode) my_callback_mode_change(b_host_mode)
extern void my_callback_mode_change(bool b_host_mode); Добавьте к приложению модуль на языке C: void usb_init(void) { //udc_start(); uhc_start(); } bool my_host_mode;
void my_callback_mode_change(bool b_host_mode) { my_host_mode = b_host_mode; } void my_usb_task(void) { if (my_host_mode) { // Вызов задачи хоста USB } else { // Вызов задачи устройства USB } } Как это работает: 1. В случае двойных ролей USB (устройство USB или хост USB) стек USB должен быть разрешен вызовом uhc_start(), и udc_start() вызываться не должен. //udc_start();
uhc_start();
2. В двойной роли, чтобы определить текущий режим USB может использоваться callback для оповещения об изменениях режима. • Убедитесь, что conf_usb_host.h содержит следующие параметры: #define UHC_MODE_CHANGE(b_host_mode) my_callback_mode_change(b_host_mode)
extern void my_callback_mode_change(bool b_host_mode); • Убедитесь, что приложение содержит следующий код: bool my_host_mode;
void my_callback_mode_change(bool b_host_mode) { my_host_mode = b_host_mode; } void my_usb_task(void) { if (my_host_mode) { // Вызов задачи хоста USB } else { // Вызов задачи устройства USB } } [Примеры конфигурационных файлов] [Поддержка одного UHI HID мыши] #ifndef _CONF_USB_HOST_H_
#define _CONF_USB_HOST_H_
#include "compiler.h"
#define USB_HOST_UHI UHI_HID_MOUSE
#define USB_HOST_POWER_MAX 500
//#define USB_HOST_HUB_SUPPORT
#if (UC3A3||UC3A4)
# define USB_HOST_HS_SUPPORT
#endif
//#define UHC_MODE_CHANGE(b_host_mode) usb_host_mode_change(b_host_mode)
//#define UHC_VBUS_CHANGE(b_present) usb_host_vbus_change(b_present)
//#define UHC_VBUS_ERROR() usb_host_vbus_error()
//#define UHC_CONNECTION_EVENT(dev,b_present) usb_host_connection_event(dev,b_present)
//#define UHC_WAKEUP_EVENT() usb_host_wakeup_event()
//#define UHC_SOF_EVENT() usb_host_sof_event()
//#define UHC_DEVICE_CONF(dev) uint8_t usb_host_device_conf(dev)
//#define UHC_ENUM_EVENT(dev,b_status) usb_host_enum_event(dev,b_status)
#define UHI_HID_MOUSE_CHANGE(dev,b_plug)
#define UHI_HID_MOUSE_EVENT_BTN_LEFT(b_state)
#define UHI_HID_MOUSE_EVENT_BTN_RIGHT(b_state)
#define UHI_HID_MOUSE_EVENT_BTN_MIDDLE(b_state)
#define UHI_HID_MOUSE_EVENT_MOVE(x,y,scroll)
#include "uhi_hid_mouse.h"
#endif // _CONF_USB_HOST_H_ [Поддержка нескольких UHI HID мышей (композитное устройство)] #ifndef _CONF_USB_HOST_H_
#define _CONF_USB_HOST_H_
#include "compiler.h"
#define USB_HOST_UHI // UHI_MSC, UHI_HID_MOUSE, UHI_CDC, UHI_VENDOR #define USB_HOST_POWER_MAX 500
// #define USB_HOST_HUB_SUPPORT
#if (UC3A3 || UC3A4)
# define USB_HOST_HS_SUPPORT
#endif
//#define UHC_MODE_CHANGE(b_host_mode) usb_host_mode_change(b_host_mode)
//#define UHC_VBUS_CHANGE(b_present) usb_host_vbus_change(b_present)
//#define UHC_VBUS_ERROR() usb_host_vbus_error()
//#define UHC_CONNECTION_EVENT(dev,b_present) usb_host_connection_event(dev,b_present)
//#define UHC_WAKEUP_EVENT() usb_host_wakeup_event()
//#define UHC_SOF_EVENT() usb_host_sof_event()
//#define UHC_DEVICE_CONF(dev) uint8_t usb_host_device_conf(dev)
//#define UHC_ENUM_EVENT(dev,b_status) usb_host_enum_event(dev,b_status)
#define UHI_HID_MOUSE_CHANGE(dev,b_plug)
#define UHI_HID_MOUSE_EVENT_BTN_LEFT(b_state)
#define UHI_HID_MOUSE_EVENT_BTN_RIGHT(b_state)
#define UHI_HID_MOUSE_EVENT_BTN_MIDDLE(b_state)
#define UHI_HID_MOUSE_EVENT_MOVE(x,y,scroll)
#define UHI_MSC_CHANGE(dev,b_plug)
#define UHI_CDC_CHANGE(dev,b_plug)
#define UHI_CDC_RX_NOTIFY()
#define UHI_VENDOR_CHANGE(dev, b_plug)
#define UHI_VENDOR_VID_PID_LIST {USB_VID_ATMEL, USB_PID_ATMEL_ASF_VENDOR_CLASS}
//#include "uhi_msc.h"
//#include "uhi_hid_mouse.h"
#endif // _CONF_USB_HOST_H_ [Микроконтроллеры AT32UC3A0, AT32UC3A1, AT32UC3B (USBB)] #ifndef CONF_CLOCK_H_INCLUDED
#define CONF_CLOCK_H_INCLUDED
/* ===== Опции источника системной тактовой частоты */
//#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_RCSYS
#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_OSC0
//#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_PLL0
/* ===== Опции PLL0 */
//#define CONFIG_PLL0_SOURCE PLL_SRC_OSC0
//#define CONFIG_PLL0_SOURCE PLL_SRC_OSC1
//#define CONFIG_PLL0_MUL 4 /* Fpll = (Fclk * PLL_mul) / PLL_div */
//#define CONFIG_PLL0_DIV 1 /* Fpll = (Fclk * PLL_mul) / PLL_div */
/* ===== Опции PLL1 */
#define CONFIG_PLL1_SOURCE PLL_SRC_OSC0
//#define CONFIG_PLL1_SOURCE PLL_SRC_OSC1
#define CONFIG_PLL1_MUL 8 /* Fpll = (Fclk * PLL_mul) / PLL_div */ #define CONFIG_PLL1_DIV 2 /* Fpll = (Fclk * PLL_mul) / PLL_div */ /* ===== Опции коэффициента деления тактовой частоты системной шины */
//#define CONFIG_SYSCLK_CPU_DIV 0 /* Fcpu = Fsys/(2 ^ CPU_div) */
//#define CONFIG_SYSCLK_PBA_DIV 0 /* Fpba = Fsys/(2 ^ PBA_div) */
//#define CONFIG_SYSCLK_PBB_DIV 0 /* Fpbb = Fsys/(2 ^ PBB_div) */
/* ===== Опции управления тактовой частотой периферийных устройств */
//#define CONFIG_SYSCLK_INIT_CPUMASK ((1 << SYSCLK_SYSTIMER) | (1 << SYSCLK_OCD))
//#define CONFIG_SYSCLK_INIT_PBAMASK (1 << SYSCLK_USART0)
//#define CONFIG_SYSCLK_INIT_PBBMASK (1 << SYSCLK_HMATRIX)
//#define CONFIG_SYSCLK_INIT_HSBMASK (1 << SYSCLK_MDMA_HSB)
/* ===== Опции тактирования USB */
//#define CONFIG_USBCLK_SOURCE USBCLK_SRC_OSC0
//#define CONFIG_USBCLK_SOURCE USBCLK_SRC_PLL0
#define CONFIG_USBCLK_SOURCE USBCLK_SRC_PLL1
#define CONFIG_USBCLK_DIV 1 /* Fusb = Fsys/(2 ^ USB_div) */ #endif /* CONF_CLOCK_H_INCLUDED */ [Микроконтроллеры AT32UC3A3 и AT32UC3A4 (USBB с поддержкой High Speed)] #ifndef CONF_CLOCK_H_INCLUDED
#define CONF_CLOCK_H_INCLUDED
/* ===== Опции источника системной тактовой частоты */
//#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_RCSYS
#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_OSC0
//#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_PLL0
/* ===== Опции PLL0 */
#define CONFIG_PLL0_SOURCE PLL_SRC_OSC0
//#define CONFIG_PLL0_SOURCE PLL_SRC_OSC1
#define CONFIG_PLL0_MUL 11 /* Fpll = (Fclk * PLL_mul) / PLL_div */ #define CONFIG_PLL0_DIV 2 /* Fpll = (Fclk * PLL_mul) / PLL_div */ /* ===== Опции PLL1 */
//#define CONFIG_PLL1_SOURCE PLL_SRC_OSC0
//#define CONFIG_PLL1_SOURCE PLL_SRC_OSC1
//#define CONFIG_PLL1_MUL 8 /* Fpll = (Fclk * PLL_mul) / PLL_div */
//#define CONFIG_PLL1_DIV 2 /* Fpll = (Fclk * PLL_mul) / PLL_div */
/* ===== Опции коэффициента деления тактовой частоты системной шины */
#define CONFIG_SYSCLK_CPU_DIV 0 /* Fcpu = Fsys/(2 ^ CPU_div) */ #define CONFIG_SYSCLK_PBA_DIV 0 /* Fpba = Fsys/(2 ^ PBA_div) */ //#define CONFIG_SYSCLK_PBB_DIV 0 /* Fpbb = Fsys/(2 ^ PBB_div) */
/* ===== Опции управления тактовой частотой периферийных устройств */
//#define CONFIG_SYSCLK_INIT_CPUMASK ((1 << SYSCLK_SYSTIMER) | (1 << SYSCLK_OCD))
//#define CONFIG_SYSCLK_INIT_PBAMASK (1 << SYSCLK_USART0)
//#define CONFIG_SYSCLK_INIT_PBBMASK (1 << SYSCLK_HMATRIX)
//#define CONFIG_SYSCLK_INIT_HSBMASK (1 << SYSCLK_MDMA_HSB)
/* ===== Опции тактирования USB */
#define CONFIG_USBCLK_SOURCE USBCLK_SRC_OSC0
//#define CONFIG_USBCLK_SOURCE USBCLK_SRC_PLL0
//#define CONFIG_USBCLK_SOURCE USBCLK_SRC_PLL1
#define CONFIG_USBCLK_DIV 1 /* Fusb = Fsys/(2 ^ USB_div) */ #endif /* CONF_CLOCK_H_INCLUDED */ [Микроконтроллеры AT32UC3C, ATUCXXD, ATUCXXL3U, ATUCXXL4U (USBC)] #ifndef CONF_CLOCK_H_INCLUDED
#define CONF_CLOCK_H_INCLUDED
/* ===== Опции источника системной тактовой частоты */
//#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_RCSYS
//#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_OSC0
//#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_OSC1
#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_PLL0
//#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_PLL1
//#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_RC8M
/* ===== Опции PLL0 */
#define CONFIG_PLL0_SOURCE PLL_SRC_OSC0
//#define CONFIG_PLL0_SOURCE PLL_SRC_OSC1
//#define CONFIG_PLL0_SOURCE PLL_SRC_RC8M
#define CONFIG_PLL0_MUL 3 /* Fpll = (Fclk * PLL_mul) / PLL_div */ #define CONFIG_PLL0_DIV 1 /* Fpll = (Fclk * PLL_mul) / PLL_div */ /* ===== Опции PLL1 */
//#define CONFIG_PLL1_SOURCE PLL_SRC_OSC0
//#define CONFIG_PLL1_SOURCE PLL_SRC_OSC1
//#define CONFIG_PLL1_SOURCE PLL_SRC_RC8M
//#define CONFIG_PLL1_MUL 3 /* Fpll = (Fclk * PLL_mul) / PLL_div */
//#define CONFIG_PLL1_DIV 1 /* Fpll = (Fclk * PLL_mul) / PLL_div */
/* ===== Опции коэффициента деления тактовой частоты системной шины */
//#define CONFIG_SYSCLK_CPU_DIV 0 /* Fcpu = Fsys/(2 ^ CPU_div) */
//#define CONFIG_SYSCLK_PBA_DIV 0 /* Fpba = Fsys/(2 ^ PBA_div) */
//#define CONFIG_SYSCLK_PBB_DIV 0 /* Fpbb = Fsys/(2 ^ PBB_div) */
//#define CONFIG_SYSCLK_PBC_DIV 0 /* Fpbc = Fsys/(2 ^ PBC_div) */
/* ===== Опции управления тактовой частотой периферийных устройств */
//#define CONFIG_SYSCLK_INIT_CPUMASK ((1 << SYSCLK_SYSTIMER) | (1 << SYSCLK_OCD))
//#define CONFIG_SYSCLK_INIT_PBAMASK (1 << SYSCLK_USART0)
//#define CONFIG_SYSCLK_INIT_PBBMASK (1 << SYSCLK_HMATRIX)
//#define CONFIG_SYSCLK_INIT_HSBMASK (1 << SYSCLK_MDMA_HSB)
/* ===== Опции тактирования USB */
//#define CONFIG_USBCLK_SOURCE USBCLK_SRC_OSC0
//#define CONFIG_USBCLK_SOURCE USBCLK_SRC_OSC1
#define CONFIG_USBCLK_SOURCE USBCLK_SRC_PLL0
//#define CONFIG_USBCLK_SOURCE USBCLK_SRC_PLL1
#define CONFIG_USBCLK_DIV 1 /* Fusb = Fsys/(2 ^ USB_div) */ #endif /* CONF_CLOCK_H_INCLUDED */ [Микроконтроллеры SAM3X и SAM3A (UOTGHS: USB OTG High Speed)] #ifndef CONF_CLOCK_H_INCLUDED
#define CONF_CLOCK_H_INCLUDED
/* ===== Опции источника системной тактовой частоты (MCK) */
//#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_SLCK_RC
//#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_SLCK_XTAL
//#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_SLCK_BYPASS
//#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_MAINCK_4M_RC
//#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_MAINCK_8M_RC
//#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_MAINCK_12M_RC
//#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_MAINCK_XTAL
//#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_MAINCK_BYPASS
#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_PLLACK
//#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_UPLLCK
/* ===== Опции прескалера MCK (Fmck = Fsys / (SYSCLK_PRES)) */
//#define CONFIG_SYSCLK_PRES SYSCLK_PRES_1
#define CONFIG_SYSCLK_PRES SYSCLK_PRES_2
//#define CONFIG_SYSCLK_PRES SYSCLK_PRES_4
//#define CONFIG_SYSCLK_PRES SYSCLK_PRES_8
//#define CONFIG_SYSCLK_PRES SYSCLK_PRES_16
//#define CONFIG_SYSCLK_PRES SYSCLK_PRES_32
//#define CONFIG_SYSCLK_PRES SYSCLK_PRES_64
//#define CONFIG_SYSCLK_PRES SYSCLK_PRES_3
/* ===== Опции PLL0 (A) (Fpll = (Fclk * PLL_mul) / PLL_div)
Используйте здесь эффективные значения mul и div. */
#define CONFIG_PLL0_SOURCE PLL_SRC_MAINCK_XTAL
#define CONFIG_PLL0_MUL 14#define CONFIG_PLL0_DIV 1 /* ===== UPLL (UTMI) аппаратная скорость фиксирована на 480 МГц. */
/* ===== Опции тактирования USB (Fusb = FpllX / USB_div)
Используйте здесь эффективное значение div. */
//#define CONFIG_USBCLK_SOURCE USBCLK_SRC_PLL0
#define CONFIG_USBCLK_SOURCE USBCLK_SRC_UPLL
#define CONFIG_USBCLK_DIV 1
/*===== Частота целевого процессора (частота системы)
- Частота XTAL (кварц): 12 МГц
- Источник системной тактовой частоты: PLLA
- Прескалер системной тактовой частоты: 2 (деление на 2)
- Источник тактов для PLLA: XTAL
- Выход PLLA: XTAL * 14 / 1
- Частота тактов системы: 12 * 14 / 1 /2 = 84 МГц
===== Тактовая частота USB
- Источник тактов USB: UPLL
- Делитель тактов USB: 1 (отсутствие деления)
- Частота UPLL: 480 МГц
- Частота тактов USB: 480 / 1 = 480 МГц
*/
#endif /* CONF_CLOCK_H_INCLUDED */ [Микроконтроллеры SAM D21 (USB)] #include < clock.h >
#ifndef CONF_CLOCKS_H_INCLUDED
#define CONF_CLOCKS_H_INCLUDED
/* Конфигурация тактов системной шины */
# define CONF_CLOCK_CPU_CLOCK_FAILURE_DETECT false
# define CONF_CLOCK_FLASH_WAIT_STATES 2
# define CONF_CLOCK_CPU_DIVIDER SYSTEM_MAIN_CLOCK_DIV_1
# define CONF_CLOCK_APBA_DIVIDER SYSTEM_MAIN_CLOCK_DIV_1
# define CONF_CLOCK_APBB_DIVIDER SYSTEM_MAIN_CLOCK_DIV_1
# define CONF_CLOCK_APBC_DIVIDER SYSTEM_MAIN_CLOCK_DIV_1 # define CONF_CLOCK_OSC8M_PRESCALER SYSTEM_OSC8M_DIV_1
# define CONF_CLOCK_OSC8M_ON_DEMAND true
# define CONF_CLOCK_OSC8M_RUN_IN_STANDBY true
/* Конфигурация SYSTEM_CLOCK_SOURCE_XOSC - внешний генератор тактов */
# define CONF_CLOCK_XOSC_ENABLE false
# define CONF_CLOCK_XOSC_EXTERNAL_CRYSTAL SYSTEM_CLOCK_EXTERNAL_CRYSTAL
# define CONF_CLOCK_XOSC_EXTERNAL_FREQUENCY 12000000UL
# define CONF_CLOCK_XOSC_STARTUP_TIME SYSTEM_XOSC_STARTUP_32768
# define CONF_CLOCK_XOSC_AUTO_GAIN_CONTROL true
# define CONF_CLOCK_XOSC_ON_DEMAND true
# define CONF_CLOCK_XOSC_RUN_IN_STANDBY false # define CONF_CLOCK_XOSC32K_ENABLE true
# define CONF_CLOCK_XOSC32K_EXTERNAL_CRYSTAL SYSTEM_CLOCK_EXTERNAL_CRYSTAL
# define CONF_CLOCK_XOSC32K_STARTUP_TIME SYSTEM_XOSC32K_STARTUP_65536
# define CONF_CLOCK_XOSC32K_AUTO_AMPLITUDE_CONTROL false
# define CONF_CLOCK_XOSC32K_ENABLE_1KHZ_OUPUT false
# define CONF_CLOCK_XOSC32K_ENABLE_32KHZ_OUTPUT true
# define CONF_CLOCK_XOSC32K_ON_DEMAND false
# define CONF_CLOCK_XOSC32K_RUN_IN_STANDBY true
/* Конфигурация SYSTEM_CLOCK_SOURCE_OSC32K - внутренний генератор 32 кГц */
# define CONF_CLOCK_OSC32K_ENABLE false
# define CONF_CLOCK_OSC32K_STARTUP_TIME SYSTEM_OSC32K_STARTUP_130
# define CONF_CLOCK_OSC32K_ENABLE_1KHZ_OUTPUT false
# define CONF_CLOCK_OSC32K_ENABLE_32KHZ_OUTPUT true
# define CONF_CLOCK_OSC32K_ON_DEMAND true
# define CONF_CLOCK_OSC32K_RUN_IN_STANDBY false
/* Конфигурация SYSTEM_CLOCK_SOURCE_DFLL цифровая петля DFLL */
# define CONF_CLOCK_DFLL_ENABLE true
# define CONF_CLOCK_DFLL_LOOP_MODE SYSTEM_CLOCK_DFLL_LOOP_MODE_CLOSED
# define CONF_CLOCK_DFLL_ON_DEMAND true
/* Конфигурация режима открытой петли DFLL */
# define CONF_CLOCK_DFLL_FINE_VALUE (512)
/* Конфигурация режиме закрытой петли DFLL */
# define CONF_CLOCK_DFLL_SOURCE_GCLK_GENERATOR GCLK_GENERATOR_1
# define CONF_CLOCK_DFLL_MULTIPLY_FACTOR (48000000/32768)
# define CONF_CLOCK_DFLL_QUICK_LOCK true
# define CONF_CLOCK_DFLL_TRACK_AFTER_FINE_LOCK true
# define CONF_CLOCK_DFLL_KEEP_LOCK_ON_WAKEUP true
# define CONF_CLOCK_DFLL_ENABLE_CHILL_CYCLE true
# define CONF_CLOCK_DFLL_MAX_COARSE_STEP_SIZE (0x1f / 8)
# define CONF_CLOCK_DFLL_MAX_FINE_STEP_SIZE (0xff / 8)
/* Конфигурация SYSTEM_CLOCK_SOURCE_DPLL - цифровая петля DPLL */
# define CONF_CLOCK_DPLL_ENABLE false
# define CONF_CLOCK_DPLL_ON_DEMAND false
# define CONF_CLOCK_DPLL_RUN_IN_STANDBY true
# define CONF_CLOCK_DPLL_LOCK_BYPASS false
# define CONF_CLOCK_DPLL_WAKE_UP_FAST false
# define CONF_CLOCK_DPLL_LOW_POWER_ENABLE true
# define CONF_CLOCK_DPLL_LOCK_TIME SYSTEM_CLOCK_SOURCE_DPLL_LOCK_TIME_DEFAULT
# define CONF_CLOCK_DPLL_REFERENCE_CLOCK SYSTEM_CLOCK_SOURCE_DPLL_REFERENCE_CLOCK_XOSC32K
# define CONF_CLOCK_DPLL_FILTER SYSTEM_CLOCK_SOURCE_DPLL_FILTER_DEFAULT
# define CONF_CLOCK_DPLL_REFERENCE_FREQUENCY 32768
# define CONF_CLOCK_DPLL_REFERENCE_DIVIDER 1
# define CONF_CLOCK_DPLL_OUTPUT_FREQUENCY 48000000
/* Конфигурация опорная частота DPLL GCLK */
# define CONF_CLOCK_DPLL_REFERENCE_GCLK_GENERATOR GCLK_GENERATOR_1
/* Конфигурация таймера петли DPLL GCLK */
# define CONF_CLOCK_DPLL_LOCK_GCLK_GENERATOR GCLK_GENERATOR_1
/* Установите это в true, чтобы конфигурировать GCLK, когда работает
* clocks_init. Если это установить в false, то в clocks_init()
* не будет сконфигурирован ни один из генераторов. */
# define CONF_CLOCK_CONFIGURE_GCLK true
/* Конфигурация GCLK генератора 0 (главная тактовая частота) */
# define CONF_CLOCK_GCLK_0_ENABLE true
# define CONF_CLOCK_GCLK_0_RUN_IN_STANDBY true
# define CONF_CLOCK_GCLK_0_CLOCK_SOURCE SYSTEM_CLOCK_SOURCE_DFLL
# define CONF_CLOCK_GCLK_0_PRESCALER 1
# define CONF_CLOCK_GCLK_0_OUTPUT_ENABLE false
/* Конфигурация GCLK генератора 1 */
# define CONF_CLOCK_GCLK_1_ENABLE true
# define CONF_CLOCK_GCLK_1_RUN_IN_STANDBY false
# define CONF_CLOCK_GCLK_1_CLOCK_SOURCE SYSTEM_CLOCK_SOURCE_XOSC32K
# define CONF_CLOCK_GCLK_1_PRESCALER 1
# define CONF_CLOCK_GCLK_1_OUTPUT_ENABLE false
/* Конфигурация GCLK генератора 2 (RTC) */
# define CONF_CLOCK_GCLK_2_ENABLE false
# define CONF_CLOCK_GCLK_2_RUN_IN_STANDBY false
# define CONF_CLOCK_GCLK_2_CLOCK_SOURCE SYSTEM_CLOCK_SOURCE_OSC32K
# define CONF_CLOCK_GCLK_2_PRESCALER 32
# define CONF_CLOCK_GCLK_2_OUTPUT_ENABLE false
/* Конфигурация GCLK генератора 3 */
# define CONF_CLOCK_GCLK_3_ENABLE false
# define CONF_CLOCK_GCLK_3_RUN_IN_STANDBY false
# define CONF_CLOCK_GCLK_3_CLOCK_SOURCE SYSTEM_CLOCK_SOURCE_OSC8M
# define CONF_CLOCK_GCLK_3_PRESCALER 1
# define CONF_CLOCK_GCLK_3_OUTPUT_ENABLE false
/* Конфигурация GCLK генератора 4 */
# define CONF_CLOCK_GCLK_4_ENABLE false
# define CONF_CLOCK_GCLK_4_RUN_IN_STANDBY false
# define CONF_CLOCK_GCLK_4_CLOCK_SOURCE SYSTEM_CLOCK_SOURCE_OSC8M
# define CONF_CLOCK_GCLK_4_PRESCALER 1
# define CONF_CLOCK_GCLK_4_OUTPUT_ENABLE false
/* Конфигурация GCLK генератора 5 */
# define CONF_CLOCK_GCLK_5_ENABLE false
# define CONF_CLOCK_GCLK_5_RUN_IN_STANDBY false
# define CONF_CLOCK_GCLK_5_CLOCK_SOURCE SYSTEM_CLOCK_SOURCE_OSC8M
# define CONF_CLOCK_GCLK_5_PRESCALER 1
# define CONF_CLOCK_GCLK_5_OUTPUT_ENABLE false
/* Конфигурация GCLK генератора 6 */
# define CONF_CLOCK_GCLK_6_ENABLE false
# define CONF_CLOCK_GCLK_6_RUN_IN_STANDBY false
# define CONF_CLOCK_GCLK_6_CLOCK_SOURCE SYSTEM_CLOCK_SOURCE_OSC8M
# define CONF_CLOCK_GCLK_6_PRESCALER 1
# define CONF_CLOCK_GCLK_6_OUTPUT_ENABLE false
/* Конфигурация GCLK генератора 7 */
# define CONF_CLOCK_GCLK_7_ENABLE false
# define CONF_CLOCK_GCLK_7_RUN_IN_STANDBY false
# define CONF_CLOCK_GCLK_7_CLOCK_SOURCE SYSTEM_CLOCK_SOURCE_OSC8M
# define CONF_CLOCK_GCLK_7_PRESCALER 1
# define CONF_CLOCK_GCLK_7_OUTPUT_ENABLE false
/* Конфигурация GCLK генератора 8 */
# define CONF_CLOCK_GCLK_8_ENABLE false
# define CONF_CLOCK_GCLK_8_RUN_IN_STANDBY false
# define CONF_CLOCK_GCLK_8_CLOCK_SOURCE SYSTEM_CLOCK_SOURCE_OSC8M
# define CONF_CLOCK_GCLK_8_PRESCALER 1
# define CONF_CLOCK_GCLK_8_OUTPUT_ENABLE false
#endif /* CONF_CLOCKS_H_INCLUDED */ [Микроконтроллеры AT32UC3A0, AT32UC3A1, AT32UC3B (USBB)] #ifndef CONF_BOARD_H_INCLUDED
#define CONF_BOARD_H_INCLUDED
// Для этого примера нужны только настройки по умолчанию для платы (переключатели/светодиоды)
#endif /* CONF_BOARD_H_INCLUDED */ [Микроконтроллеры AT32UC3A3 и AT32UC3A4 (USBB с поддержкой High Speed)] #ifndef CONF_BOARD_H_INCLUDED
#define CONF_BOARD_H_INCLUDED
// Для этого примера нужны только настройки по умолчанию для платы (переключатели/светодиоды)
#endif /* CONF_BOARD_H_INCLUDED */ [Микроконтроллеры AT32UC3C, ATUCXXD, ATUCXXL3U, ATUCXXL4U (USBC)] #ifndef CONF_BOARD_H_INCLUDED
#define CONF_BOARD_H_INCLUDED
// Для этого примера нужны только настройки по умолчанию для платы (переключатели/светодиоды)
#endif /* CONF_BOARD_H_INCLUDED */ [Микроконтроллеры SAM3X и SAM3A (UOTGHS: USB OTG High Speed)] #ifndef CONF_BOARD_H_INCLUDED
#define CONF_BOARD_H_INCLUDED
/* Описание выводов, соответствующих Rxd, Txd (выводы UART) */
//#define CONSOLE_PINS {PINS_UART}/* Hw ID USART используется консолью (UART0) */ //#define CONSOLE_UART_ID ID_UART
/* Конфигурирование выводов UART */
//#define CONF_BOARD_UART_CONSOLE
/* Пример конфигурирования выводов ADC */
//#define CONF_BOARD_ADC
/* Конфигурирование вывода PWM LED0 */
//#define CONF_BOARD_PWM_LED0
/* Конфигурирование вывода PWM LED1 */
//#define CONF_BOARD_PWM_LED1
/* Конфигурирование вывода PWM LED2 */
//#define CONF_BOARD_PWM_LED2
/* Конфигурирование выводов SPI0 */
//#define CONF_BOARD_SPI0
//#define CONF_BOARD_SPI0_NPCS0
//#define CONF_BOARD_SPI0_NPCS1
//#define CONF_BOARD_SPI0_NPCS2
//#define CONF_BOARD_SPI0_NPCS3
/* Конфигурирование выводов SPI1 */
//#define CONF_BOARD_SPI1
//#define CONF_BOARD_SPI1_NPCS0
//#define CONF_BOARD_SPI1_NPCS1
//#define CONF_BOARD_SPI1_NPCS2
//#define CONF_BOARD_SPI1_NPCS3
/* Конфигурирование выводов I2C (TWI) */
//#define CONF_BOARD_TWI0
//#define CONF_BOARD_TWI1
/* Конфигурирование вывода RXD USART */
//#define CONF_BOARD_USART_RXD/* Конфигурирование вывода TXD USART */ //#define CONF_BOARD_USART_TXD
/* Конфигурирование вывода CTS USART */
//#define CONF_BOARD_USART_CTS
/* Конфигурирование вывода RTS USART */
//#define CONF_BOARD_USART_RTS
/* Конфигурирование вывода SCK синхронного обмена USART */
//#define CONF_BOARD_USART_SCK
/* Конфигурирование вывода разрешения ADM3312 */
//#define CONF_BOARD_ADM3312_EN
/* Конфигурирование вывода выключения трансивера IrDA */
//#define CONF_BOARD_TFDU4300_SD
/* Конфигурирование вывода ADM3485 RE трансивера RS485 */
//#define CONF_BOARD_ADM3485_RE
//#define CONF_BOARD_SMC_PSRAM
/* Конфигурирование выводов LCD EBI */
//#define CONF_BOARD_HX8347A
/* Конфигурирование вывода управления подсветкой */
//#define CONF_BOARD_AAT3194
/* Конфигурирование выводов USB */
#define CONF_BOARD_USB_PORT
#endif /* CONF_BOARD_H_INCLUDED */ [Микроконтроллеры SAM D21 (USB)] #ifndef CONF_BOARD_H_INCLUDED
#define CONF_BOARD_H_INCLUDED
/* Разрешение детектирования USB VBUS */
#define CONF_BOARD_USB_VBUS_DETECT
/* Разрешено детектирование ID */
#define CONF_BOARD_USB_ID_DETECT
#endif /* CONF_BOARD_H_INCLUDED */ Для FAQ и примеров посетите центр техподдержки Atmel [3]. [Базовая настройка хоста USB] Конфигурация пользователя хоста USB. Следующая конфигурация должна быть включена в файл conf_usb_host.h приложения: 1. USB_HOST_UHI (список UHI API). Здесь определяется список интерфейсов UHI, поддерживаемые хостом USB (например: UHI_MSC, UHI_HID_MOUSE). Пользовательский callback хоста USB. Можно опционально определить следующие функции обратного вызова (callback) хоста USB в файле conf_usb_host.h приложения: 1. void UHC_MODE_CHANGE (bool b_host_mode). Служит для оповещение, что автоматически переключился режим USB (хост USB или устройство USB). Это возможно только когда доступен вывод идентификации режима (ID pin). Шаги настройки хоста USB. Имеются требования к контроллеру хоста USB (USB Host Controller, UHC), общие для всех хостов USB. Этот модуль основан на полной поддержке прерываний стека хоста USB и поддержке sleepmgr. Для AVR® Atmel® или SMART ARM® микроконтроллеров на основе SAM3/SAM4, поддерживающих службы тактирования. Для микроконтроллеров SAM D21 поддерживается драйвер тактов. Чтобы настройка прошла корректно, должна быть выполнены следующие процедуры: • Указание конфигурации тактирования: Использование службы sleep manager не обязательно, но рекомендуется для уменьшения потребления тока: • Инициализация службы sleep manager. Для микроконтроллеров AVR и SAM3/SAM4 добавьте следующий код инициализации: sysclk_init();
irq_initialize_vectors();
cpu_irq_enable();
board_init();
sleepmgr_init(); // не обязательно
Для микроконтроллеров SAM D21 добавьте следующий код инициализации: system_init();
irq_initialize_vectors();
cpu_irq_enable();
sleepmgr_init(); // не обязательно
Добавьте ожидание в главный цикл (main IDLE loop): sleepmgr_enter_sleep(); // не обязательно
Пример кода USB Host Controller (UHC). Это общий пример кода для всех хостов USB. Содержимое файла conf_usb_host.h: #define USB_HOST_POWER_MAX 500
Добавьте к приложению модуль на языке C: void usb_init(void) { uhc_start(); } Работа USB Device Controller (UHC). Здесь показан рабочий процесс хоста для всех устройств USB. 1. Убедитесь, что в файле conf_usb_host.h доступна основная конфигурация устройства USB: // Максимально допустимый ток от VBUS (mA), который зависит от генератора 5V.
#define USB_HOST_POWER_MAX 500 // (500mA) 2. Вызовите функцию запуска стека хоста USB, чтобы разрешить его работу: uhc_start(); Содержимое conf_clock.h для AT32UC3A0, AT32UC3A1 и AT32UC3B (USBB): // Конфигурация, основанная на внешней частоте тактов 12 МГц OSC:
#define CONFIG_PLL1_SOURCE PLL_SRC_OSC0
#define CONFIG_PLL1_MUL 8
#define CONFIG_PLL1_DIV 2
#define CONFIG_USBCLK_SOURCE USBCLK_SRC_PLL1
#define CONFIG_USBCLK_DIV 1 // Fusb = Fsys/(2 ^ USB_div) Содержимое conf_clock.h для AT32UC3A3 и AT32UC3A4 (с поддержкой USBB High Speed): // Конфигурация, основанная на внешней частоте тактов 12 МГц OSC:
#define CONFIG_USBCLK_SOURCE USBCLK_SRC_OSC0
#define CONFIG_USBCLK_DIV 1 // Fusb = Fsys/(2 ^ USB_div) Содержимое conf_clock.h для AT32UC3C (USBC): // Конфигурация, основанная на внешней частоте тактов 12 МГц OSC:
#define CONFIG_PLL1_SOURCE PLL_SRC_OSC0
#define CONFIG_PLL1_MUL 8
#define CONFIG_PLL1_DIV 2
#define CONFIG_USBCLK_SOURCE USBCLK_SRC_PLL1
#define CONFIG_USBCLK_DIV 1 // Fusb = Fsys/(2 ^ USB_div) // Нужна тактовая частота CPU > 25 МГц для работы с USBC
#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_PLL1
Содержимое conf_clock.h для SAM3X и SAM3A (UOTGHS: USB OTG High Speed): // Тактирование USB фиксировано на UPLL.
#define CONFIG_USBCLK_SOURCE USBCLK_SRC_UPLL
#define CONFIG_USBCLK_DIV 1
Содержимое conf_clock.h для SAM D21 (USB): // Тактирование USB фиксировано на UPLL.
// Конфигурация SYSTEM_CLOCK_SOURCE_XOSC32K - внешний
// генератор 32 кГц
# define CONF_CLOCK_XOSC32K_ENABLE true
# define CONF_CLOCK_XOSC32K_EXTERNAL_CRYSTAL SYSTEM_CLOCK_EXTERNAL_CRYSTAL
# define CONF_CLOCK_XOSC32K_STARTUP_TIME SYSTEM_XOSC32K_STARTUP_65536
# define CONF_CLOCK_XOSC32K_AUTO_AMPLITUDE_CONTROL false
# define CONF_CLOCK_XOSC32K_ENABLE_1KHZ_OUPUT false
# define CONF_CLOCK_XOSC32K_ENABLE_32KHZ_OUTPUT true
# define CONF_CLOCK_XOSC32K_ON_DEMAND false
# define CONF_CLOCK_XOSC32K_RUN_IN_STANDBY true
// Конфигурация SYSTEM_CLOCK_SOURCE_DFLL - DFLL (Digital Frequency Locked Loop)
# define CONF_CLOCK_DFLL_ENABLE true
# define CONF_CLOCK_DFLL_LOOP_MODE SYSTEM_CLOCK_DFLL_LOOP_MODE_CLOSED
# define CONF_CLOCK_DFLL_ON_DEMAND true
// Конфигурация закрытой петли DFLL
# define CONF_CLOCK_DFLL_SOURCE_GCLK_GENERATOR GCLK_GENERATOR_1
# define CONF_CLOCK_DFLL_MULTIPLY_FACTOR (48000000/32768)
# define CONF_CLOCK_DFLL_QUICK_LOCK true
# define CONF_CLOCK_DFLL_TRACK_AFTER_FINE_LOCK true
# define CONF_CLOCK_DFLL_KEEP_LOCK_ON_WAKEUP true
# define CONF_CLOCK_DFLL_ENABLE_CHILL_CYCLE true
# define CONF_CLOCK_DFLL_MAX_COARSE_STEP_SIZE (0x1f / 8)
# define CONF_CLOCK_DFLL_MAX_FINE_STEP_SIZE (0xff / 8)
# define CONF_CLOCK_CONFIGURE_GCLK true
// Конфигурация GCLK генератора 0 (основная тактовая частота)
# define CONF_CLOCK_GCLK_0_ENABLE true
# define CONF_CLOCK_GCLK_0_RUN_IN_STANDBY true
# define CONF_CLOCK_GCLK_0_CLOCK_SOURCE SYSTEM_CLOCK_SOURCE_DFLL
# define CONF_CLOCK_GCLK_0_PRESCALER 1
# define CONF_CLOCK_GCLK_0_OUTPUT_ENABLE false
// Конфигурация GCLK генератора 1
# define CONF_CLOCK_GCLK_1_ENABLE true
# define CONF_CLOCK_GCLK_1_RUN_IN_STANDBY false
# define CONF_CLOCK_GCLK_1_CLOCK_SOURCE SYSTEM_CLOCK_SOURCE_XOSC32K
# define CONF_CLOCK_GCLK_1_PRESCALER 1
# define CONF_CLOCK_GCLK_1_OUTPUT_ENABLE true
[Ссылки] 1. AT09337: USB Host Interface (UHI) for Human Interface Device Mouse (HID Mouse) site:atmel.com. |