Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR...

 
Опции темы
Непрочитано 19.10.2014, 23:30  
Эдуард1978
Частый гость
 
Регистрация: 04.09.2014
Сообщений: 23
Сказал спасибо: 10
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Эдуард1978 на пути к лучшему
По умолчанию Re: USB на AT90USBxxx под ASM

Сообщение от AlexWonder Посмотреть сообщение
это как?!
Если ты его принимаешь - то почему не можешь обработать?

Единственное что могу предположить - то, что ты не вписываешься во временные параметры.

для анализа общения по USB могу порекомендовать 2 проги, USBlyzer и Bus Hound
Ну наконец то ваш проект у меня заработал !!!
Реклама:
Эдуард1978 вне форума  
Непрочитано 31.10.2014, 18:10  
AlexWonder
Частый гость
 
Регистрация: 06.11.2007
Сообщений: 47
Сказал спасибо: 1
Сказали Спасибо 12 раз(а) в 5 сообщении(ях)
AlexWonder на пути к лучшему
По умолчанию Re: USB на AT90USBxxx под ASM

Ну хоть бы написал про свои грабли и как добился результата....
AlexWonder вне форума  
Непрочитано 06.06.2015, 00:41  
Эдуард1978
Частый гость
 
Регистрация: 04.09.2014
Сообщений: 23
Сказал спасибо: 10
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Эдуард1978 на пути к лучшему
По умолчанию Re: USB на AT90USBxxx под ASM

Сообщение от AlexWonder Посмотреть сообщение
Ну хоть бы написал про свои грабли и как добился результата....
Мой проект был реализован под at90usb 162 а именно обмен с bulk точкой



================================================== ===


.MACRO LDX16
LDI XL, LOW(@0)
LDI XH, HIGH(@0)
.ENDMACRO
.
.MACRO LDY16
LDI YL, LOW(@0)
LDI YH, HIGH(@0)
.ENDMACRO

.MACRO LDZ16
LDI ZL, LOW(@0)
LDI ZH, HIGH(@0)
.ENDMACRO

.MACRO LDW16
LDI R24, LOW(@0)
LDI R25, HIGH(@0)
.ENDMACRO

;---------------------------------------------------------
.MACRO SetRegMBit
ori @0,(@1)
.ENDMACRO

.MACRO SetRegBit
ori @0,(1‹‹@1)
.ENDMACRO

.MACRO ClrRegMBit
andi @0,~(@1)
.ENDMACRO

.MACRO ClrRegBit
andi @0,~(1‹‹@1)
.ENDMACRO




.MACRO SetIOMBit
.if @0›0x3F
lds r16,@0
ori r16,(@1)
sts @0,r16
.else
in r16,@0
ori r16,(@1)
out @0,r16
.endif
.ENDMACRO

.MACRO SetIOBit
.if @0›0x3F
lds r16,@0
ori r16,(1‹‹@1)
sts @0,r16
.else
.if @0›31
in r16,@0
ori r16,(1‹‹@1)
out @0,r16
.else
sbi @0,@1
.endif
.endif
.ENDMACRO


.MACRO ClrIOMBit
.if @0›0x3F
lds r16,@0
andi r16,~(@1)
sts @0,r16
.else
in r16,@0
andi r16,~(@1)
out @0,r16
.endif
.ENDMACRO

.MACRO ClrIOBit
.if @0›0x3F
lds r16,@0
andi r16,~(1‹‹@1)
sts @0,r16
.else
.if @0›31
in r16,@0
andi r16,~(1‹‹@1)
out @0,r16
.else
cbi @0,@1
.endif
.endif
.ENDMACRO

;-----------------------------------------------------

.MACRO rjz
brne rjz_next
rjmp @0
rjz_next:
.ENDMACRO

.MACRO jz
brne jz_next
jmp @0
jz_next:

.ENDMACRO

;----------------------------------------------------------

.MACRO SetStack
ldi r16,HIGH(@0)
out SPH,r16
ldi r16,LOW(@0)
out SPL,r16
.ENDMACRO
;-------------- Bit operration -------------

.MACRO SetBit
sbi @0,@1
.ENDMACRO

.MACRO ClrBit
cbi @0,@1
.ENDMACRO

.equ StackSize = 300

.equ FRQ = 8000000
.equ Speed232 = 115200


#define Version "1.4"

.dseg
stack: .byte StackSize
indicator: .byte 16
ConfLen: .byte 2
MaskUSBInt: .byte 1


#define MAX_PACKET_SIZE 0x40

; Варианты USB запроса
#define SETUP_GET_STATUS 0x00
#define SETUP_GET_DEVICE 0x01
#define SETUP_CLEAR_FEATURE 0x01
#define SETUP_GET_STRING 0x03
#define SETUP_SET_FEATURE 0x03
#define SETUP_SET_ADDRESS 0x05
#define SETUP_GET_DESCRIPTOR 0x06
#define SETUP_SET_DESCRIPTOR 0x07
#define SETUP_GET_CONFIGURATION 0x08
#define SETUP_SET_CONFIGURATION 0x09
#define SETUP_GET_INTERFACE 0x0A
#define SETUP_SET_INTERFACE 0x0B
#define SETUP_SYNCH_FRAME 0x0C


//! Типы дискриптора для запроса SETUP_GET_DESCRIPTOR
#define DESCRIPTOR_DEVICE 0x01
#define DESCRIPTOR_CONFIGURATION 0x02
#define DESCRIPTOR_STRING 0x03
#define DESCRIPTOR_INTERFACE 0x04
#define DESCRIPTOR_ENDPOINT 0x05
#define DESCRIPTOR_DEVICE_QUALIFIER 0x06
#define DESCRIPTOR_CONF_OTHER_SPEED 0x07
#define DESCRIPTOR_OTG 0x09
#define DESCRIPTOR_IAD 0x0B


ConfiguratedStatus: .byte 1

#define TRUE 1
#define FALSE 0
#define NULL 0

#define NUM_CONFIGURATIONS 1
#define NUM_INTERFACES 1

#define ConfiguredUSB() while ((USWSTAT&0x3)!=CONFIG_STATE) {}
#define STALL_EP0 EP_STALL0 = 1
#define Send_0Len_pkt UEINTX&=~(TXINI);


#define POWERED_STATE 0x00
#define DEFAULT_STATE 0x01
#define ADDRESS_STATE 0x02
#define CONFIG_STATE 0x03

#define ENDPT_DISABLED 0x00
#define ENDPT_IN_ONLY 0x01
#define ENDPT_OUT_ONLY 0x02
#define ENDPT_CONTROL 0x06 /* enable for in, out and setup */
#define ENDPT_NON_CONTROL 0x0E /* enable for in, and out */

#define TOKEN_OUT (0x01‹‹2)
#define TOKEN_ACK (0x02‹‹2)
#define TOKEN_IN (0x09‹‹2)
#define TOKEN_SETUP (0x0D‹‹2)

#define CLEAR_FEATURE 0x01
#define GET_CONFIGURATION 0x08
#define GET_DESCRIPTOR 0x06
#define GET_INTERFACE 0x0A
#define GET_STATUS 0x00
#define SET_ADDRESS 0x05
#define SET_CONFIGURATION 0x09
#define SET_FEATURE 0x03
#define SET_INTERFACE 0x0B
#define HID_SET_REPORT 0x21
#define HID_GET_REPORT 0xA1
#define VEND_SET_MEMORY 0x80

#define HOSTTODEVICE 0x00
#define HOSTTOINTERFACE 0x01
#define HOSTTOENDPOINT 0x02
#define DEVICETOHOST 0x80
#define INTERFACETOHOST 0x81
#define ENDPOINTTOHOST 0x82

#define EP0OUT 0
#define EP0IN 1
#define EP1OUT 2
#define EP1IN 3
#define EP2OUT 4
#define EP2IN 5

// Descriptor Types
#define DEVICE 1
#define CONFIGURATION 2
#define STRING 3
#define INTERFACE 4
#define ENDPOINT 5




#define TRUE 1
#define FALSE 0
#define NULL 0

#define NUM_CONFIGURATIONS 1
#define NUM_INTERFACES 1

#define ConfiguredUSB() while ((USWSTAT&0x3)!=CONFIG_STATE) {}
#define STALL_EP0 EP_STALL0 = 1
#define Send_0Len_pkt UEINTX&=~(TXINI);

#define NUM_CONFIGURATIONS 1
#define NUM_INTERFACES 1
#define NUM_STRINGS 2
//#define MAX_PACKET_SIZE 8 ; maximum packet size for low-speed peripherals is 8 bytes, for full-speed peripherals it can be 8, 16, 32, or 64 bytes

