📄 main.c
字号:
/* Name: main.c * Project: custom-class, a basic USB example * Author: Christian Starkjohann * Creation Date: 2008-04-09 * Tabsize: 4 * Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) * This Revision: $Id: main.c 692 2008-11-07 15:07:40Z cs $ *//*This example should run on most AVRs with only little changes. No specialhardware resources except INT0 are used. You may have to change usbconfig.h fordifferent I/O pins for USB. Please note that USB D+ must be the INT0 pin, orat least be connected to INT0 as well.We assume that an LED is connected to port B bit 0. If you connect it to adifferent port or bit, change the macros below:*/#define LED_PORT_DDR DDRB#define LED_PORT_OUTPUT PORTB#define LED_BIT 0#include <avr/io.h>#include <avr/wdt.h>#include <avr/interrupt.h> /* for sei() */#include <util/delay.h> /* for _delay_ms() */#include <avr/pgmspace.h> /* required by usbdrv.h */#include "usbdrv.h"#include "oddebug.h" /* This is also an example for using debug macros */#include "requests.h" /* The custom request numbers we use *//* ------------------------------------------------------------------------- *//* ----------------------------- USB interface ----------------------------- *//* ------------------------------------------------------------------------- */usbMsgLen_t usbFunctionSetup(uchar data[8]){usbRequest_t *rq = (void *)data;static uchar dataBuffer[4]; /* buffer must stay valid when usbFunctionSetup returns */ if(rq->bRequest == CUSTOM_RQ_ECHO){ /* echo -- used for reliability tests */ dataBuffer[0] = rq->wValue.bytes[0]; dataBuffer[1] = rq->wValue.bytes[1]; dataBuffer[2] = rq->wIndex.bytes[0]; dataBuffer[3] = rq->wIndex.bytes[1]; usbMsgPtr = dataBuffer; /* tell the driver which data to return */ return 4; }else if(rq->bRequest == CUSTOM_RQ_SET_STATUS){ if(rq->wValue.bytes[0] & 1){ /* set LED */ LED_PORT_OUTPUT |= _BV(LED_BIT); }else{ /* clear LED */ LED_PORT_OUTPUT &= ~_BV(LED_BIT); } }else if(rq->bRequest == CUSTOM_RQ_GET_STATUS){ dataBuffer[0] = ((LED_PORT_OUTPUT & _BV(LED_BIT)) != 0); usbMsgPtr = dataBuffer; /* tell the driver which data to return */ return 1; /* tell the driver to send 1 byte */ } return 0; /* default for not implemented requests: return no data back to host */}/* ------------------------------------------------------------------------- */int main(void){uchar i; wdt_enable(WDTO_1S); /* Even if you don't use the watchdog, turn it off here. On newer devices, * the status of the watchdog (on/off, period) is PRESERVED OVER RESET! */ DBG1(0x00, 0, 0); /* debug output: main starts */ /* RESET status: all port bits are inputs without pull-up. * That's the way we need D+ and D-. Therefore we don't need any * additional hardware initialization. */ odDebugInit(); usbInit(); usbDeviceDisconnect(); /* enforce re-enumeration, do this while interrupts are disabled! */ i = 0; while(--i){ /* fake USB disconnect for > 250 ms */ wdt_reset(); _delay_ms(1); } usbDeviceConnect(); LED_PORT_DDR |= _BV(LED_BIT); /* make the LED bit an output */ sei(); DBG1(0x01, 0, 0); /* debug output: main loop starts */ for(;;){ /* main event loop */ DBG1(0x02, 0, 0); /* debug output: main loop iterates */ wdt_reset(); usbPoll(); } return 0;}/* ------------------------------------------------------------------------- */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -