diff --git a/usb/README.md b/usb/README.md new file mode 100644 index 0000000..eaeee35 --- /dev/null +++ b/usb/README.md @@ -0,0 +1,3 @@ +# usb + +See libnx usb_comms.h. If you want to use usbds directly, see libnx usb_comms.c source and usb.h. diff --git a/usb/usbds/Makefile b/usb/usbds/Makefile deleted file mode 100644 index 47ac198..0000000 --- a/usb/usbds/Makefile +++ /dev/null @@ -1,193 +0,0 @@ -#--------------------------------------------------------------------------------- -.SUFFIXES: -#--------------------------------------------------------------------------------- - -ifeq ($(strip $(DEVKITPRO)),) -$(error "Please set DEVKITPRO in your environment. export DEVKITPRO=/devkitpro") -endif - -TOPDIR ?= $(CURDIR) -include $(DEVKITPRO)/libnx/switch_rules - -#--------------------------------------------------------------------------------- -# TARGET is the name of the output -# BUILD is the directory where object files & intermediate files will be placed -# SOURCES is a list of directories containing source code -# DATA is a list of directories containing data files -# INCLUDES is a list of directories containing header files -# EXEFS_SRC is the optional input directory containing data copied into exefs, if anything this normally should only contain "main.npdm". -# ROMFS is the directory containing data to be added to RomFS, relative to the Makefile (Optional) -# -# NO_ICON: if set to anything, do not use icon. -# NO_NACP: if set to anything, no .nacp file is generated. -# APP_TITLE is the name of the app stored in the .nacp file (Optional) -# APP_AUTHOR is the author of the app stored in the .nacp file (Optional) -# APP_VERSION is the version of the app stored in the .nacp file (Optional) -# APP_TITLEID is the titleID of the app stored in the .nacp file (Optional) -# ICON is the filename of the icon (.jpg), relative to the project folder. -# If not set, it attempts to use one of the following (in this order): -# - .jpg -# - icon.jpg -# - /default_icon.jpg -#--------------------------------------------------------------------------------- -TARGET := $(notdir $(CURDIR)) -BUILD := build -SOURCES := source -DATA := data -INCLUDES := include -EXEFS_SRC := exefs_src -#ROMFS := romfs - -#--------------------------------------------------------------------------------- -# options for code generation -#--------------------------------------------------------------------------------- -ARCH := -march=armv8-a -mtune=cortex-a57 -mtp=soft -fPIE - -CFLAGS := -g -Wall -O2 -ffunction-sections \ - $(ARCH) $(DEFINES) - -CFLAGS += $(INCLUDE) -D__SWITCH__ - -CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions - -ASFLAGS := -g $(ARCH) -LDFLAGS = -specs=$(DEVKITPRO)/libnx/switch.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map) - -LIBS := -lnx - -#--------------------------------------------------------------------------------- -# list of directories containing libraries, this must be the top level containing -# include and lib -#--------------------------------------------------------------------------------- -LIBDIRS := $(PORTLIBS) $(LIBNX) - - -#--------------------------------------------------------------------------------- -# no real need to edit anything past this point unless you need to add additional -# rules for different file extensions -#--------------------------------------------------------------------------------- -ifneq ($(BUILD),$(notdir $(CURDIR))) -#--------------------------------------------------------------------------------- - -export OUTPUT := $(CURDIR)/$(TARGET) -export TOPDIR := $(CURDIR) - -export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \ - $(foreach dir,$(DATA),$(CURDIR)/$(dir)) - -export DEPSDIR := $(CURDIR)/$(BUILD) - -CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c))) -CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp))) -SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s))) -BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) - -#--------------------------------------------------------------------------------- -# use CXX for linking C++ projects, CC for standard C -#--------------------------------------------------------------------------------- -ifeq ($(strip $(CPPFILES)),) -#--------------------------------------------------------------------------------- - export LD := $(CC) -#--------------------------------------------------------------------------------- -else -#--------------------------------------------------------------------------------- - export LD := $(CXX) -#--------------------------------------------------------------------------------- -endif -#--------------------------------------------------------------------------------- - -export OFILES_BIN := $(addsuffix .o,$(BINFILES)) -export OFILES_SRC := $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(SFILES:.s=.o) -export OFILES := $(OFILES_BIN) $(OFILES_SRC) -export HFILES_BIN := $(addsuffix .h,$(subst .,_,$(BINFILES))) - -export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \ - $(foreach dir,$(LIBDIRS),-I$(dir)/include) \ - -I$(CURDIR)/$(BUILD) - -export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) - -export BUILD_EXEFS_SRC := $(TOPDIR)/$(EXEFS_SRC) - -ifeq ($(strip $(ICON)),) - icons := $(wildcard *.jpg) - ifneq (,$(findstring $(TARGET).jpg,$(icons))) - export APP_ICON := $(TOPDIR)/$(TARGET).jpg - else - ifneq (,$(findstring icon.jpg,$(icons))) - export APP_ICON := $(TOPDIR)/icon.jpg - endif - endif -else - export APP_ICON := $(TOPDIR)/$(ICON) -endif - -ifeq ($(strip $(NO_ICON)),) - export NROFLAGS += --icon=$(APP_ICON) -endif - -ifeq ($(strip $(NO_NACP)),) - export NROFLAGS += --nacp=$(CURDIR)/$(TARGET).nacp -endif - -ifneq ($(APP_TITLEID),) - export NACPFLAGS += --titleid=$(APP_TITLEID) -endif - -ifneq ($(ROMFS),) - export NROFLAGS += --romfsdir=$(CURDIR)/$(ROMFS) -endif - -.PHONY: $(BUILD) clean all - -#--------------------------------------------------------------------------------- -all: $(BUILD) - -$(BUILD): - @[ -d $@ ] || mkdir -p $@ - @$(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile - -#--------------------------------------------------------------------------------- -clean: - @echo clean ... - @rm -fr $(BUILD) $(TARGET).pfs0 $(TARGET).nso $(TARGET).nro $(TARGET).nacp $(TARGET).elf - - -#--------------------------------------------------------------------------------- -else -.PHONY: all - -DEPENDS := $(OFILES:.o=.d) - -#--------------------------------------------------------------------------------- -# main targets -#--------------------------------------------------------------------------------- -all : $(OUTPUT).pfs0 $(OUTPUT).nro - -$(OUTPUT).pfs0 : $(OUTPUT).nso - -$(OUTPUT).nso : $(OUTPUT).elf - -ifeq ($(strip $(NO_NACP)),) -$(OUTPUT).nro : $(OUTPUT).elf $(OUTPUT).nacp -else -$(OUTPUT).nro : $(OUTPUT).elf -endif - -$(OUTPUT).elf : $(OFILES) - -$(OFILES_SRC) : $(HFILES_BIN) - -#--------------------------------------------------------------------------------- -# you need a rule like this for each extension you use as binary data -#--------------------------------------------------------------------------------- -%.bin.o %_bin.h : %.bin -#--------------------------------------------------------------------------------- - @echo $(notdir $<) - @$(bin2o) - --include $(DEPENDS) - -#--------------------------------------------------------------------------------------- -endif -#--------------------------------------------------------------------------------------- diff --git a/usb/usbds/source/main.c b/usb/usbds/source/main.c deleted file mode 100644 index 02dfa26..0000000 --- a/usb/usbds/source/main.c +++ /dev/null @@ -1,147 +0,0 @@ -#include -#include -#include - -#include - -//Example for usbds, see libnx usb.h. Switch-as-device<>host USB comms. -//Linux detects this as a serial device. -//See libnx usb_comms.c/usb.h for getting actual-transfer-size after using usbDsEndpoint_PostBufferAsync. - -Result usbds_test(u8 *tmpbuf) -{ - Result ret=0; - s32 tmpindex=0; - UsbDsInterface* interface = NULL; - UsbDsEndpoint *endpoint_in = NULL, *endpoint_out = NULL; - - struct usb_interface_descriptor interface_descriptor = { - .bLength = USB_DT_INTERFACE_SIZE, - .bDescriptorType = USB_DT_INTERFACE, - .bInterfaceNumber = USBDS_DEFAULT_InterfaceNumber, - .bInterfaceClass = USB_CLASS_VENDOR_SPEC, - .bInterfaceSubClass = USB_CLASS_VENDOR_SPEC, - .bInterfaceProtocol = USB_CLASS_VENDOR_SPEC, - }; - - struct usb_endpoint_descriptor endpoint_descriptor_in = { - .bLength = USB_DT_ENDPOINT_SIZE, - .bDescriptorType = USB_DT_ENDPOINT, - .bEndpointAddress = USB_ENDPOINT_IN, - .bmAttributes = USB_TRANSFER_TYPE_BULK, - .wMaxPacketSize = 0x200, - }; - - struct usb_endpoint_descriptor endpoint_descriptor_out = { - .bLength = USB_DT_ENDPOINT_SIZE, - .bDescriptorType = USB_DT_ENDPOINT, - .bEndpointAddress = USB_ENDPOINT_OUT, - .bmAttributes = USB_TRANSFER_TYPE_BULK, - .wMaxPacketSize = 0x200, - }; - - //Setup interface. - ret = usbDsGetDsInterface(&interface, &interface_descriptor, "usb"); - if(R_FAILED(ret))return ret; - - //Setup endpoints. - ret = usbDsInterface_GetDsEndpoint(interface, &endpoint_in, &endpoint_descriptor_in);//device->host - if(R_FAILED(ret))return ret; - - ret = usbDsInterface_GetDsEndpoint(interface, &endpoint_out, &endpoint_descriptor_out);//host->device - if(R_FAILED(ret))return ret; - - ret = usbDsInterface_EnableInterface(interface); - if(R_FAILED(ret))return ret; - - //Wait for initialization to finish where data-transfer is usable. This includes waiting for the usb cable to be inserted if it's not already. - ret = usbDsWaitReady(); - if(R_FAILED(ret))return ret; - - u32 somepos; - for(somepos=0; somepos<0x101; somepos++) - { - memset(tmpbuf, 0, 0x1000); - char *strptr = "\n";//"Hello World!\n"; - - tmpbuf[0] = 0x11; - tmpbuf[1] = 0x1; - if(somepos==0 || somepos==0x101) - { - strncpy((char*)&tmpbuf[2], strptr, 0x1000-2); - ret = usbDsEndpoint_PostBufferAsync(endpoint_in, tmpbuf, 2+strlen(strptr), NULL); - } - else - { - tmpbuf[2] = somepos-1; - ret = usbDsEndpoint_PostBufferAsync(endpoint_in, tmpbuf, 2+1, NULL); - } - - //Start a device->host transfer. - //ret = usbDsEndpoint_PostBufferAsync(endpoint_in, tmpbuf, 2+1, NULL); - //ret = usbDsEndpoint_PostBufferAsync(endpoint_in, tmpbuf, 2+strlen(strptr), NULL); - if(R_FAILED(ret))return ret; - //Wait for the transfer to finish. - svcWaitSynchronization(&tmpindex, &endpoint_in->CompletionEvent, 1, U64_MAX); - svcClearEvent(endpoint_in->CompletionEvent); - } - - //Start a host->device transfer. - ret = usbDsEndpoint_PostBufferAsync(endpoint_out, tmpbuf, 0x200, NULL); - if(R_FAILED(ret))return ret; - - //Wait for the transfer to finish. - svcWaitSynchronization(&tmpindex, &endpoint_out->CompletionEvent, 1, U64_MAX); - svcClearEvent(endpoint_out->CompletionEvent); - - memcpy(&tmpbuf[0x400], tmpbuf, 0x200-2); - tmpbuf[0] = 0x11; - tmpbuf[1] = 0x1; - memcpy(&tmpbuf[2], &tmpbuf[0x400], 0x200-2); - - //Start a device->host transfer. - ret = usbDsEndpoint_PostBufferAsync(endpoint_in, tmpbuf, 0x2+1, NULL); - if(R_FAILED(ret)) - return ret; - - //Wait for the transfer to finish. - svcWaitSynchronization(&tmpindex, &endpoint_in->CompletionEvent, 1, U64_MAX); - svcClearEvent(endpoint_in->CompletionEvent); - - svcSleepThread(5000000000);//Delay 5s - - return 0; -} - -int main(int argc, char **argv) -{ - Result ret; - - UsbDsDeviceInfo deviceinfo = { - .idVendor = 0x0403, // "Future Technology Devices International, Ltd" - .idProduct = 0x6001, // "FT232 USB-Serial (UART) IC" - .bcdDevice = 0x0200, - .Manufacturer = "libnx", - .Product = "usbds-example", - .SerialNumber = "1337", - }; - - ret = usbDsInitialize(UsbComplexId_Default, &deviceinfo); - - if (R_SUCCEEDED(ret)) { - u8 *tmpbuf = memalign(0x1000, 0x1000);//The buffer for PostBufferAsync commands must be 0x1000-byte aligned. - if(tmpbuf==NULL)ret = -4; - - if (R_SUCCEEDED(ret)) ret = usbds_test(tmpbuf); - - usbDsExit(); - } - - if(R_FAILED(ret)) - fatalSimple(ret); - - svcSleepThread(5000000000);//Delay 5s - - return 0; -} -