//; Define the states that the USB interface can be in
#define POWERED_STATE 0x00
#define DEFAULT_STATE 0x01
#define ADDRESS_STATE 0x02
#define CONFIG_STATE 0x03
//; Standard USB requests
#define NO_REQUEST 0xFF
#define GET_STATUS 0x00
#define CLEAR_FEATURE 0x01
#define SET_FEATURE 0x03
#define SET_ADDRESS 0x05
#define GET_DESCRIPTOR 0x06
#define SET_DESCRIPTOR 0x07
#define GET_CONFIGURATION 0x08
#define SET_CONFIGURATION 0x09
#define GET_INTERFACE 0x0A
#define SET_INTERFACE 0x0B
#define SYNCH_FRAME 0x0C

//; HID Class requests
#define GET_REPORT 0x01
#define GET_IDLE 0x02
#define GET_PROTOCOL 0x03
#define SET_REPORT 0x09
#define SET_IDLE 0x0A
#define SET_PROTOCOL 0x0B

#define GET_STRING_DESCRIPTOR 0x66
#define HID_SET_REPORT 0x21
#define VEND_SET_MEMORY 0x80

#define SVCUSBINT 0x01 ‹‹ 2
#define SVCTOKENDONE 0x02 ‹‹ 2
#define SVCRESET 0x03 ‹‹ 2
#define SVCSLEEP 0x04 ‹‹ 2
#define SVCSTALL 0x05 ‹‹ 2
#define SVCERROR 0x06 ‹‹ 2
#define SVCACTIVITY 0x07 ‹‹ 2
#define TOKENOUT 0x08 ‹‹ 2
#define TOKENIN 0x09 ‹‹ 2
#define TOKENSETUP 0x0A ‹‹ 2
#define CLEARFEATURE 0x0B ‹‹ 2
#define GETCONFIG 0x0C ‹‹ 2
#define GETDESCRIPTOR 0x0D ‹‹ 2
#define GETINTERFACE 0x0E ‹‹ 2
#define GETSTATUS 0x0F ‹‹ 2
#define SETADDRESS 0x10 ‹‹ 2
#define SETCONFIG 0x11 ‹‹ 2
#define SETFEATURE 0x12 ‹‹ 2
#define SETINTERFACE 0x13 ‹‹ 2
#define FINISHSETADDRESS 0x14 ‹‹ 2
#define COPYDESC2EP0 0x15 ‹‹ 2
#define COPYSTRINGDESC2EP0 0x16 ‹‹ 2
#define ZEROLENPACKET 0x17 ‹‹ 2

#define EP0 0x00 ‹‹ 3
#define EP1 0x01 ‹‹ 3
#define EP2 0x02 ‹‹ 3

#define STANDARD 0x00 ‹‹ 5
#define CLASS 0x01 ‹‹ 5
#define VENDOR 0x02 ‹‹ 5

#define RECIPIENT_DEVICE 0x00
#define RECIPIENT_INTERFACE 0x01
#define RECIPIENT_ENDPOINT 0x02

#define DEVICE_REMOTE_WAKEUP 0x01
#define ENDPOINT_HALT 0x00


#define HOSTTODEVICE 0x00
#define HOSTTOINTERFACE 0x01
#define HOSTTOENDPOINT 0x02
#define DEVICETOHOST 0x80
#define INTERFACETOHOST 0x81
#define ENDPOINTTOHOST 0x82

#define EP0OUT 0
#define EP0IN 1
#define EP1OUT 2
#define EP1IN 3
#define EP2OUT 4
#define EP2IN 5

// Descriptor Types
#define DEVICE 1
#define CONFIGURATION 2
#define STRING 3
#define INTERFACE 4
#define ENDPOINT 5
#define EP_CONTROL_LEN 8


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; программа обслуживания юсб интерфейса выше находятся макросы и константы
;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;

USB_buffer_data: .byte 8
USB_error_flags: .byte 1
USB_curr_config: .byte 1
USB_device_status: .byte 1
USB_dev_req: .byte 1
USB_address_pending: .byte 1
USB_desc_ptr: .byte 1
USB_bytes_left: .byte 1
USB_loop_index: .byte 1
USB_packet_length: .byte 1
USB_USTAT: .byte 1
USB_USWSTAT: .byte 1
COUNTER_L: .byte 1
COUNTER_H: .byte 1



.cseg
.ORG 0x0000
RJMP main



.ORG USB_GENaddr
jmp USB_GENERAL_INTERUPT
.ORG USB_COMaddr
jmp USB_EP_PIPE_INTERUPT
.ORG OVF1addr
jmp TIMER_INTERUPT1
.ORG OVF0addr
jmp TIMER_INTERUPT0

.ORG 0x0300


InitDevice:
LDI R16,0XFF
OUT DDRD,R16
LDI R16,0
OUT PORTD,R16
OUT PORTB,R16
clr r4;
; ldi r25,0x00;
; OUT TCCR0A,r25
; ldi r25,0x05;
; OUT TCCR0B,r25
; ldi r25,0x05;
; sts TCCR1B,r25
; ldi r25,0x00;
; OUT TCNT0,r25
; ldi r25,0x01;
; sts TIMSK0,r25
ret

InitUSB:
clr r16
sts USB_curr_config,r16
sts USB_USWSTAT,r16 ; default to powered state
ldi r16, 0x01
sts USB_device_status, r16
ldi r16, NO_REQUEST
sts USB_dev_req,r16
ldi r16,0X80
sts USBCON,r16
sts USBCON,r16
ldi r16,0
sts UDIEN,r16
sts UDINT,r16
ldi r16,0
sts UENUM,r16
ldi r16,0x01
sts UECONX,r16
ldi r16,0x00
sts UECFG0X,r16
ldi r16,0x30
sts UECFG1X,r16
ori r16,0x02
sts UECFG1X,r16
USB_wait_vbus1:
LDS R16,UESTA0X
SBRS R16,CFGOK ; Ждем прихода SETUP пакета от HOST
RJMP USB_wait_vbus1

ldi r16,0
sts UDCON,r16
sts UEINT,r16
sts UDINT,r16

ldi r16,(1‹‹EORSTE)
sts UDIEN,r16
;ldi r16,(1‹‹RXSTPE)
;sts UEIENX,r16
; mov r3,r16







ret


ServiceUSB :

wait_req:
ldi r16,0
sts UENUM,r16

wait_req1:


ldi r16,0
sts UENUM,r16
LDS R16,UEINTX
SBRS R16,RXSTPI ; Ждем прихода SETUP пакета от HOST
RJMP wait_req1



usb_process_request:

lds r17,UEDATX ; Получили bmRequestType
lds r18,UEDATX ; Получили bmRequest
lds r19,UEDATX ; Получили LOW wValue
lds r20,UEDATX ; Получили HIGH wValue
lds r21,UEDATX ; Получили LOW wIndex
lds r22,UEDATX ; Получили HIGH wIndex
lds XL,UEDATX ; Получили LOW wLength
lds XH,UEDATX ; Получили HIGH wLength

cpi R18,0x06
JZ GetDescriptor
cpi R18,0x05
JZ SetAddress
cpi r18,0x09
jz SetGonfiguration
cpi r18,0x0A
jz GetInterface


ret





GetDescriptor:
CPI R17,0x80
JZ GetDescriptorStandart
CPI R17,0x81
JZ GetDescriptorUser
cli
GetDescriptorStandart:
CPI R20,0x01 ; Get Descroptor Device
brne GDS1
ldz16 (Device‹‹1)
ldy16 0x0012;((Deviceend-Device)*2)
rjmp GetDescriptorData
GDS1:
cpi r20,0x02 ; Get Descroptor Config
brne GDS2
ldz16 (Configuration1‹‹1)
ldy16 0x0020;((Configuration1end-Configuration1)*2)
rjmp GetDescriptorData
GDS2:
CPI R20,0x03 ; Get Descroptor String
brne GDS3
CPI R19,0x00 ; Get Descroptor String LanguageId
brne GDS2_1
ldz16 (String0‹‹1)
ldy16 0x0004 ;((String1-String0)*2) ; Длина дескриптора = 4 байт
rjmp GetDescriptorData
GDS2_1:
CPI R19,0x01 ; Get Descroptor String Manufacturer
brne GDS2_2
ldz16 (String1‹‹1)
ldy16 0x0028 ;((String2-String1)*2) ; Длина дескриптора = 12 байт
rjmp GetDescriptorData
GDS2_2:
CPI R19,0x02 ; Get Descroptor String Product
brne GDS2_3
ldz16 (String2‹‹1)
ldy16 0x0032 ;((Descriptor_end-String2)*2) ; Длина дескриптора = 44 байт
rjmp GetDescriptorData
GDS2_3:
CPI R19,0x03 ; Get Descroptor String Manufacturer
brne GDS2_4
ldz16 (String3‹‹1)
ldy16 0x0032 ;((Descriptor_end-String2)*2) ; Длина дескриптора = 12 байт
rjmp GetDescriptorData
GDS2_4:
RET
RJMP PC+0x000D



GDS3:















GetDescriptorData:
ClrIOBit UEINTX,RXSTPI ; Подтверждаем принятие SEPUP пакета
cp XL,YL
cpc XH,YH
brlo GDD0
mov XL,YL
mov XH,YH
GDD0:
LDS R16,UEINTX
SBRS R16,TXINI
RJMP GDD0

GDD1:
;;LDS R16,UEINTX
;andi r16,0b10000001
;sts UEINTX,r16

LPM r16,Z+
STS UEDATX,r16
sbiw X,1
brne GDD1

;Usb_send_control_in(); Только после того как UEINTX,NAKOUTI = 0
ClrIOBit UEINTX,TXINI ; Разрешаем контроллеру передать буфер HOST стороне

GDD2:
LDS R16,UEINTX
SBRS R16,RXOUTI ; Ждем NAK подтверждения от HOST стороны, что пакет был принят
RJMP GDD2

;Usb_ack_control_out();
ClrIOBit UEINTX,RXOUTI
ClrIOBit UEINTX,NAKOUTI
ret
rjmp wait_req










GetInterface:
CPI R17,0x81
jz xxxxxxxxxxx
cpi r17,0x21
jz Set_Class_Inter



Set_Class_Inter:
clr r16
cpi r19,0
cpc r20,r16
breq SCI1



SCI1:
ClrIOBit UEINTX,RXSTPI ; Подтверждаем принятие SEPUP пакета

ClrIOBit UEINTX,TXINI ; Разрешаем контроллеру передать буфер HOST стороне
;while(!Is_usb_in_ready());
SCI2:
LDS R24,UEINTX
SBRS R24,TXINI
RJMP SCI2

rjmp wait_req



SetGonfiguration:
cpi r17,0
jz SC1
cpi r17,0x21
jz SetConfInterface


SC1:
cpi r19,0x01
jz SetConfAddressed
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////

SetConfAddressed:
;Usb_ack_receive_setup();
ClrIOBit UEINTX,RXSTPI ; Подтверждаем принятие SEPUP пакета
; sts ConfiguratedStatus,r25
;Usb_send_control_in(); // send a ZLP for STATUS phase
ClrIOBit UEINTX,TXINI ; Разрешаем контроллеру передать буфер HOST стороне

ldi r16,1
sts UENUM,r16
ldi r16,0x01
sts UECONX,r16
ldi r16,0x81 ; bulk, IN
STS UECFG0X,r16
;UECFG1X = (UECFG1X & (1‹‹ALLOC)) | config1;
ldi r16,0X30;buffer 64 byte
sts UECFG1X,r16

LDS R16,UECFG1X
ORI R16,0X02
STS UECFG1X,R16

USB_wait_vbus11:
LDS R16,UESTA0X
SBRS R16,CFGOK ; Ждем прихода SETUP пакета от HOST
RJMP USB_wait_vbus11
;Usb_allocate_memory();
;SetIOBit UECFG1X,ALLOC
;ldi r16,0
;sts UENUM,r16


ldi r16,0X02
sts UENUM,r16
ldi r16,0x01
sts UECONX,r16
;SetIOBit UECONX,EPEN
;UECFG0X = config0;
ldi r16,0x80 ; bulk, out
STS UECFG0X,r16
;UECFG1X = (UECFG1X & (1‹‹ALLOC)) | config1;
//USB_wait_vbus12:
ldi r16,0X20;buffer 32 byte
sts UECFG1X,r16

LDS R16,UECFG1X
ORI R16,0X02
STS UECFG1X,R16


USB_wait_vbus12:
LDS R16,UESTA0X
SBRS R16,CFGOK ; Ждем прихода SETUP пакета от HOST
RJMP USB_wait_vbus12

ldi r16,CONFIG_STATE
sts USB_USWSTAT,r16
ret

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////



SetConfInterface:
ClrIOBit UEINTX,RXSTPI ; Подтверждаем принятие SEPUP пакета
ClrIOBit UEINTX,TXINI ; Разрешаем контроллеру передать буфер HOST стороне
SCIF1:
LDS R24,UEINTX
SBRS R24,RXOUTI ; Ждем пока контроллер передаст HOSTу пакет
RJMP SCIF1

ClrIOBit UEINTX,RXOUTI
ClrIOBit UEINTX,TXINI ; Разрешаем контроллеру передать буфер HOST стороне
rjmp wait_req


GetDescriptorUser:
CPI r20,0x21
jz xxxxxxxxxxx
CPI r20,0x22
jz hid_get_report_descriptor



hid_get_report_descriptor:
ldy16 0x003B ; Длина дескриптора = 59 байт
ldz16 (T_usb_hid_report_descriptor_kbd‹‹1)
rjmp GetDescriptorData



SetAddress:
TST R17
BREQ SetAddress1
RJMP SetAddress3
SetAddress1:
andi r19,0x7F
sts UDADDR,r19

ClrIOBit UEINTX,RXSTPI ; Подтверждаем принятие SEPUP пакета
; Отправляем HOST стороне пустой пакет
ClrIOBit UEINTX,TXINI ; Разрешаем контроллеру передать буфер HOST стороне
SetAddress2:
LDS R24,UEINTX
SBRS R24,TXINI ; Ждем пока контроллер передаст HOSTу пакет
RJMP SetAddress2
;Usb_enable_address();
SetIOBit UDADDR,ADDEN ; Закрепляем адресс за нашим устройством

ldi r16, ADDRESS_STATE
sts USB_USWSTAT,r16
SetAddress3:
RET

rjmp wait_req






TIMER_INTERUPT0:


reti

TIMER_INTERUPT1:
RETI

USB_GENERAL_INTERUPT:
push r16
push r17
ldi r16,0X80
sts USBCON,r16
sts USBCON,r16
; ldi r16,0
; sts UDIEN,r16
; sts UDINT,r16
ldi r16,0
sts UENUM,r16
ldi r16,0x01
sts UECONX,r16
ldi r16,0x00
sts UECFG0X,r16
ldi r16,0x30
sts UECFG1X,r16
ori r16,0x02
sts UECFG1X,r16
USB_wait_vbus:
LDS R16,UESTA0X
SBRS R16,CFGOK ; Ждем прихода SETUP пакета от HOST
RJMP USB_wait_vbus

ldi r16,0
sts UDCON,r16
;sts UEINT,r16
sts UDINT,r16
clr r16
sts USB_curr_config,r16
ldi r16,DEFAULT_STATE
sts USB_USWSTAT,r16 ; default to powered state
ldi r16, 0x01
sts USB_device_status, r16

pop r17
pop r16
reti
/*
initUSB1:

ldi r16,0X80
sts USBCON,r16
sts USBCON,r16
ldi r16,0
sts UDIEN,r16
sts UDINT,r16
ldi r16,0
sts UENUM,r16
ldi r16,0x01
sts UECONX,r16
ldi r16,0x00
sts UECFG0X,r16
ldi r16,0x30
sts UECFG1X,r16
ori r16,0x02
sts UECFG1X,r16
USB_wait_vbus1:
LDS R16,UESTA0X
SBRS R16,CFGOK ; Ждем прихода SETUP пакета от HOST
RJMP USB_wait_vbus1

ldi r16,0
sts UDCON,r16
sts UEINT,r16
sts UDINT,r16
ret
*/
SleepDevice:
;Usb_ack_suspend(); // must be executed last (after Usb_suspend_action()) to allow upstream resume
LDI R24,0xFE
and r16,r24
STS UDINT,r16
;Usb_enable_wake_up_interrupt();
ldi R24,0x18
STS UDIEN,R24
mov r3,r24
;Usb_freeze_clock();
LDS R24,USBCON
ORI R24,0x20
STS USBCON,R24
;Stop_pll();
IN R24,PLLCSR
ANDI R24,0xFD
OUT PLLCSR,R24
clr r1
OUT PLLCSR,R1
pop r17
pop r16

pop r16
pop r16
ldi r16,LOW(SlpDvs)
push r16
ldi r16,HIGH(SlpDvs)
push r16
reti
SlpDvs:
IN R16,SMCR
ORI R16,0x05
OUT SMCR,r16
;Sleep_instruction();
sei
SLEEP
rjmp wait_req

WakeUpDevice:
LDI R17,0xEF
and r16,r17
STS UDINT,r16
;Usb_enable_suspi_interrupt();
ldi R16,0x09
STS UDIEN,R16
mov r3,r16
;Usb_freeze_clock();
LDS R16,USBCON
andi R16,0b11011111
STS USBCON,r16
ldi r16,0
OUT SMCR,r16
;start_pll();
SetIOMBit PLLCSR,(0‹‹PLLP0)
setIOBit PLLCSR,PLLE
WUDPLL:
IN R16,PLLCSR
SBRS R16,PLOCK
RJMP WUDPLL

clr r16
OUT SMCR,r16
pop r17
pop r16
reti








USB_EP_PIPE_INTERUPT:
; LDS R16,0X55
; OUT PORTD,R16
reti




T_usb_hid_report_descriptor_kbd:
.db 0x05,0x01 /* Usage Page (Generic Desktop) */
.db 0x09,0x06 /* Usage (Keyboard) */
.db 0xA1,0x01 /* Collection (Application) */
.db 0x05,0x07 /* Usage Page (Keyboard) */
.db 0x19,224 /* Usage Minimum (224) */
.db 0x29,231 /* Usage Maximum (231) */
.db 0x15,0x00 /* Logical Minimum (0) */
.db 0x25,0x01 /* Logical Maximum (1) */
.db 0x75,0x01 /* Report Size (1) */
.db 0x95,0x08 /* Report Count ( */
.db 0x81,0x02 /* Input (Data, Variable, Absolute) */
.db 0x81,0x01 /* Input (Constant) */
.db 0x19,0x00 /* Usage Minimum (0) */
.db 0x29,101 /* Usage Maximum (101) */
.db 0x15,0x00 /* Logical Minimum (0) */
.db 0x25,101 /* Logical Maximum (101) */
.db 0x75,0x08 /* Report Size ( */
.db 0x95,0x06 /* Report Count (6) */
.db 0x81,0x00 /* Input (Data, Array) */
.db 0x05,0x08 /* Usage Page (LED) */
.db 0x19,0x01 /* Usage Minimum (1) */
.db 0x29,0x05 /* Usage Maximum (5) */
.db 0x15,0x00 /* Logical Minimum (0) */
.db 0x25,0x01 /* Logical Maximum (1) */
.db 0x75,0x01 /* Report Size (1) */
.db 0x95,0x05 /* Report Count (5) */
.db 0x91,0x02 /* Output (Data, Variable, Absolute) */
.db 0x95,0x03 /* Report Count (3) */
.db 0x91,0x01 /* Output (Constant) */
.db 0xC0,0x00 /* End Collection */

Descriptor_begin:
Device:
.db 0x12, DEVICE ; bLength, bDescriptorType
.db 0x10, 0x01 ; bcdUSB (low byte), bcdUSB (high byte)
.db 0x00, 0x00 ; bDeviceClass, bDeviceSubClass
.db 0x00, MAX_PACKET_SIZE ; bDeviceProtocol, bMaxPacketSize
.db 0x00, 0x06 ; idVendor (low byte), idVendor (high byte)
.db 0x00, 0x06 ; idProduct (low byte), idProduct (high byte)
.db 0x00, 0x06 ; bcdDevice (low byte), bcdDevice (high byte)
.db 0x01, 0x02 ; iManufacturer, iProduct
.db 0x00, NUM_CONFIGURATIONS ; iSerialNumber (none), bNumConfigurations
Deviceend:
Configuration1:
.db 0x09, CONFIGURATION ; размер дескриптора, тип дискриптора
.db 0x20, 0x00 ; wTotalLength (low byte), wTotalLength (high byte)
.db NUM_INTERFACES, 0x01 ; bNumInterfaces, bConfigurationValue
.db 0x00, 0xA0 ; iConfiguration (none), bmAttributes
.db 0x32, 0x09 ; bMaxPower (100 mA), bLength (Interface1 descriptor starts here)
.db INTERFACE, 0x00 ; bDescriptorType, bInterfaceNumber
.db 0x00, 0x02 ; bAlternateSetting, bNumEndpoints (excluding EP0)
.db 0xFF, 0x00 ; bInterfaceClass (vendor specific class code), bInterfaceSubClass
.db 0xFF, 0x00 ; bInterfaceProtocol (vendor specific protocol used), iInterface (none)
.db 0x07,ENDPOINT ; wDescriptorLength (high byte), bLength (Endpoint1 descritor starts here)
.db 0x81,0x02 ; bDescriptorType, bEndpointAddress (EP1 IN)
.db 0x40, 0x00 ; bmAttributes (Interrupt), wMaxPacketSize (low byte)
.db 0x01, 0x07 ; wMaxPacketSize (high byte), bInterval (10 ms)
.db ENDPOINT,0x02
.db 0x02,0x40
.db 0x00,0x01
Configuration1end:

String0:
.db 0x04, STRING ; bLength, bDescriptorType
.db 0x09, 0x04 ; wLANGID[0] (low byte), wLANGID[0] (high byte)
String1:
.db 0x28, STRING ; bLength, bDescriptorType
.db 'e', 0x00 ; bString
.db 'd', 0x00
.db 'u', 0x00
.db 'a', 0x00
.db 'r', 0x00
.db 'd', 0x00
.db ' ', 0x00
.db ' ', 0x00
.db ' ', 0x00
.db ' ', 0x00
.db 'b', 0x00
.db 'a', 0x00
.db 'r', 0x00
.db 'a', 0x00
.db 's', 0x00
.db 'o', 0x00
.db 'v', 0x00
.db '-', 0x00
.db '1', 0x00

String2:
.db 0x32, STRING ; bLength, bDescriptorType
.db 'b', ' ' ; bString
.db 'a', ' '
.db 'r', ' '
.db 'a', ' '
.db 's', ' '
.db 'o', ' '
.db 'v', ' '
.db ' ', ' '
.db '!', ' '
.db ' ', ' '
.db 'P', ' '
.db 'I', ' '
.db 'C', ' '
.db '1', ' '
.db '8', ' '
.db 'F', ' '
.db '2', ' '
.db '4', ' '
.db '5', ' '
.db '5', ' '
.db ' ', ' '
.db 'U', ' '
.db 'S', ' '
.db 'B', ' '

String3:
.db 0x32, STRING ; bLength, bDescriptorType
.db 's', 0x00 ; bString
.db 's', 0x00
.db 'G', 0x00
.db 's', 0x00
.db ' ', 0x00
.db 's', 0x00
.db '2', 0x00
.db '1', 0x00
.db '0', 0x00
.db ' ', 0x00
.db 'P', 0x00
.db 'I', 0x00
.db 'C', 0x00
.db '1', 0x00
.db '8', 0x00
.db 'F', 0x00
.db '2', 0x00
.db '4', 0x00
.db '5', 0x00
.db '5', 0x00
.db ' ', 0x00
.db 'U', 0x00
.db 'S', 0x00
.db 'B', 0x00

Descriptor_end:


xxxxxxxxxxx:

ret
rjmp wait_req


main:
ldi r16,HIGH(RAMEND)
out SPH,r16
ldi r16,LOW(RAMEND)
out SPL,r16
LDI R16,0X80
STS CLKPR,R16
LDI R16,0
STS CLKPR,R16

LDI R16,0X02
OUT PLLCSR,R16
_0x6:
IN R16,PLLCSR
SBRS R16,0
RJMP _0x6


call InitDevice
call InitUSB
sei
L1:
call ServiceUSB
lds r16,USB_USWSTAT
cpi r16,CONFIG_STATE
brne L1

L2:
; call ServiceUSB
ldz16 (String2‹‹1)
;LDS R16,UEINT
;OUT PORTD,R16

ldi r16,0x01
sts UENUM,R16
LDI XL,0X40
LDI XH,0X00
LOOP:
; lpm r16,z+
in r16,PINB
STS UEDATX,r16

sbiw XL,1
brne LOOP

ClrIOBit UEINTX,TXINI
ClrIOBit UEINTX,FIFOCON
LOOP1:
LDS R16,UEINTX
SBRS R16,TXINI
RJMP LOOP1

ldi r16,0x02
sts UENUM,R16
LDI XL,0X20
LDI XH,0X00
LOOP2:
LDS R16, UEDATX
OUT PORTD ,r16
sbiw XL,1
brne LOOP2
ClrIOBit UEINTX,RXOUTI
ClrIOBit UEINTX,FIFOCON







rjmp L2
Эдуард1978 вне форума  
Непрочитано 06.06.2015, 00:50  
Эдуард1978
Частый гость
 
Регистрация: 04.09.2014
Сообщений: 23
Сказал спасибо: 10
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Эдуард1978 на пути к лучшему
По умолчанию Re: USB на AT90USBxxx под ASM

[QUOTE=Эдуард1978;936852]Мой проект был реализован под at90usb 162 а именно обмен с bulk точкой
некоторые строчки закоментированы неправильно , не обращать внимание.



================================================== ===


.MACRO LDX16
LDI XL, LOW(@0)
LDI XH, HIGH(@0)
.ENDMACRO
.
.MACRO LDY16
LDI YL, LOW(@0)
LDI YH, HIGH(@0)
.ENDMACRO

.MACRO LDZ16
LDI ZL, LOW(@0)
LDI ZH, HIGH(@0)
.ENDMACRO

.MACRO LDW16
LDI R24, LOW(@0)
LDI R25, HIGH(@0)
.ENDMACRO

;---------------------------------------------------------
.MACRO SetRegMBit
ori @0,(@1)
.ENDMACRO

.MACRO SetRegBit
ori @0,(1‹‹@1)
.ENDMACRO

.MACRO ClrRegMBit
andi @0,~(@1)
.ENDMACRO

.MACRO ClrRegBit
andi @0,~(1‹‹@1)
.ENDMACRO




.MACRO SetIOMBit
.if @0›0x3F
lds r16,@0
ori r16,(@1)
sts @0,r16
.else
in r16,@0
ori r16,(@1)
out @0,r16
.endif
.ENDMACRO

.MACRO SetIOBit
.if @0›0x3F
lds r16,@0
ori r16,(1‹‹@1)
sts @0,r16
.else
.if @0›31
in r16,@0
ori r16,(1‹‹@1)
out @0,r16
.else
sbi @0,@1
.endif
.endif
.ENDMACRO


.MACRO ClrIOMBit
.if @0›0x3F
lds r16,@0
andi r16,~(@1)
sts @0,r16
.else
in r16,@0
andi r16,~(@1)
out @0,r16
.endif
.ENDMACRO

.MACRO ClrIOBit
.if @0›0x3F
lds r16,@0
andi r16,~(1‹‹@1)
sts @0,r16
.else
.if @0›31
in r16,@0
andi r16,~(1‹‹@1)
out @0,r16
.else
cbi @0,@1
.endif
.endif
.ENDMACRO

;-----------------------------------------------------

.MACRO rjz
brne rjz_next
rjmp @0
rjz_next:
.ENDMACRO

.MACRO jz
brne jz_next
jmp @0
jz_next:

.ENDMACRO

;----------------------------------------------------------

.MACRO SetStack
ldi r16,HIGH(@0)
out SPH,r16
ldi r16,LOW(@0)
out SPL,r16
.ENDMACRO
;-------------- Bit operration -------------

.MACRO SetBit
sbi @0,@1
.ENDMACRO

.MACRO ClrBit
cbi @0,@1
.ENDMACRO

.equ StackSize = 300

.equ FRQ = 8000000
.equ Speed232 = 115200


#define Version "1.4"

.dseg
stack: .byte StackSize
indicator: .byte 16
ConfLen: .byte 2
MaskUSBInt: .byte 1


#define MAX_PACKET_SIZE 0x40

; Варианты USB запроса
#define SETUP_GET_STATUS 0x00
#define SETUP_GET_DEVICE 0x01
#define SETUP_CLEAR_FEATURE 0x01
#define SETUP_GET_STRING 0x03
#define SETUP_SET_FEATURE 0x03
#define SETUP_SET_ADDRESS 0x05
#define SETUP_GET_DESCRIPTOR 0x06
#define SETUP_SET_DESCRIPTOR 0x07
#define SETUP_GET_CONFIGURATION 0x08
#define SETUP_SET_CONFIGURATION 0x09
#define SETUP_GET_INTERFACE 0x0A
#define SETUP_SET_INTERFACE 0x0B
#define SETUP_SYNCH_FRAME 0x0C


//! Типы дискриптора для запроса SETUP_GET_DESCRIPTOR
#define DESCRIPTOR_DEVICE 0x01
#define DESCRIPTOR_CONFIGURATION 0x02
#define DESCRIPTOR_STRING 0x03
#define DESCRIPTOR_INTERFACE 0x04
#define DESCRIPTOR_ENDPOINT 0x05
#define DESCRIPTOR_DEVICE_QUALIFIER 0x06
#define DESCRIPTOR_CONF_OTHER_SPEED 0x07
#define DESCRIPTOR_OTG 0x09
#define DESCRIPTOR_IAD 0x0B


ConfiguratedStatus: .byte 1

#define TRUE 1
#define FALSE 0
#define NULL 0

#define NUM_CONFIGURATIONS 1
#define NUM_INTERFACES 1

#define ConfiguredUSB() while ((USWSTAT&0x3)!=CONFIG_STATE) {}
#define STALL_EP0 EP_STALL0 = 1
#define Send_0Len_pkt UEINTX&=~(TXINI);


#define POWERED_STATE 0x00
#define DEFAULT_STATE 0x01
#define ADDRESS_STATE 0x02
#define CONFIG_STATE 0x03

#define ENDPT_DISABLED 0x00
#define ENDPT_IN_ONLY 0x01
#define ENDPT_OUT_ONLY 0x02
#define ENDPT_CONTROL 0x06 /* enable for in, out and setup */
#define ENDPT_NON_CONTROL 0x0E /* enable for in, and out */

#define TOKEN_OUT (0x01‹‹2)
#define TOKEN_ACK (0x02‹‹2)
#define TOKEN_IN (0x09‹‹2)
#define TOKEN_SETUP (0x0D‹‹2)

#define CLEAR_FEATURE 0x01
#define GET_CONFIGURATION 0x08
#define GET_DESCRIPTOR 0x06
#define GET_INTERFACE 0x0A
#define GET_STATUS 0x00
#define SET_ADDRESS 0x05
#define SET_CONFIGURATION 0x09
#define SET_FEATURE 0x03
#define SET_INTERFACE 0x0B
#define HID_SET_REPORT 0x21
#define HID_GET_REPORT 0xA1
#define VEND_SET_MEMORY 0x80

#define HOSTTODEVICE 0x00
#define HOSTTOINTERFACE 0x01
#define HOSTTOENDPOINT 0x02
#define DEVICETOHOST 0x80
#define INTERFACETOHOST 0x81
#define ENDPOINTTOHOST 0x82

#define EP0OUT 0
#define EP0IN 1
#define EP1OUT 2
#define EP1IN 3
#define EP2OUT 4
#define EP2IN 5

// Descriptor Types
#define DEVICE 1
#define CONFIGURATION 2
#define STRING 3
#define INTERFACE 4
#define ENDPOINT 5




#define TRUE 1
#define FALSE 0
#define NULL 0

#define NUM_CONFIGURATIONS 1
#define NUM_INTERFACES 1

#define ConfiguredUSB() while ((USWSTAT&0x3)!=CONFIG_STATE) {}
#define STALL_EP0 EP_STALL0 = 1
#define Send_0Len_pkt UEINTX&=~(TXINI);

#define NUM_CONFIGURATIONS 1
#define NUM_INTERFACES 1
#define NUM_STRINGS 2
//#define MAX_PACKET_SIZE 8 ; maximum packet size for low-speed peripherals is 8 bytes, for full-speed peripherals it can be 8, 16, 32, or 64 bytes

//; Define the states that the USB interface can be in
#define POWERED_STATE 0x00
#define DEFAULT_STATE 0x01
#define ADDRESS_STATE 0x02
#define CONFIG_STATE 0x03
//; Standard USB requests
#define NO_REQUEST 0xFF
#define GET_STATUS 0x00
#define CLEAR_FEATURE 0x01
#define SET_FEATURE 0x03
#define SET_ADDRESS 0x05
#define GET_DESCRIPTOR 0x06
#define SET_DESCRIPTOR 0x07
#define GET_CONFIGURATION 0x08
#define SET_CONFIGURATION 0x09
#define GET_INTERFACE 0x0A
#define SET_INTERFACE 0x0B
#define SYNCH_FRAME 0x0C

//; HID Class requests
#define GET_REPORT 0x01
#define GET_IDLE 0x02
#define GET_PROTOCOL 0x03
#define SET_REPORT 0x09
#define SET_IDLE 0x0A
#define SET_PROTOCOL 0x0B

#define GET_STRING_DESCRIPTOR 0x66
#define HID_SET_REPORT 0x21
#define VEND_SET_MEMORY 0x80

#define SVCUSBINT 0x01 ‹‹ 2
#define SVCTOKENDONE 0x02 ‹‹ 2
#define SVCRESET 0x03 ‹‹ 2
#define SVCSLEEP 0x04 ‹‹ 2
#define SVCSTALL 0x05 ‹‹ 2
#define SVCERROR 0x06 ‹‹ 2
#define SVCACTIVITY 0x07 ‹‹ 2
#define TOKENOUT 0x08 ‹‹ 2
#define TOKENIN 0x09 ‹‹ 2
#define TOKENSETUP 0x0A ‹‹ 2
#define CLEARFEATURE 0x0B ‹‹ 2
#define GETCONFIG 0x0C ‹‹ 2
#define GETDESCRIPTOR 0x0D ‹‹ 2
#define GETINTERFACE 0x0E ‹‹ 2
#define GETSTATUS 0x0F ‹‹ 2
#define SETADDRESS 0x10 ‹‹ 2
#define SETCONFIG 0x11 ‹‹ 2
#define SETFEATURE 0x12 ‹‹ 2
#define SETINTERFACE 0x13 ‹‹ 2
#define FINISHSETADDRESS 0x14 ‹‹ 2
#define COPYDESC2EP0 0x15 ‹‹ 2
#define COPYSTRINGDESC2EP0 0x16 ‹‹ 2
#define ZEROLENPACKET 0x17 ‹‹ 2

#define EP0 0x00 ‹‹ 3
#define EP1 0x01 ‹‹ 3
#define EP2 0x02 ‹‹ 3

#define STANDARD 0x00 ‹‹ 5
#define CLASS 0x01 ‹‹ 5
#define VENDOR 0x02 ‹‹ 5

#define RECIPIENT_DEVICE 0x00
#define RECIPIENT_INTERFACE 0x01
#define RECIPIENT_ENDPOINT 0x02

#define DEVICE_REMOTE_WAKEUP 0x01
#define ENDPOINT_HALT 0x00


#define HOSTTODEVICE 0x00
#define HOSTTOINTERFACE 0x01
#define HOSTTOENDPOINT 0x02
#define DEVICETOHOST 0x80
#define INTERFACETOHOST 0x81
#define ENDPOINTTOHOST 0x82

#define EP0OUT 0
#define EP0IN 1
#define EP1OUT 2
#define EP1IN 3
#define EP2OUT 4
#define EP2IN 5

// Descriptor Types
#define DEVICE 1
#define CONFIGURATION 2
#define STRING 3
#define INTERFACE 4
#define ENDPOINT 5
#define EP_CONTROL_LEN 8


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; программа обслуживания юсб интерфейса выше находятся макросы и константы
;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;

USB_buffer_data: .byte 8
USB_error_flags: .byte 1
USB_curr_config: .byte 1
USB_device_status: .byte 1
USB_dev_req: .byte 1
USB_address_pending: .byte 1
USB_desc_ptr: .byte 1
USB_bytes_left: .byte 1
USB_loop_index: .byte 1
USB_packet_length: .byte 1
USB_USTAT: .byte 1
USB_USWSTAT: .byte 1
COUNTER_L: .byte 1
COUNTER_H: .byte 1



.cseg
.ORG 0x0000
RJMP main



.ORG USB_GENaddr
jmp USB_GENERAL_INTERUPT
.ORG USB_COMaddr
jmp USB_EP_PIPE_INTERUPT
.ORG OVF1addr
jmp TIMER_INTERUPT1
.ORG OVF0addr
jmp TIMER_INTERUPT0

.ORG 0x0300


InitDevice:
LDI R16,0XFF
OUT DDRD,R16
LDI R16,0
OUT PORTD,R16
OUT PORTB,R16
clr r4;
; ldi r25,0x00;
; OUT TCCR0A,r25
; ldi r25,0x05;
; OUT TCCR0B,r25
; ldi r25,0x05;
; sts TCCR1B,r25
; ldi r25,0x00;
; OUT TCNT0,r25
; ldi r25,0x01;
; sts TIMSK0,r25
ret

InitUSB:
clr r16
sts USB_curr_config,r16
sts USB_USWSTAT,r16 ; default to powered state
ldi r16, 0x01
sts USB_device_status, r16
ldi r16, NO_REQUEST
sts USB_dev_req,r16
ldi r16,0X80
sts USBCON,r16
sts USBCON,r16
ldi r16,0
sts UDIEN,r16
sts UDINT,r16
ldi r16,0
sts UENUM,r16
ldi r16,0x01
sts UECONX,r16
ldi r16,0x00
sts UECFG0X,r16
ldi r16,0x30
sts UECFG1X,r16
ori r16,0x02
sts UECFG1X,r16
USB_wait_vbus1:
LDS R16,UESTA0X
SBRS R16,CFGOK ; Ждем прихода SETUP пакета от HOST
RJMP USB_wait_vbus1

ldi r16,0
sts UDCON,r16
sts UEINT,r16
sts UDINT,r16

ldi r16,(1‹‹EORSTE)
sts UDIEN,r16
;ldi r16,(1‹‹RXSTPE)
;sts UEIENX,r16
; mov r3,r16







ret


ServiceUSB :

wait_req:
ldi r16,0
sts UENUM,r16

wait_req1:


ldi r16,0
sts UENUM,r16
LDS R16,UEINTX
SBRS R16,RXSTPI ; Ждем прихода SETUP пакета от HOST
RJMP wait_req1



usb_process_request:

lds r17,UEDATX ; Получили bmRequestType
lds r18,UEDATX ; Получили bmRequest
lds r19,UEDATX ; Получили LOW wValue
lds r20,UEDATX ; Получили HIGH wValue
lds r21,UEDATX ; Получили LOW wIndex
lds r22,UEDATX ; Получили HIGH wIndex
lds XL,UEDATX ; Получили LOW wLength
lds XH,UEDATX ; Получили HIGH wLength

cpi R18,0x06
JZ GetDescriptor
cpi R18,0x05
JZ SetAddress
cpi r18,0x09
jz SetGonfiguration
cpi r18,0x0A
jz GetInterface


ret





GetDescriptor:
CPI R17,0x80
JZ GetDescriptorStandart
CPI R17,0x81
JZ GetDescriptorUser
cli
GetDescriptorStandart:
CPI R20,0x01 ; Get Descroptor Device
brne GDS1
ldz16 (Device‹‹1)
ldy16 0x0012;((Deviceend-Device)*2)
rjmp GetDescriptorData
GDS1:
cpi r20,0x02 ; Get Descroptor Config
brne GDS2
ldz16 (Configuration1‹‹1)
ldy16 0x0020;((Configuration1end-Configuration1)*2)
rjmp GetDescriptorData
GDS2:
CPI R20,0x03 ; Get Descroptor String
brne GDS3
CPI R19,0x00 ; Get Descroptor String LanguageId
brne GDS2_1
ldz16 (String0‹‹1)
ldy16 0x0004 ;((String1-String0)*2) ; Длина дескриптора = 4 байт
rjmp GetDescriptorData
GDS2_1:
CPI R19,0x01 ; Get Descroptor String Manufacturer
brne GDS2_2
ldz16 (String1‹‹1)
ldy16 0x0028 ;((String2-String1)*2) ; Длина дескриптора = 12 байт
rjmp GetDescriptorData
GDS2_2:
CPI R19,0x02 ; Get Descroptor String Product
brne GDS2_3
ldz16 (String2‹‹1)
ldy16 0x0032 ;((Descriptor_end-String2)*2) ; Длина дескриптора = 44 байт
rjmp GetDescriptorData
GDS2_3:
CPI R19,0x03 ; Get Descroptor String Manufacturer
brne GDS2_4
ldz16 (String3‹‹1)
ldy16 0x0032 ;((Descriptor_end-String2)*2) ; Длина дескриптора = 12 байт
rjmp GetDescriptorData
GDS2_4:
RET
RJMP PC+0x000D



GDS3:















GetDescriptorData:
ClrIOBit UEINTX,RXSTPI ; Подтверждаем принятие SEPUP пакета
cp XL,YL
cpc XH,YH
brlo GDD0
mov XL,YL
mov XH,YH
GDD0:
LDS R16,UEINTX
SBRS R16,TXINI
RJMP GDD0

GDD1:
;;LDS R16,UEINTX
;andi r16,0b10000001
;sts UEINTX,r16

LPM r16,Z+
STS UEDATX,r16
sbiw X,1
brne GDD1

;Usb_send_control_in(); Только после того как UEINTX,NAKOUTI = 0
ClrIOBit UEINTX,TXINI ; Разрешаем контроллеру передать буфер HOST стороне

GDD2:
LDS R16,UEINTX
SBRS R16,RXOUTI ; Ждем NAK подтверждения от HOST стороны, что пакет был принят
RJMP GDD2

;Usb_ack_control_out();
ClrIOBit UEINTX,RXOUTI
ClrIOBit UEINTX,NAKOUTI
ret
rjmp wait_req










GetInterface:
CPI R17,0x81
jz xxxxxxxxxxx
cpi r17,0x21
jz Set_Class_Inter



Set_Class_Inter:
clr r16
cpi r19,0
cpc r20,r16
breq SCI1



SCI1:
ClrIOBit UEINTX,RXSTPI ; Подтверждаем принятие SEPUP пакета

ClrIOBit UEINTX,TXINI ; Разрешаем контроллеру передать буфер HOST стороне
;while(!Is_usb_in_ready());
SCI2:
LDS R24,UEINTX
SBRS R24,TXINI
RJMP SCI2

rjmp wait_req



SetGonfiguration:
cpi r17,0
jz SC1
cpi r17,0x21
jz SetConfInterface


SC1:
cpi r19,0x01
jz SetConfAddressed
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////

SetConfAddressed:
;Usb_ack_receive_setup();
ClrIOBit UEINTX,RXSTPI ; Подтверждаем принятие SEPUP пакета
; sts ConfiguratedStatus,r25
;Usb_send_control_in(); // send a ZLP for STATUS phase
ClrIOBit UEINTX,TXINI ; Разрешаем контроллеру передать буфер HOST стороне

ldi r16,1
sts UENUM,r16
ldi r16,0x01
sts UECONX,r16
ldi r16,0x81 ; bulk, IN
STS UECFG0X,r16
;UECFG1X = (UECFG1X & (1‹‹ALLOC)) | config1;
ldi r16,0X30;buffer 64 byte
sts UECFG1X,r16

LDS R16,UECFG1X
ORI R16,0X02
STS UECFG1X,R16

USB_wait_vbus11:
LDS R16,UESTA0X
SBRS R16,CFGOK ; Ждем прихода SETUP пакета от HOST
RJMP USB_wait_vbus11
;Usb_allocate_memory();
;SetIOBit UECFG1X,ALLOC
;ldi r16,0
;sts UENUM,r16


ldi r16,0X02
sts UENUM,r16
ldi r16,0x01
sts UECONX,r16
;SetIOBit UECONX,EPEN
;UECFG0X = config0;
ldi r16,0x80 ; bulk, out
STS UECFG0X,r16
;UECFG1X = (UECFG1X & (1‹‹ALLOC)) | config1;
//USB_wait_vbus12:
ldi r16,0X20;buffer 32 byte
sts UECFG1X,r16

LDS R16,UECFG1X
ORI R16,0X02
STS UECFG1X,R16


USB_wait_vbus12:
LDS R16,UESTA0X
SBRS R16,CFGOK ; Ждем прихода SETUP пакета от HOST
RJMP USB_wait_vbus12

ldi r16,CONFIG_STATE
sts USB_USWSTAT,r16
ret

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////



SetConfInterface:
ClrIOBit UEINTX,RXSTPI ; Подтверждаем принятие SEPUP пакета
ClrIOBit UEINTX,TXINI ; Разрешаем контроллеру передать буфер HOST стороне
SCIF1:
LDS R24,UEINTX
SBRS R24,RXOUTI ; Ждем пока контроллер передаст HOSTу пакет
RJMP SCIF1

ClrIOBit UEINTX,RXOUTI
ClrIOBit UEINTX,TXINI ; Разрешаем контроллеру передать буфер HOST стороне
rjmp wait_req


GetDescriptorUser:
CPI r20,0x21
jz xxxxxxxxxxx
CPI r20,0x22
jz hid_get_report_descriptor



hid_get_report_descriptor:
ldy16 0x003B ; Длина дескриптора = 59 байт
ldz16 (T_usb_hid_report_descriptor_kbd‹‹1)
rjmp GetDescriptorData



SetAddress:
TST R17
BREQ SetAddress1
RJMP SetAddress3
SetAddress1:
andi r19,0x7F
sts UDADDR,r19

ClrIOBit UEINTX,RXSTPI ; Подтверждаем принятие SEPUP пакета
; Отправляем HOST стороне пустой пакет
ClrIOBit UEINTX,TXINI ; Разрешаем контроллеру передать буфер HOST стороне
SetAddress2:
LDS R24,UEINTX
SBRS R24,TXINI ; Ждем пока контроллер передаст HOSTу пакет
RJMP SetAddress2
;Usb_enable_address();
SetIOBit UDADDR,ADDEN ; Закрепляем адресс за нашим устройством

ldi r16, ADDRESS_STATE
sts USB_USWSTAT,r16
SetAddress3:
RET

rjmp wait_req






TIMER_INTERUPT0:


reti

TIMER_INTERUPT1:
RETI

USB_GENERAL_INTERUPT:
push r16
push r17
ldi r16,0X80
sts USBCON,r16
sts USBCON,r16
; ldi r16,0
; sts UDIEN,r16
; sts UDINT,r16
ldi r16,0
sts UENUM,r16
ldi r16,0x01
sts UECONX,r16
ldi r16,0x00
sts UECFG0X,r16
ldi r16,0x30
sts UECFG1X,r16
ori r16,0x02
sts UECFG1X,r16
USB_wait_vbus:
LDS R16,UESTA0X
SBRS R16,CFGOK ; Ждем прихода SETUP пакета от HOST
RJMP USB_wait_vbus

ldi r16,0
sts UDCON,r16
;sts UEINT,r16
sts UDINT,r16
clr r16
sts USB_curr_config,r16
ldi r16,DEFAULT_STATE
sts USB_USWSTAT,r16 ; default to powered state
ldi r16, 0x01
sts USB_device_status, r16

pop r17
pop r16
reti
/*
initUSB1:

ldi r16,0X80
sts USBCON,r16
sts USBCON,r16
ldi r16,0
sts UDIEN,r16
sts UDINT,r16
ldi r16,0
sts UENUM,r16
ldi r16,0x01
sts UECONX,r16
ldi r16,0x00
sts UECFG0X,r16
ldi r16,0x30
sts UECFG1X,r16
ori r16,0x02
sts UECFG1X,r16
USB_wait_vbus1:
LDS R16,UESTA0X
SBRS R16,CFGOK ; Ждем прихода SETUP пакета от HOST
RJMP USB_wait_vbus1

ldi r16,0
sts UDCON,r16
sts UEINT,r16
sts UDINT,r16
ret
*/
SleepDevice:
;Usb_ack_suspend(); // must be executed last (after Usb_suspend_action()) to allow upstream resume
LDI R24,0xFE
and r16,r24
STS UDINT,r16
;Usb_enable_wake_up_interrupt();
ldi R24,0x18
STS UDIEN,R24
mov r3,r24
;Usb_freeze_clock();
LDS R24,USBCON
ORI R24,0x20
STS USBCON,R24
;Stop_pll();
IN R24,PLLCSR
ANDI R24,0xFD
OUT PLLCSR,R24
clr r1
OUT PLLCSR,R1
pop r17
pop r16

pop r16
pop r16
ldi r16,LOW(SlpDvs)
push r16
ldi r16,HIGH(SlpDvs)
push r16
reti
SlpDvs:
IN R16,SMCR
ORI R16,0x05
OUT SMCR,r16
;Sleep_instruction();
sei
SLEEP
rjmp wait_req

WakeUpDevice:
LDI R17,0xEF
and r16,r17
STS UDINT,r16
;Usb_enable_suspi_interrupt();
ldi R16,0x09
STS UDIEN,R16
mov r3,r16
;Usb_freeze_clock();
LDS R16,USBCON
andi R16,0b11011111
STS USBCON,r16
ldi r16,0
OUT SMCR,r16
;start_pll();
SetIOMBit PLLCSR,(0‹‹PLLP0)
setIOBit PLLCSR,PLLE
WUDPLL:
IN R16,PLLCSR
SBRS R16,PLOCK
RJMP WUDPLL

clr r16
OUT SMCR,r16
pop r17
pop r16
reti








USB_EP_PIPE_INTERUPT:
; LDS R16,0X55
; OUT PORTD,R16
reti




T_usb_hid_report_descriptor_kbd:
.db 0x05,0x01 /* Usage Page (Generic Desktop) */
.db 0x09,0x06 /* Usage (Keyboard) */
.db 0xA1,0x01 /* Collection (Application) */
.db 0x05,0x07 /* Usage Page (Keyboard) */
.db 0x19,224 /* Usage Minimum (224) */
.db 0x29,231 /* Usage Maximum (231) */
.db 0x15,0x00 /* Logical Minimum (0) */
.db 0x25,0x01 /* Logical Maximum (1) */
.db 0x75,0x01 /* Report Size (1) */
.db 0x95,0x08 /* Report Count ( */
.db 0x81,0x02 /* Input (Data, Variable, Absolute) */
.db 0x81,0x01 /* Input (Constant) */
.db 0x19,0x00 /* Usage Minimum (0) */
.db 0x29,101 /* Usage Maximum (101) */
.db 0x15,0x00 /* Logical Minimum (0) */
.db 0x25,101 /* Logical Maximum (101) */
.db 0x75,0x08 /* Report Size ( */
.db 0x95,0x06 /* Report Count (6) */
.db 0x81,0x00 /* Input (Data, Array) */
.db 0x05,0x08 /* Usage Page (LED) */
.db 0x19,0x01 /* Usage Minimum (1) */
.db 0x29,0x05 /* Usage Maximum (5) */
.db 0x15,0x00 /* Logical Minimum (0) */
.db 0x25,0x01 /* Logical Maximum (1) */
.db 0x75,0x01 /* Report Size (1) */
.db 0x95,0x05 /* Report Count (5) */
.db 0x91,0x02 /* Output (Data, Variable, Absolute) */
.db 0x95,0x03 /* Report Count (3) */
.db 0x91,0x01 /* Output (Constant) */
.db 0xC0,0x00 /* End Collection */

Descriptor_begin:
Device:
.db 0x12, DEVICE ; bLength, bDescriptorType
.db 0x10, 0x01 ; bcdUSB (low byte), bcdUSB (high byte)
.db 0x00, 0x00 ; bDeviceClass, bDeviceSubClass
.db 0x00, MAX_PACKET_SIZE ; bDeviceProtocol, bMaxPacketSize
.db 0x00, 0x06 ; idVendor (low byte), idVendor (high byte)
.db 0x00, 0x06 ; idProduct (low byte), idProduct (high byte)
.db 0x00, 0x06 ; bcdDevice (low byte), bcdDevice (high byte)
.db 0x01, 0x02 ; iManufacturer, iProduct
.db 0x00, NUM_CONFIGURATIONS ; iSerialNumber (none), bNumConfigurations
Deviceend:
Configuration1:
.db 0x09, CONFIGURATION ; размер дескриптора, тип дискриптора
.db 0x20, 0x00 ; wTotalLength (low byte), wTotalLength (high byte)
.db NUM_INTERFACES, 0x01 ; bNumInterfaces, bConfigurationValue
.db 0x00, 0xA0 ; iConfiguration (none), bmAttributes
.db 0x32, 0x09 ; bMaxPower (100 mA), bLength (Interface1 descriptor starts here)
.db INTERFACE, 0x00 ; bDescriptorType, bInterfaceNumber
.db 0x00, 0x02 ; bAlternateSetting, bNumEndpoints (excluding EP0)
.db 0xFF, 0x00 ; bInterfaceClass (vendor specific class code), bInterfaceSubClass
.db 0xFF, 0x00 ; bInterfaceProtocol (vendor specific protocol used), iInterface (none)
.db 0x07,ENDPOINT ; wDescriptorLength (high byte), bLength (Endpoint1 descritor starts here)
.db 0x81,0x02 ; bDescriptorType, bEndpointAddress (EP1 IN)
.db 0x40, 0x00 ; bmAttributes (Interrupt), wMaxPacketSize (low byte)
.db 0x01, 0x07 ; wMaxPacketSize (high byte), bInterval (10 ms)
.db ENDPOINT,0x02
.db 0x02,0x40
.db 0x00,0x01
Configuration1end:

String0:
.db 0x04, STRING ; bLength, bDescriptorType
.db 0x09, 0x04 ; wLANGID[0] (low byte), wLANGID[0] (high byte)
String1:
.db 0x28, STRING ; bLength, bDescriptorType
.db 'e', 0x00 ; bString
.db 'd', 0x00
.db 'u', 0x00
.db 'a', 0x00
.db 'r', 0x00
.db 'd', 0x00
.db ' ', 0x00
.db ' ', 0x00
.db ' ', 0x00
.db ' ', 0x00
.db 'b', 0x00
.db 'a', 0x00
.db 'r', 0x00
.db 'a', 0x00
.db 's', 0x00
.db 'o', 0x00
.db 'v', 0x00
.db '-', 0x00
.db '1', 0x00

String2:
.db 0x32, STRING ; bLength, bDescriptorType
.db 'b', ' ' ; bString
.db 'a', ' '
.db 'r', ' '
.db 'a', ' '
.db 's', ' '
.db 'o', ' '
.db 'v', ' '
.db ' ', ' '
.db '!', ' '
.db ' ', ' '
.db 'P', ' '
.db 'I', ' '
.db 'C', ' '
.db '1', ' '
.db '8', ' '
.db 'F', ' '
.db '2', ' '
.db '4', ' '
.db '5', ' '
.db '5', ' '
.db ' ', ' '
.db 'U', ' '
.db 'S', ' '
.db 'B', ' '

String3:
.db 0x32, STRING ; bLength, bDescriptorType
.db 's', 0x00 ; bString
.db 's', 0x00
.db 'G', 0x00
.db 's', 0x00
.db ' ', 0x00
.db 's', 0x00
.db '2', 0x00
.db '1', 0x00
.db '0', 0x00
.db ' ', 0x00
.db 'P', 0x00
.db 'I', 0x00
.db 'C', 0x00
.db '1', 0x00
.db '8', 0x00
.db 'F', 0x00
.db '2', 0x00
.db '4', 0x00
.db '5', 0x00
.db '5', 0x00
.db ' ', 0x00
.db 'U', 0x00
.db 'S', 0x00
.db 'B', 0x00

Descriptor_end:


xxxxxxxxxxx:

ret
rjmp wait_req


main:
ldi r16,HIGH(RAMEND)
out SPH,r16
ldi r16,LOW(RAMEND)
out SPL,r16
LDI R16,0X80
STS CLKPR,R16
LDI R16,0
STS CLKPR,R16

LDI R16,0X02
OUT PLLCSR,R16
_0x6:
IN R16,PLLCSR
SBRS R16,0
RJMP _0x6


call InitDevice
call InitUSB
sei
L1:
call ServiceUSB
lds r16,USB_USWSTAT
cpi r16,CONFIG_STATE
brne L1

L2:
; call ServiceUSB
ldz16 (String2‹‹1)
;LDS R16,UEINT
;OUT PORTD,R16

ldi r16,0x01
sts UENUM,R16
LDI XL,0X40
LDI XH,0X00
LOOP:
; lpm r16,z+
in r16,PINB
STS UEDATX,r16

sbiw XL,1
brne LOOP

ClrIOBit UEINTX,TXINI
ClrIOBit UEINTX,FIFOCON
LOOP1:
LDS R16,UEINTX
SBRS R16,TXINI
RJMP LOOP1

ldi r16,0x02
sts UENUM,R16
LDI XL,0X20
LDI XH,0X00
LOOP2:
LDS R16, UEDATX
OUT PORTD ,r16
sbiw XL,1
brne LOOP2
ClrIOBit UEINTX,RXOUTI
ClrIOBit UEINTX,FIFOCON







rjmp L2[/QUOTE



выложил в один листинг без всяких инклудов

Последний раз редактировалось Эдуард1978; 07.06.2015 в 13:21.
Эдуард1978 вне форума  
 

Закладки

Метки
asm, at90usb, usb, пример
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
USB JTAG отладчик под ARM7 serb-radio Микроконтроллеры, АЦП, память и т.д 13 22.07.2008 15:15
Переделка входа iPod в автомагнитоле под USB xTriplex Аудиотехника 1 29.12.2007 02:38
WinAVR и asm Dungeon Микроконтроллеры, АЦП, память и т.д 0 12.06.2007 10:55
ASM&USB surgutw Микроконтроллеры, АЦП, память и т.д 0 25.06.2005 13:29


Часовой пояс GMT +4, время: 19:59.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot