Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
1c23361e
Commit
1c23361e
authored
Jan 19, 2004
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge
bk://bk.arm.linux.org.uk/linux-2.6-rmk
into home.osdl.org:/home/torvalds/v2.5/linux
parents
d00ea9a1
b7c5d0b8
Changes
19
Hide whitespace changes
Inline
Side-by-side
Showing
19 changed files
with
3107 additions
and
2099 deletions
+3107
-2099
Documentation/arm/SA1100/CERF
Documentation/arm/SA1100/CERF
+7
-15
arch/arm/configs/cerfpda_defconfig
arch/arm/configs/cerfpda_defconfig
+0
-967
arch/arm/configs/cerfpod_defconfig
arch/arm/configs/cerfpod_defconfig
+0
-894
arch/arm/kernel/setup.c
arch/arm/kernel/setup.c
+12
-0
arch/arm/lib/memcpy.S
arch/arm/lib/memcpy.S
+3
-3
arch/arm/mach-pxa/generic.c
arch/arm/mach-pxa/generic.c
+78
-0
arch/arm/mach-pxa/idp.c
arch/arm/mach-pxa/idp.c
+2
-4
arch/arm/mach-pxa/lubbock.c
arch/arm/mach-pxa/lubbock.c
+15
-4
arch/arm/mach-sa1100/Kconfig
arch/arm/mach-sa1100/Kconfig
+2
-11
arch/arm/mach-sa1100/leds-cerf.c
arch/arm/mach-sa1100/leds-cerf.c
+0
-12
arch/arm/mm/proc-arm720.S
arch/arm/mm/proc-arm720.S
+36
-0
drivers/usb/gadget/pxa2xx_udc.c
drivers/usb/gadget/pxa2xx_udc.c
+2515
-0
drivers/usb/gadget/pxa2xx_udc.h
drivers/usb/gadget/pxa2xx_udc.h
+311
-0
drivers/video/Kconfig
drivers/video/Kconfig
+0
-23
drivers/video/console/font_acorn_8x8.c
drivers/video/console/font_acorn_8x8.c
+103
-103
drivers/video/sa1100fb.c
drivers/video/sa1100fb.c
+0
-57
include/asm-arm/arch-pxa/udc.h
include/asm-arm/arch-pxa/udc.h
+18
-0
include/asm-arm/arch-sa1100/keyboard.h
include/asm-arm/arch-sa1100/keyboard.h
+0
-5
include/asm-arm/mach/arch.h
include/asm-arm/mach/arch.h
+5
-1
No files found.
Documentation/arm/SA1100/CERF
View file @
1c23361e
*** The StrongARM version of the CerfBoard/Cube has been discontinued ***
The Intrinsyc CerfBoard is a StrongARM 1110-based computer on a board
that measures approximately 2" square. It includes an Ethernet
controller, an RS232-compatible serial port, a USB function port, and
...
...
@@ -5,7 +7,7 @@ one CompactFlash+ slot on the back. Pictures can be found at the
Intrinsyc website, http://www.intrinsyc.com.
This document describes the support in the Linux kernel for the
Intrinsyc CerfBoard
as of version 2.4.0-test4-np1
.
Intrinsyc CerfBoard.
Supported in this version:
- CompactFlash+ slot (select PCMCIA in General Setup and any options
...
...
@@ -14,24 +16,14 @@ Supported in this version:
Network Devices)
- Serial ports with a serial console (hardcoded to 38400 8N1)
Not supported in this version (yet):
- LCD driver/touchscreen interface
- UDC (a driver exists right now, but is unstable and slow and only
works with the Linux USB)
In order to get this kernel onto your Cerf, you need a server that runs
both BOOTP and TFTP. Detailed instructions should have come with your
evaluation kit on how to use the bootloader. This series of commands
will suffice:
make
cerf_
config
make
xconfig
make
zImage
make
ARCH=arm CROSS_COMPILE=arm-linux- cerfcube_def
config
make
ARCH=arm CROSS_COMPILE=arm-linux- zImage
make
ARCH=arm CROSS_COMPILE=arm-linux- modules
cp arch/arm/boot/zImage <TFTP directory>
The default config uses a 4MB RAM disk located at 0xc0500000 as root.
Setting the board to mount root from a NFS partition works, too.
I-Gene Leong, Intrinsyc Software Inc.
ileong@intrinsyc.com
support@intrinsyc.com
arch/arm/configs/cerfpda_defconfig
deleted
100644 → 0
View file @
d00ea9a1
#
# Automatically generated make config: don't edit
#
CONFIG_ARM=y
# CONFIG_EISA is not set
# CONFIG_SBUS is not set
# CONFIG_MCA is not set
CONFIG_UID16=y
CONFIG_RWSEM_GENERIC_SPINLOCK=y
# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set
#
# Code maturity level options
#
CONFIG_EXPERIMENTAL=y
# CONFIG_OBSOLETE is not set
#
# Loadable module support
#
CONFIG_MODULES=y
# CONFIG_MODVERSIONS is not set
# CONFIG_KMOD is not set
#
# System Type
#
# CONFIG_ARCH_ANAKIN is not set
# CONFIG_ARCH_ARCA5K is not set
# CONFIG_ARCH_CLPS7500 is not set
# CONFIG_ARCH_CLPS711X is not set
# CONFIG_ARCH_CO285 is not set
# CONFIG_ARCH_EBSA110 is not set
# CONFIG_ARCH_FOOTBRIDGE is not set
# CONFIG_ARCH_INTEGRATOR is not set
# CONFIG_ARCH_L7200 is not set
# CONFIG_ARCH_RPC is not set
CONFIG_ARCH_SA1100=y
# CONFIG_ARCH_SHARK is not set
#
# Archimedes/A5000 Implementations
#
#
# Archimedes/A5000 Implementations (select only ONE)
#
# CONFIG_ARCH_ARC is not set
# CONFIG_ARCH_A5K is not set
#
# Footbridge Implementations
#
# CONFIG_ARCH_CATS is not set
# CONFIG_ARCH_PERSONAL_SERVER is not set
# CONFIG_ARCH_EBSA285_ADDIN is not set
# CONFIG_ARCH_EBSA285_HOST is not set
# CONFIG_ARCH_NETWINDER is not set
#
# SA11x0 Implementations
#
# CONFIG_SA1100_ASSABET is not set
# CONFIG_ASSABET_NEPONSET is not set
# CONFIG_SA1100_ADSBITSY is not set
# CONFIG_SA1100_BRUTUS is not set
CONFIG_SA1100_CERF=y
# CONFIG_SA1100_CERF_FLASH_8MB is not set
# CONFIG_SA1100_CERF_FLASH_16MB is not set
CONFIG_SA1100_CERF_FLASH_32MB=y
CONFIG_SA1100_CERF_CPLD=y
# CONFIG_SA1100_H3600 is not set
# CONFIG_SA1100_EXTENEX1 is not set
# CONFIG_SA1100_FLEXANET is not set
# CONFIG_SA1100_FREEBIRD is not set
# CONFIG_SA1100_GRAPHICSCLIENT is not set
# CONFIG_SA1100_GRAPHICSMASTER is not set
# CONFIG_SA1100_JORNADA720 is not set
# CONFIG_SA1100_HUW_WEBPANEL is not set
# CONFIG_SA1100_ITSY is not set
# CONFIG_SA1100_LART is not set
# CONFIG_SA1100_NANOENGINE is not set
# CONFIG_SA1100_OMNIMETER is not set
# CONFIG_SA1100_PANGOLIN is not set
# CONFIG_SA1100_PLEB is not set
# CONFIG_SA1100_SHERMAN is not set
# CONFIG_SA1100_SIMPAD is not set
# CONFIG_SA1100_PFS168 is not set
# CONFIG_SA1100_VICTOR is not set
# CONFIG_SA1100_XP860 is not set
# CONFIG_SA1100_YOPY is not set
CONFIG_SA1100_USB=y
CONFIG_SA1100_USB_NETLINK=y
CONFIG_SA1100_USB_CHAR=y
#
# CLPS711X/EP721X Implementations
#
# CONFIG_ARCH_CDB89712 is not set
# CONFIG_ARCH_CLEP7312 is not set
# CONFIG_ARCH_EDB7211 is not set
# CONFIG_ARCH_P720T is not set
# CONFIG_ARCH_EP7211 is not set
# CONFIG_ARCH_EP7212 is not set
# CONFIG_ARCH_ACORN is not set
# CONFIG_FOOTBRIDGE is not set
# CONFIG_FOOTBRIDGE_HOST is not set
# CONFIG_FOOTBRIDGE_ADDIN is not set
CONFIG_CPU_32=y
# CONFIG_CPU_26 is not set
#
# Processor Type
#
# CONFIG_CPU_32v3 is not set
CONFIG_CPU_32v4=y
# CONFIG_CPU_ARM610 is not set
# CONFIG_CPU_ARM710 is not set
# CONFIG_CPU_ARM720T is not set
# CONFIG_CPU_ARM920T is not set
# CONFIG_CPU_ARM1020 is not set
# CONFIG_CPU_SA110 is not set
CONFIG_CPU_SA1100=y
# CONFIG_ARM_THUMB is not set
CONFIG_DISCONTIGMEM=y
#
# General setup
#
# CONFIG_PCI is not set
# CONFIG_ISA is not set
# CONFIG_ISA_DMA is not set
CONFIG_CPU_FREQ=y
CONFIG_HOTPLUG=y
#
# PCMCIA/CardBus support
#
CONFIG_PCMCIA=y
# CONFIG_I82365 is not set
# CONFIG_TCIC is not set
# CONFIG_PCMCIA_CLPS6700 is not set
CONFIG_PCMCIA_SA1100=y
CONFIG_NET=y
CONFIG_SYSVIPC=y
CONFIG_BSD_PROCESS_ACCT=y
CONFIG_SYSCTL=y
#
# At least one math emulation must be selected
#
CONFIG_FPE_NWFPE=y
# CONFIG_FPE_FASTFPE is not set
CONFIG_KCORE_ELF=y
# CONFIG_KCORE_AOUT is not set
# CONFIG_BINFMT_AOUT is not set
CONFIG_BINFMT_ELF=y
# CONFIG_BINFMT_MISC is not set
# CONFIG_PM is not set
# CONFIG_APM is not set
# CONFIG_ARTHUR is not set
CONFIG_CMDLINE="console=ttySA0 cpufreq_max=221200 root=/dev/mtdblock3 rw mem=64M"
# CONFIG_PFS168_CMDLINE is not set
# CONFIG_LEDS is not set
CONFIG_ALIGNMENT_TRAP=y
#
# Parallel port support
#
# CONFIG_PARPORT is not set
#
# Memory Technology Devices (MTD)
#
CONFIG_MTD=y
# CONFIG_MTD_DEBUG is not set
CONFIG_MTD_PARTITIONS=y
# CONFIG_MTD_REDBOOT_PARTS is not set
# CONFIG_MTD_BOOTLDR_PARTS is not set
# CONFIG_MTD_AFS_PARTS is not set
#
# User Modules And Translation Layers
#
CONFIG_MTD_CHAR=y
CONFIG_MTD_BLOCK=y
# CONFIG_FTL is not set
# CONFIG_NFTL is not set
#
# RAM/ROM/Flash chip drivers
#
CONFIG_MTD_CFI=y
# CONFIG_MTD_JEDECPROBE is not set
CONFIG_MTD_GEN_PROBE=y
CONFIG_MTD_CFI_ADV_OPTIONS=y
CONFIG_MTD_CFI_NOSWAP=y
# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set
# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
CONFIG_MTD_CFI_GEOMETRY=y
# CONFIG_MTD_CFI_B1 is not set
# CONFIG_MTD_CFI_B2 is not set
CONFIG_MTD_CFI_B4=y
# CONFIG_MTD_CFI_I1 is not set
CONFIG_MTD_CFI_I2=y
# CONFIG_MTD_CFI_I4 is not set
CONFIG_MTD_CFI_INTELEXT=y
# CONFIG_MTD_CFI_AMDSTD is not set
# CONFIG_MTD_RAM is not set
# CONFIG_MTD_ROM is not set
# CONFIG_MTD_ABSENT is not set
# CONFIG_MTD_OBSOLETE_CHIPS is not set
#
# Mapping drivers for chip access
#
# CONFIG_MTD_PHYSMAP is not set
# CONFIG_MTD_SUN_UFLASH is not set
# CONFIG_MTD_NORA is not set
# CONFIG_MTD_PNC2000 is not set
# CONFIG_MTD_RPXLITE is not set
# CONFIG_MTD_TQM8XXL is not set
# CONFIG_MTD_SC520CDP is not set
# CONFIG_MTD_NETSC520 is not set
# CONFIG_MTD_SBC_GXX is not set
# CONFIG_MTD_ELAN_104NC is not set
# CONFIG_MTD_DBOX2 is not set
# CONFIG_MTD_CSTM_MIPS_IXX is not set
# CONFIG_MTD_CFI_FLAGADM is not set
# CONFIG_MTD_SOLUTIONENGINE is not set
# CONFIG_MTD_MIXMEM is not set
# CONFIG_MTD_OCTAGON is not set
# CONFIG_MTD_VMAX is not set
# CONFIG_MTD_OCELOT is not set
# CONFIG_MTD_L440GX is not set
# CONFIG_MTD_ARM_INTEGRATOR is not set
# CONFIG_MTD_CDB89712 is not set
CONFIG_MTD_SA1100=y
# CONFIG_MTD_DC21285 is not set
# CONFIG_MTD_IQ80310 is not set
#
# Self-contained MTD device drivers
#
# CONFIG_MTD_PMC551 is not set
# CONFIG_MTD_SLRAM is not set
# CONFIG_MTD_LART is not set
# CONFIG_MTD_MTDRAM is not set
# CONFIG_MTD_BLKMTD is not set
#
# Disk-On-Chip Device Drivers
#
# CONFIG_MTD_DOC1000 is not set
# CONFIG_MTD_DOC2000 is not set
# CONFIG_MTD_DOC2001 is not set
# CONFIG_MTD_DOCPROBE is not set
#
# NAND Flash Device Drivers
#
# CONFIG_MTD_NAND is not set
#
# Plug and Play configuration
#
# CONFIG_PNP is not set
# CONFIG_ISAPNP is not set
# CONFIG_PNPBIOS is not set
#
# Block devices
#
# CONFIG_BLK_DEV_FD is not set
# CONFIG_BLK_DEV_XD is not set
# CONFIG_PARIDE is not set
# CONFIG_BLK_CPQ_DA is not set
# CONFIG_BLK_CPQ_CISS_DA is not set
# CONFIG_BLK_DEV_DAC960 is not set
CONFIG_BLK_DEV_LOOP=y
# CONFIG_BLK_DEV_NBD is not set
CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_RAM_SIZE=4096
CONFIG_BLK_DEV_INITRD=y
#
# Multi-device support (RAID and LVM)
#
# CONFIG_MD is not set
# CONFIG_BLK_DEV_MD is not set
# CONFIG_MD_LINEAR is not set
# CONFIG_MD_RAID0 is not set
# CONFIG_MD_RAID1 is not set
# CONFIG_MD_RAID5 is not set
# CONFIG_BLK_DEV_LVM is not set
#
# Networking options
#
CONFIG_PACKET=y
CONFIG_PACKET_MMAP=y
CONFIG_NETLINK=y
CONFIG_RTNETLINK=y
# CONFIG_NETLINK_DEV is not set
# CONFIG_NETFILTER is not set
CONFIG_FILTER=y
CONFIG_UNIX=y
CONFIG_INET=y
CONFIG_IP_MULTICAST=y
# CONFIG_IP_ADVANCED_ROUTER is not set
# CONFIG_IP_PNP is not set
# CONFIG_NET_IPIP is not set
# CONFIG_NET_IPGRE is not set
# CONFIG_IP_MROUTE is not set
# CONFIG_ARPD is not set
# CONFIG_INET_ECN is not set
# CONFIG_SYN_COOKIES is not set
# CONFIG_IPV6 is not set
# CONFIG_KHTTPD is not set
# CONFIG_ATM is not set
#
#
#
# CONFIG_IPX is not set
# CONFIG_ATALK is not set
# CONFIG_DECNET is not set
# CONFIG_BRIDGE is not set
# CONFIG_X25 is not set
# CONFIG_LAPB is not set
# CONFIG_LLC is not set
# CONFIG_NET_DIVERT is not set
# CONFIG_ECONET is not set
# CONFIG_WAN_ROUTER is not set
# CONFIG_NET_FASTROUTE is not set
# CONFIG_NET_HW_FLOWCONTROL is not set
#
# QoS and/or fair queueing
#
# CONFIG_NET_SCHED is not set
#
# Network device support
#
CONFIG_NETDEVICES=y
#
# ARCnet devices
#
# CONFIG_ARCNET is not set
# CONFIG_DUMMY is not set
# CONFIG_BONDING is not set
# CONFIG_EQUALIZER is not set
# CONFIG_TUN is not set
# CONFIG_ETHERTAP is not set
#
# Ethernet (10 or 100Mbit)
#
CONFIG_NET_ETHERNET=y
# CONFIG_SUNLANCE is not set
# CONFIG_SUNBMAC is not set
# CONFIG_SUNQE is not set
# CONFIG_SUNLANCE is not set
# CONFIG_SUNGEM is not set
CONFIG_NET_VENDOR_3COM=y
# CONFIG_EL1 is not set
# CONFIG_EL2 is not set
# CONFIG_ELPLUS is not set
# CONFIG_EL16 is not set
# CONFIG_ELMC is not set
# CONFIG_ELMC_II is not set
CONFIG_CERF_CS8900A=y
# CONFIG_LANCE is not set
# CONFIG_NET_VENDOR_SMC is not set
# CONFIG_NET_VENDOR_RACAL is not set
# CONFIG_NET_ISA is not set
# CONFIG_NET_PCI is not set
# CONFIG_NET_POCKET is not set
#
# Ethernet (1000 Mbit)
#
# CONFIG_ACENIC is not set
# CONFIG_DL2K is not set
# CONFIG_MYRI_SBUS is not set
# CONFIG_NS83820 is not set
# CONFIG_HAMACHI is not set
# CONFIG_YELLOWFIN is not set
# CONFIG_SK98LIN is not set
# CONFIG_FDDI is not set
# CONFIG_HIPPI is not set
# CONFIG_PLIP is not set
# CONFIG_PPP is not set
# CONFIG_SLIP is not set
#
# Wireless LAN (non-hamradio)
#
CONFIG_NET_RADIO=y
CONFIG_STRIP=m
CONFIG_WAVELAN=m
CONFIG_ARLAN=m
CONFIG_AIRONET4500=m
CONFIG_AIRONET4500_NONCS=m
# CONFIG_AIRONET4500_PNP is not set
# CONFIG_AIRONET4500_PCI is not set
# CONFIG_AIRONET4500_ISA is not set
# CONFIG_AIRONET4500_I365 is not set
CONFIG_AIRONET4500_PROC=m
#
# Wireless Pcmcia cards support
#
CONFIG_PCMCIA_HERMES=m
CONFIG_AIRO_CS=m
CONFIG_NET_WIRELESS=y
#
# Token Ring devices
#
# CONFIG_TR is not set
# CONFIG_NET_FC is not set
# CONFIG_RCPCI is not set
# CONFIG_SHAPER is not set
#
# Wan interfaces
#
# CONFIG_WAN is not set
#
# PCMCIA network device support
#
CONFIG_NET_PCMCIA=y
CONFIG_PCMCIA_3C589=m
CONFIG_PCMCIA_3C574=m
CONFIG_PCMCIA_FMVJ18X=m
CONFIG_PCMCIA_PCNET=m
CONFIG_PCMCIA_NMCLAN=m
CONFIG_PCMCIA_SMC91C92=m
CONFIG_PCMCIA_XIRC2PS=m
# CONFIG_ARCNET_COM20020_CS is not set
# CONFIG_PCMCIA_IBMTR is not set
CONFIG_NET_PCMCIA_RADIO=y
CONFIG_PCMCIA_RAYCS=m
CONFIG_PCMCIA_NETWAVE=m
CONFIG_PCMCIA_WAVELAN=m
CONFIG_AIRONET4500_CS=m
#
# Amateur Radio support
#
# CONFIG_HAMRADIO is not set
#
# IrDA (infrared) support
#
# CONFIG_IRDA is not set
#
# ATA/IDE/MFM/RLL support
#
CONFIG_IDE=y
#
# IDE, ATA and ATAPI Block devices
#
CONFIG_BLK_DEV_IDE=y
#
# Please see Documentation/ide.txt for help/info on IDE drives
#
# CONFIG_BLK_DEV_HD_IDE is not set
# CONFIG_BLK_DEV_HD is not set
CONFIG_BLK_DEV_IDEDISK=y
# CONFIG_IDEDISK_MULTI_MODE is not set
CONFIG_BLK_DEV_IDECS=m
# CONFIG_BLK_DEV_IDECD is not set
# CONFIG_BLK_DEV_IDETAPE is not set
# CONFIG_BLK_DEV_IDEFLOPPY is not set
# CONFIG_BLK_DEV_IDESCSI is not set
#
# IDE chipset support/bugfixes
#
# CONFIG_BLK_DEV_CMD640 is not set
# CONFIG_BLK_DEV_CMD640_ENHANCED is not set
# CONFIG_BLK_DEV_ISAPNP is not set
# CONFIG_IDE_CHIPSETS is not set
# CONFIG_IDEDMA_AUTO is not set
# CONFIG_BLK_DEV_ATARAID is not set
# CONFIG_BLK_DEV_ATARAID_PDC is not set
# CONFIG_BLK_DEV_ATARAID_HPT is not set
#
# SCSI support
#
# CONFIG_SCSI is not set
#
# I2O device support
#
# CONFIG_I2O is not set
# CONFIG_I2O_BLOCK is not set
# CONFIG_I2O_LAN is not set
# CONFIG_I2O_SCSI is not set
# CONFIG_I2O_PROC is not set
#
# ISDN subsystem
#
# CONFIG_ISDN is not set
#
# Input core support
#
# CONFIG_INPUT is not set
# CONFIG_INPUT_KEYBDEV is not set
# CONFIG_INPUT_MOUSEDEV is not set
# CONFIG_INPUT_JOYDEV is not set
# CONFIG_INPUT_EVDEV is not set
#
# Character devices
#
CONFIG_VT=y
CONFIG_VT_CONSOLE=y
# CONFIG_SERIAL is not set
# CONFIG_SERIAL_EXTENDED is not set
# CONFIG_SERIAL_NONSTANDARD is not set
#
# Serial drivers
#
# CONFIG_SERIAL_ANAKIN is not set
# CONFIG_SERIAL_ANAKIN_CONSOLE is not set
# CONFIG_SERIAL_AMBA is not set
# CONFIG_SERIAL_AMBA_CONSOLE is not set
# CONFIG_SERIAL_CLPS711X is not set
# CONFIG_SERIAL_CLPS711X_CONSOLE is not set
# CONFIG_SERIAL_21285 is not set
# CONFIG_SERIAL_21285_OLD is not set
# CONFIG_SERIAL_21285_CONSOLE is not set
CONFIG_SERIAL_SA1100=y
CONFIG_SERIAL_SA1100_CONSOLE=y
CONFIG_SA1100_DEFAULT_BAUDRATE=38400
CONFIG_SERIAL_8250=y
# CONFIG_SERIAL_8250_CONSOLE is not set
# CONFIG_SERIAL_8250_EXTENDED is not set
# CONFIG_SERIAL_8250_MANY_PORTS is not set
# CONFIG_SERIAL_8250_SHARE_IRQ is not set
# CONFIG_SERIAL_8250_DETECT_IRQ is not set
# CONFIG_SERIAL_8250_MULTIPORT is not set
# CONFIG_SERIAL_8250_HUB6 is not set
CONFIG_SERIAL_CORE=y
CONFIG_SERIAL_CORE_CONSOLE=y
CONFIG_UNIX98_PTYS=y
CONFIG_UNIX98_PTY_COUNT=32
CONFIG_UCB1200=y
CONFIG_TOUCHSCREEN_UCB1200=y
CONFIG_CERF_TS_MANUAL=y
CONFIG_CERF_TS_MAXX="924"
CONFIG_CERF_TS_MAXY="920"
CONFIG_CERF_TS_MINX="57"
CONFIG_CERF_TS_MINY="52"
CONFIG_CERF_TS_RESX="240"
CONFIG_CERF_TS_RESY="320"
# CONFIG_AUDIO_UCB1200 is not set
# CONFIG_ADC_UCB1200 is not set
# CONFIG_TOUCHSCREEN_H3600 is not set
# CONFIG_PROFILER is not set
# CONFIG_PFS168_SPI is not set
# CONFIG_PFS168_DTMF is not set
# CONFIG_PFS168_MISC is not set
CONFIG_SA1100_CERF_KEYPAD=y
#
# I2C support
#
# CONFIG_I2C is not set
#
# L3 serial bus support
#
# CONFIG_L3 is not set
# CONFIG_L3_ALGOBIT is not set
# CONFIG_L3_BIT_SA1100_GPIO is not set
# CONFIG_BIT_SA1100_UCB1200 is not set
#
# Other L3 adapters
#
# CONFIG_L3_SA1111 is not set
#
# L3 driver support
#
# CONFIG_L3_DRV_UDA1341 is not set
# CONFIG_BIT_SA1100_GPIO is not set
#
# Mice
#
# CONFIG_BUSMOUSE is not set
# CONFIG_MOUSE is not set
#
# Joysticks
#
# CONFIG_INPUT_GAMEPORT is not set
#
# Input core support is needed for gameports
#
#
# Input core support is needed for joysticks
#
# CONFIG_QIC02_TAPE is not set
#
# Watchdog Cards
#
# CONFIG_WATCHDOG is not set
# CONFIG_INTEL_RNG is not set
# CONFIG_NVRAM is not set
# CONFIG_RTC is not set
CONFIG_SA1100_RTC=y
# CONFIG_DTLK is not set
# CONFIG_R3964 is not set
# CONFIG_APPLICOM is not set
# CONFIG_SONYPI is not set
#
# Ftape, the floppy tape device driver
#
# CONFIG_FTAPE is not set
# CONFIG_AGP is not set
# CONFIG_DRM is not set
#
# PCMCIA character devices
#
#
# Multimedia devices
#
# CONFIG_VIDEO_DEV is not set
#
# File systems
#
# CONFIG_QUOTA is not set
# CONFIG_AUTOFS_FS is not set
# CONFIG_AUTOFS4_FS is not set
# CONFIG_REISERFS_FS is not set
# CONFIG_REISERFS_CHECK is not set
# CONFIG_REISERFS_PROC_INFO is not set
# CONFIG_ADFS_FS is not set
# CONFIG_ADFS_FS_RW is not set
# CONFIG_AFFS_FS is not set
# CONFIG_HFS_FS is not set
# CONFIG_BFS_FS is not set
# CONFIG_CMS_FS is not set
# CONFIG_EXT3_FS is not set
# CONFIG_JBD is not set
# CONFIG_JBD_DEBUG is not set
CONFIG_FAT_FS=y
CONFIG_MSDOS_FS=y
CONFIG_UMSDOS_FS=y
CONFIG_VFAT_FS=y
# CONFIG_EFS_FS is not set
# CONFIG_JFFS_FS is not set
CONFIG_JFFS2_FS=y
CONFIG_JFFS2_FS_DEBUG=0
# CONFIG_CRAMFS is not set
# CONFIG_TMPFS is not set
CONFIG_RAMFS=y
# CONFIG_ISO9660_FS is not set
# CONFIG_JOLIET is not set
# CONFIG_MINIX_FS is not set
# CONFIG_FREEVXFS_FS is not set
# CONFIG_NTFS_FS is not set
# CONFIG_NTFS_DEBUG is not set
# CONFIG_NTFS_RW is not set
# CONFIG_HPFS_FS is not set
CONFIG_PROC_FS=y
# CONFIG_DEVFS_FS is not set
# CONFIG_DEVFS_MOUNT is not set
# CONFIG_DEVFS_DEBUG is not set
CONFIG_DEVPTS_FS=y
# CONFIG_QNX4FS_FS is not set
# CONFIG_QNX4FS_RW is not set
CONFIG_ROMFS_FS=y
CONFIG_EXT2_FS=y
# CONFIG_SYSV_FS is not set
# CONFIG_UDF_FS is not set
# CONFIG_UDF_RW is not set
# CONFIG_UFS_FS is not set
# CONFIG_UFS_FS_WRITE is not set
#
# Network File Systems
#
# CONFIG_CODA_FS is not set
# CONFIG_INTERMEZZO_FS is not set
CONFIG_NFS_FS=y
CONFIG_NFS_V3=y
# CONFIG_ROOT_NFS is not set
# CONFIG_NFSD is not set
# CONFIG_NFSD_V3 is not set
CONFIG_SUNRPC=y
CONFIG_LOCKD=y
CONFIG_LOCKD_V4=y
# CONFIG_SMB_FS is not set
# CONFIG_NCP_FS is not set
# CONFIG_NCPFS_PACKET_SIGNING is not set
# CONFIG_NCPFS_IOCTL_LOCKING is not set
# CONFIG_NCPFS_STRONG is not set
# CONFIG_NCPFS_NFS_NS is not set
# CONFIG_NCPFS_OS2_NS is not set
# CONFIG_NCPFS_SMALLDOS is not set
# CONFIG_NCPFS_NLS is not set
# CONFIG_NCPFS_EXTRAS is not set
#
# Partition Types
#
# CONFIG_PARTITION_ADVANCED is not set
CONFIG_MSDOS_PARTITION=y
# CONFIG_SMB_NLS is not set
CONFIG_NLS=y
#
# Native Language Support
#
CONFIG_NLS_DEFAULT="iso8859-1"
# CONFIG_NLS_CODEPAGE_437 is not set
# CONFIG_NLS_CODEPAGE_737 is not set
# CONFIG_NLS_CODEPAGE_775 is not set
# CONFIG_NLS_CODEPAGE_850 is not set
# CONFIG_NLS_CODEPAGE_852 is not set
# CONFIG_NLS_CODEPAGE_855 is not set
# CONFIG_NLS_CODEPAGE_857 is not set
# CONFIG_NLS_CODEPAGE_860 is not set
# CONFIG_NLS_CODEPAGE_861 is not set
# CONFIG_NLS_CODEPAGE_862 is not set
# CONFIG_NLS_CODEPAGE_863 is not set
# CONFIG_NLS_CODEPAGE_864 is not set
# CONFIG_NLS_CODEPAGE_865 is not set
# CONFIG_NLS_CODEPAGE_866 is not set
# CONFIG_NLS_CODEPAGE_869 is not set
# CONFIG_NLS_CODEPAGE_936 is not set
# CONFIG_NLS_CODEPAGE_950 is not set
# CONFIG_NLS_CODEPAGE_932 is not set
# CONFIG_NLS_CODEPAGE_949 is not set
# CONFIG_NLS_CODEPAGE_874 is not set
# CONFIG_NLS_ISO8859_8 is not set
# CONFIG_NLS_CODEPAGE_1251 is not set
# CONFIG_NLS_ISO8859_1 is not set
# CONFIG_NLS_ISO8859_2 is not set
# CONFIG_NLS_ISO8859_3 is not set
# CONFIG_NLS_ISO8859_4 is not set
# CONFIG_NLS_ISO8859_5 is not set
# CONFIG_NLS_ISO8859_6 is not set
# CONFIG_NLS_ISO8859_7 is not set
# CONFIG_NLS_ISO8859_9 is not set
# CONFIG_NLS_ISO8859_13 is not set
# CONFIG_NLS_ISO8859_14 is not set
# CONFIG_NLS_ISO8859_15 is not set
# CONFIG_NLS_KOI8_R is not set
# CONFIG_NLS_KOI8_U is not set
# CONFIG_NLS_UTF8 is not set
#
# Console drivers
#
CONFIG_PC_KEYMAP=y
# CONFIG_VGA_CONSOLE is not set
#
# Frame-buffer support
#
CONFIG_FB=y
CONFIG_DUMMY_CONSOLE=y
# CONFIG_FB_ACORN is not set
# CONFIG_FB_ANAKIN is not set
# CONFIG_FB_CLPS711X is not set
# CONFIG_FB_CYBER2000 is not set
CONFIG_FB_SA1100=y
CONFIG_CERF_LCD_38_A=y
# CONFIG_CERF_LCD_57_A is not set
# CONFIG_CERF_LCD_72_A is not set
CONFIG_SA1100_CERF_LCD_BACKLIGHT=y
# CONFIG_FB_VIRTUAL is not set
# CONFIG_FBCON_ADVANCED is not set
CONFIG_FBCON_CFB2=y
CONFIG_FBCON_CFB4=y
CONFIG_FBCON_CFB8=y
CONFIG_FBCON_CFB16=y
# CONFIG_FBCON_FONTWIDTH8_ONLY is not set
# CONFIG_FBCON_FONTS is not set
CONFIG_FONT_8x8=y
CONFIG_FONT_8x16=y
#
# Sound
#
CONFIG_SOUND=y
# CONFIG_SOUND_BT878 is not set
# CONFIG_SOUND_CMPCI is not set
# CONFIG_SOUND_EMU10K1 is not set
# CONFIG_MIDI_EMU10K1 is not set
# CONFIG_SOUND_FUSION is not set
# CONFIG_SOUND_CS4281 is not set
# CONFIG_SOUND_ES1370 is not set
# CONFIG_SOUND_ES1371 is not set
# CONFIG_SOUND_ESSSOLO1 is not set
# CONFIG_SOUND_MAESTRO is not set
# CONFIG_SOUND_MAESTRO3 is not set
# CONFIG_SOUND_ICH is not set
# CONFIG_SOUND_RME96XX is not set
# CONFIG_SOUND_SONICVIBES is not set
# CONFIG_SOUND_TRIDENT is not set
# CONFIG_SOUND_MSNDCLAS is not set
# CONFIG_SOUND_MSNDPIN is not set
# CONFIG_SOUND_VIA82CXXX is not set
# CONFIG_MIDI_VIA82CXXX is not set
# CONFIG_SOUND_ASSABET_UDA1341 is not set
# CONFIG_SOUND_H3600_UDA1341 is not set
# CONFIG_SOUND_PANGOLIN_UDA1341 is not set
# CONFIG_SOUND_SA1111_UDA1341 is not set
CONFIG_SOUND_CERF_UDA1341=y
# CONFIG_SOUND_SA1100SSP is not set
# CONFIG_SOUND_OSS is not set
# CONFIG_SOUND_WAVEARTIST is not set
# CONFIG_SOUND_TVMIXER is not set
#
# USB support
#
# CONFIG_USB is not set
#
# USB Controllers
#
# CONFIG_USB_UHCI is not set
# CONFIG_USB_UHCI_ALT is not set
# CONFIG_USB_OHCI is not set
# CONFIG_USB_OHCI_SA1111 is not set
#
# USB Device Class drivers
#
# CONFIG_USB_AUDIO is not set
# CONFIG_USB_BLUETOOTH is not set
# CONFIG_USB_STORAGE is not set
# CONFIG_USB_STORAGE_DEBUG is not set
# CONFIG_USB_STORAGE_DATAFAB is not set
# CONFIG_USB_STORAGE_FREECOM is not set
# CONFIG_USB_STORAGE_ISD200 is not set
# CONFIG_USB_STORAGE_JUMPSHOT is not set
# CONFIG_USB_STORAGE_DPCM is not set
# CONFIG_USB_STORAGE_HP8200e is not set
# CONFIG_USB_STORAGE_SDDR09 is not set
# CONFIG_USB_ACM is not set
# CONFIG_USB_PRINTER is not set
#
# USB Human Interface Devices (HID)
#
#
# Input core support is needed for USB HID
#
#
# USB Imaging devices
#
# CONFIG_USB_DC2XX is not set
# CONFIG_USB_MDC800 is not set
# CONFIG_USB_SCANNER is not set
# CONFIG_USB_MICROTEK is not set
# CONFIG_USB_HPUSBSCSI is not set
#
# USB Multimedia devices
#
#
# Video4Linux support is needed for USB Multimedia device support
#
# CONFIG_USB_DABUSB is not set
#
# USB Network adaptors
#
# CONFIG_USB_PLUSB is not set
# CONFIG_USB_PEGASUS is not set
# CONFIG_USB_KAWETH is not set
# CONFIG_USB_CATC is not set
# CONFIG_USB_CDCETHER is not set
# CONFIG_USB_USBNET is not set
#
# USB port drivers
#
# CONFIG_USB_USS720 is not set
#
# USB Serial Converter support
#
# CONFIG_USB_SERIAL is not set
# CONFIG_USB_SERIAL_GENERIC is not set
# CONFIG_USB_SERIAL_BELKIN is not set
# CONFIG_USB_SERIAL_WHITEHEAT is not set
# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set
# CONFIG_USB_SERIAL_EMPEG is not set
# CONFIG_USB_SERIAL_FTDI_SIO is not set
# CONFIG_USB_SERIAL_VISOR is not set
# CONFIG_USB_SERIAL_EDGEPORT is not set
# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set
# CONFIG_USB_SERIAL_KEYSPAN is not set
# CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set
# CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set
# CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set
# CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set
# CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set
# CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set
# CONFIG_USB_SERIAL_MCT_U232 is not set
# CONFIG_USB_SERIAL_PL2303 is not set
# CONFIG_USB_SERIAL_CYBERJACK is not set
# CONFIG_USB_SERIAL_OMNINET is not set
#
# Miscellaneous USB drivers
#
# CONFIG_USB_RIO500 is not set
# CONFIG_USB_ID75 is not set
#
# Bluetooth support
#
CONFIG_BT=y
CONFIG_BT_L2CAP=y
#
# Bluetooth device drivers
#
# CONFIG_BT_HCIUSB is not set
CONFIG_BT_HCIUART=y
# CONFIG_BT_HCIVHCI is not set
#
# Kernel hacking
#
CONFIG_FRAME_POINTER=y
CONFIG_DEBUG_ERRORS=y
CONFIG_DEBUG_USER=y
# CONFIG_DEBUG_INFO is not set
CONFIG_MAGIC_SYSRQ=y
# CONFIG_NO_PGT_CACHE is not set
# CONFIG_DEBUG_LL is not set
# CONFIG_DEBUG_DC21285_PORT is not set
# CONFIG_DEBUG_CLPS711X_UART2 is not set
arch/arm/configs/cerfpod_defconfig
deleted
100644 → 0
View file @
d00ea9a1
#
# Automatically generated make config: don't edit
#
CONFIG_ARM=y
# CONFIG_EISA is not set
# CONFIG_SBUS is not set
# CONFIG_MCA is not set
CONFIG_UID16=y
CONFIG_RWSEM_GENERIC_SPINLOCK=y
# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set
#
# Code maturity level options
#
CONFIG_EXPERIMENTAL=y
# CONFIG_OBSOLETE is not set
#
# Loadable module support
#
CONFIG_MODULES=y
# CONFIG_MODVERSIONS is not set
# CONFIG_KMOD is not set
#
# System Type
#
# CONFIG_ARCH_ANAKIN is not set
# CONFIG_ARCH_ARCA5K is not set
# CONFIG_ARCH_CLPS7500 is not set
# CONFIG_ARCH_CLPS711X is not set
# CONFIG_ARCH_CO285 is not set
# CONFIG_ARCH_EBSA110 is not set
# CONFIG_ARCH_FOOTBRIDGE is not set
# CONFIG_ARCH_INTEGRATOR is not set
# CONFIG_ARCH_L7200 is not set
# CONFIG_ARCH_RPC is not set
CONFIG_ARCH_SA1100=y
# CONFIG_ARCH_SHARK is not set
#
# Archimedes/A5000 Implementations
#
#
# Archimedes/A5000 Implementations (select only ONE)
#
# CONFIG_ARCH_ARC is not set
# CONFIG_ARCH_A5K is not set
#
# Footbridge Implementations
#
# CONFIG_ARCH_CATS is not set
# CONFIG_ARCH_PERSONAL_SERVER is not set
# CONFIG_ARCH_EBSA285_ADDIN is not set
# CONFIG_ARCH_EBSA285_HOST is not set
# CONFIG_ARCH_NETWINDER is not set
#
# SA11x0 Implementations
#
# CONFIG_SA1100_ASSABET is not set
# CONFIG_ASSABET_NEPONSET is not set
# CONFIG_SA1100_ADSBITSY is not set
# CONFIG_SA1100_BRUTUS is not set
CONFIG_SA1100_CERF=y
# CONFIG_SA1100_CERF_FLASH_8MB is not set
CONFIG_SA1100_CERF_FLASH_16MB=y
# CONFIG_SA1100_CERF_FLASH_32MB is not set
# CONFIG_SA1100_CERF_CPLD is not set
# CONFIG_SA1100_H3600 is not set
# CONFIG_SA1100_EXTENEX1 is not set
# CONFIG_SA1100_FLEXANET is not set
# CONFIG_SA1100_FREEBIRD is not set
# CONFIG_SA1100_GRAPHICSCLIENT is not set
# CONFIG_SA1100_GRAPHICSMASTER is not set
# CONFIG_SA1100_JORNADA720 is not set
# CONFIG_SA1100_HUW_WEBPANEL is not set
# CONFIG_SA1100_ITSY is not set
# CONFIG_SA1100_LART is not set
# CONFIG_SA1100_NANOENGINE is not set
# CONFIG_SA1100_OMNIMETER is not set
# CONFIG_SA1100_PANGOLIN is not set
# CONFIG_SA1100_PLEB is not set
# CONFIG_SA1100_SHERMAN is not set
# CONFIG_SA1100_SIMPAD is not set
# CONFIG_SA1100_PFS168 is not set
# CONFIG_SA1100_VICTOR is not set
# CONFIG_SA1100_XP860 is not set
# CONFIG_SA1100_YOPY is not set
CONFIG_SA1100_USB=y
CONFIG_SA1100_USB_NETLINK=y
CONFIG_SA1100_USB_CHAR=y
#
# CLPS711X/EP721X Implementations
#
# CONFIG_ARCH_CDB89712 is not set
# CONFIG_ARCH_CLEP7312 is not set
# CONFIG_ARCH_EDB7211 is not set
# CONFIG_ARCH_P720T is not set
# CONFIG_ARCH_EP7211 is not set
# CONFIG_ARCH_EP7212 is not set
# CONFIG_ARCH_ACORN is not set
# CONFIG_FOOTBRIDGE is not set
# CONFIG_FOOTBRIDGE_HOST is not set
# CONFIG_FOOTBRIDGE_ADDIN is not set
CONFIG_CPU_32=y
# CONFIG_CPU_26 is not set
#
# Processor Type
#
# CONFIG_CPU_32v3 is not set
CONFIG_CPU_32v4=y
# CONFIG_CPU_ARM610 is not set
# CONFIG_CPU_ARM710 is not set
# CONFIG_CPU_ARM720T is not set
# CONFIG_CPU_ARM920T is not set
# CONFIG_CPU_ARM1020 is not set
# CONFIG_CPU_SA110 is not set
CONFIG_CPU_SA1100=y
# CONFIG_ARM_THUMB is not set
CONFIG_DISCONTIGMEM=y
#
# General setup
#
# CONFIG_PCI is not set
# CONFIG_ISA is not set
# CONFIG_ISA_DMA is not set
CONFIG_CPU_FREQ=y
CONFIG_HOTPLUG=y
#
# PCMCIA/CardBus support
#
CONFIG_PCMCIA=y
# CONFIG_I82365 is not set
# CONFIG_TCIC is not set
# CONFIG_PCMCIA_CLPS6700 is not set
CONFIG_PCMCIA_SA1100=y
CONFIG_NET=y
CONFIG_SYSVIPC=y
CONFIG_BSD_PROCESS_ACCT=y
CONFIG_SYSCTL=y
#
# At least one math emulation must be selected
#
CONFIG_FPE_NWFPE=y
# CONFIG_FPE_FASTFPE is not set
CONFIG_KCORE_ELF=y
# CONFIG_KCORE_AOUT is not set
# CONFIG_BINFMT_AOUT is not set
CONFIG_BINFMT_ELF=y
# CONFIG_BINFMT_MISC is not set
# CONFIG_PM is not set
# CONFIG_APM is not set
# CONFIG_ARTHUR is not set
CONFIG_CMDLINE="console=ttySA0 root=/dev/mtdblock3 rw mem=32M"
# CONFIG_PFS168_CMDLINE is not set
CONFIG_LEDS=y
CONFIG_LEDS_TIMER=y
CONFIG_LEDS_CPU=y
CONFIG_ALIGNMENT_TRAP=y
#
# Parallel port support
#
# CONFIG_PARPORT is not set
#
# Memory Technology Devices (MTD)
#
CONFIG_MTD=y
# CONFIG_MTD_DEBUG is not set
CONFIG_MTD_PARTITIONS=y
# CONFIG_MTD_REDBOOT_PARTS is not set
# CONFIG_MTD_BOOTLDR_PARTS is not set
# CONFIG_MTD_AFS_PARTS is not set
#
# User Modules And Translation Layers
#
CONFIG_MTD_CHAR=y
CONFIG_MTD_BLOCK=y
# CONFIG_FTL is not set
# CONFIG_NFTL is not set
#
# RAM/ROM/Flash chip drivers
#
CONFIG_MTD_CFI=y
# CONFIG_MTD_JEDECPROBE is not set
CONFIG_MTD_GEN_PROBE=y
# CONFIG_MTD_CFI_ADV_OPTIONS is not set
CONFIG_MTD_CFI_INTELEXT=y
# CONFIG_MTD_CFI_AMDSTD is not set
# CONFIG_MTD_RAM is not set
# CONFIG_MTD_ROM is not set
# CONFIG_MTD_ABSENT is not set
# CONFIG_MTD_OBSOLETE_CHIPS is not set
#
# Mapping drivers for chip access
#
# CONFIG_MTD_PHYSMAP is not set
# CONFIG_MTD_SUN_UFLASH is not set
# CONFIG_MTD_NORA is not set
# CONFIG_MTD_PNC2000 is not set
# CONFIG_MTD_RPXLITE is not set
# CONFIG_MTD_TQM8XXL is not set
# CONFIG_MTD_SC520CDP is not set
# CONFIG_MTD_NETSC520 is not set
# CONFIG_MTD_SBC_GXX is not set
# CONFIG_MTD_ELAN_104NC is not set
# CONFIG_MTD_DBOX2 is not set
# CONFIG_MTD_CSTM_MIPS_IXX is not set
# CONFIG_MTD_CFI_FLAGADM is not set
# CONFIG_MTD_SOLUTIONENGINE is not set
# CONFIG_MTD_MIXMEM is not set
# CONFIG_MTD_OCTAGON is not set
# CONFIG_MTD_VMAX is not set
# CONFIG_MTD_OCELOT is not set
# CONFIG_MTD_L440GX is not set
# CONFIG_MTD_ARM_INTEGRATOR is not set
# CONFIG_MTD_CDB89712 is not set
CONFIG_MTD_SA1100=y
# CONFIG_MTD_DC21285 is not set
# CONFIG_MTD_IQ80310 is not set
#
# Self-contained MTD device drivers
#
# CONFIG_MTD_PMC551 is not set
# CONFIG_MTD_SLRAM is not set
# CONFIG_MTD_LART is not set
# CONFIG_MTD_MTDRAM is not set
# CONFIG_MTD_BLKMTD is not set
#
# Disk-On-Chip Device Drivers
#
# CONFIG_MTD_DOC1000 is not set
# CONFIG_MTD_DOC2000 is not set
# CONFIG_MTD_DOC2001 is not set
# CONFIG_MTD_DOCPROBE is not set
#
# NAND Flash Device Drivers
#
# CONFIG_MTD_NAND is not set
#
# Plug and Play configuration
#
# CONFIG_PNP is not set
# CONFIG_ISAPNP is not set
# CONFIG_PNPBIOS is not set
#
# Block devices
#
# CONFIG_BLK_DEV_FD is not set
# CONFIG_BLK_DEV_XD is not set
# CONFIG_PARIDE is not set
# CONFIG_BLK_CPQ_DA is not set
# CONFIG_BLK_CPQ_CISS_DA is not set
# CONFIG_BLK_DEV_DAC960 is not set
CONFIG_BLK_DEV_LOOP=y
# CONFIG_BLK_DEV_NBD is not set
CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_RAM_SIZE=4096
CONFIG_BLK_DEV_INITRD=y
#
# Multi-device support (RAID and LVM)
#
# CONFIG_MD is not set
# CONFIG_BLK_DEV_MD is not set
# CONFIG_MD_LINEAR is not set
# CONFIG_MD_RAID0 is not set
# CONFIG_MD_RAID1 is not set
# CONFIG_MD_RAID5 is not set
# CONFIG_BLK_DEV_LVM is not set
#
# Networking options
#
CONFIG_PACKET=y
CONFIG_PACKET_MMAP=y
CONFIG_NETLINK=y
CONFIG_RTNETLINK=y
# CONFIG_NETLINK_DEV is not set
# CONFIG_NETFILTER is not set
CONFIG_FILTER=y
CONFIG_UNIX=y
CONFIG_INET=y
CONFIG_IP_MULTICAST=y
# CONFIG_IP_ADVANCED_ROUTER is not set
# CONFIG_IP_PNP is not set
# CONFIG_NET_IPIP is not set
# CONFIG_NET_IPGRE is not set
# CONFIG_IP_MROUTE is not set
# CONFIG_ARPD is not set
# CONFIG_INET_ECN is not set
# CONFIG_SYN_COOKIES is not set
# CONFIG_IPV6 is not set
# CONFIG_KHTTPD is not set
# CONFIG_ATM is not set
#
#
#
# CONFIG_IPX is not set
# CONFIG_ATALK is not set
# CONFIG_DECNET is not set
# CONFIG_BRIDGE is not set
# CONFIG_X25 is not set
# CONFIG_LAPB is not set
# CONFIG_LLC is not set
# CONFIG_NET_DIVERT is not set
# CONFIG_ECONET is not set
# CONFIG_WAN_ROUTER is not set
# CONFIG_NET_FASTROUTE is not set
# CONFIG_NET_HW_FLOWCONTROL is not set
#
# QoS and/or fair queueing
#
# CONFIG_NET_SCHED is not set
#
# Network device support
#
CONFIG_NETDEVICES=y
#
# ARCnet devices
#
# CONFIG_ARCNET is not set
# CONFIG_DUMMY is not set
# CONFIG_BONDING is not set
# CONFIG_EQUALIZER is not set
# CONFIG_TUN is not set
# CONFIG_ETHERTAP is not set
#
# Ethernet (10 or 100Mbit)
#
CONFIG_NET_ETHERNET=y
# CONFIG_SUNLANCE is not set
# CONFIG_SUNBMAC is not set
# CONFIG_SUNQE is not set
# CONFIG_SUNLANCE is not set
# CONFIG_SUNGEM is not set
CONFIG_NET_VENDOR_3COM=y
# CONFIG_EL1 is not set
# CONFIG_EL2 is not set
# CONFIG_ELPLUS is not set
# CONFIG_EL16 is not set
# CONFIG_ELMC is not set
# CONFIG_ELMC_II is not set
CONFIG_CERF_CS8900A=y
# CONFIG_LANCE is not set
# CONFIG_NET_VENDOR_SMC is not set
# CONFIG_NET_VENDOR_RACAL is not set
# CONFIG_NET_ISA is not set
# CONFIG_NET_PCI is not set
# CONFIG_NET_POCKET is not set
#
# Ethernet (1000 Mbit)
#
# CONFIG_ACENIC is not set
# CONFIG_DL2K is not set
# CONFIG_MYRI_SBUS is not set
# CONFIG_NS83820 is not set
# CONFIG_HAMACHI is not set
# CONFIG_YELLOWFIN is not set
# CONFIG_SK98LIN is not set
# CONFIG_FDDI is not set
# CONFIG_HIPPI is not set
# CONFIG_PLIP is not set
# CONFIG_PPP is not set
# CONFIG_SLIP is not set
#
# Wireless LAN (non-hamradio)
#
# CONFIG_NET_RADIO is not set
#
# Token Ring devices
#
# CONFIG_TR is not set
# CONFIG_NET_FC is not set
# CONFIG_RCPCI is not set
# CONFIG_SHAPER is not set
#
# Wan interfaces
#
# CONFIG_WAN is not set
#
# PCMCIA network device support
#
CONFIG_NET_PCMCIA=y
# CONFIG_PCMCIA_3C589 is not set
# CONFIG_PCMCIA_3C574 is not set
# CONFIG_PCMCIA_FMVJ18X is not set
CONFIG_PCMCIA_PCNET=y
# CONFIG_PCMCIA_NMCLAN is not set
# CONFIG_PCMCIA_SMC91C92 is not set
# CONFIG_PCMCIA_XIRC2PS is not set
# CONFIG_ARCNET_COM20020_CS is not set
# CONFIG_PCMCIA_IBMTR is not set
# CONFIG_NET_PCMCIA_RADIO is not set
#
# Amateur Radio support
#
# CONFIG_HAMRADIO is not set
#
# IrDA (infrared) support
#
# CONFIG_IRDA is not set
#
# ATA/IDE/MFM/RLL support
#
CONFIG_IDE=y
#
# IDE, ATA and ATAPI Block devices
#
CONFIG_BLK_DEV_IDE=y
#
# Please see Documentation/ide.txt for help/info on IDE drives
#
# CONFIG_BLK_DEV_HD_IDE is not set
# CONFIG_BLK_DEV_HD is not set
CONFIG_BLK_DEV_IDEDISK=y
# CONFIG_IDEDISK_MULTI_MODE is not set
CONFIG_BLK_DEV_IDECS=m
# CONFIG_BLK_DEV_IDECD is not set
# CONFIG_BLK_DEV_IDETAPE is not set
# CONFIG_BLK_DEV_IDEFLOPPY is not set
# CONFIG_BLK_DEV_IDESCSI is not set
#
# IDE chipset support/bugfixes
#
# CONFIG_BLK_DEV_CMD640 is not set
# CONFIG_BLK_DEV_CMD640_ENHANCED is not set
# CONFIG_BLK_DEV_ISAPNP is not set
# CONFIG_IDE_CHIPSETS is not set
# CONFIG_IDEDMA_AUTO is not set
# CONFIG_BLK_DEV_ATARAID is not set
# CONFIG_BLK_DEV_ATARAID_PDC is not set
# CONFIG_BLK_DEV_ATARAID_HPT is not set
#
# SCSI support
#
# CONFIG_SCSI is not set
#
# I2O device support
#
# CONFIG_I2O is not set
# CONFIG_I2O_BLOCK is not set
# CONFIG_I2O_LAN is not set
# CONFIG_I2O_SCSI is not set
# CONFIG_I2O_PROC is not set
#
# ISDN subsystem
#
# CONFIG_ISDN is not set
#
# Input core support
#
# CONFIG_INPUT is not set
# CONFIG_INPUT_KEYBDEV is not set
# CONFIG_INPUT_MOUSEDEV is not set
# CONFIG_INPUT_JOYDEV is not set
# CONFIG_INPUT_EVDEV is not set
#
# Character devices
#
CONFIG_VT=y
# CONFIG_VT_CONSOLE is not set
# CONFIG_SERIAL is not set
# CONFIG_SERIAL_EXTENDED is not set
# CONFIG_SERIAL_NONSTANDARD is not set
#
# Serial drivers
#
# CONFIG_SERIAL_ANAKIN is not set
# CONFIG_SERIAL_ANAKIN_CONSOLE is not set
# CONFIG_SERIAL_AMBA is not set
# CONFIG_SERIAL_AMBA_CONSOLE is not set
# CONFIG_SERIAL_CLPS711X is not set
# CONFIG_SERIAL_CLPS711X_CONSOLE is not set
# CONFIG_SERIAL_21285 is not set
# CONFIG_SERIAL_21285_OLD is not set
# CONFIG_SERIAL_21285_CONSOLE is not set
CONFIG_SERIAL_SA1100=y
CONFIG_SERIAL_SA1100_CONSOLE=y
CONFIG_SA1100_DEFAULT_BAUDRATE=38400
# CONFIG_SERIAL_8250 is not set
# CONFIG_SERIAL_8250_CONSOLE is not set
# CONFIG_SERIAL_8250_EXTENDED is not set
# CONFIG_SERIAL_8250_MANY_PORTS is not set
# CONFIG_SERIAL_8250_SHARE_IRQ is not set
# CONFIG_SERIAL_8250_DETECT_IRQ is not set
# CONFIG_SERIAL_8250_MULTIPORT is not set
# CONFIG_SERIAL_8250_HUB6 is not set
CONFIG_SERIAL_CORE=y
CONFIG_SERIAL_CORE_CONSOLE=y
CONFIG_UNIX98_PTYS=y
CONFIG_UNIX98_PTY_COUNT=32
CONFIG_UCB1200=y
CONFIG_TOUCHSCREEN_UCB1200=y
# CONFIG_CERF_TS_MANUAL is not set
CONFIG_AUDIO_UCB1200=y
# CONFIG_ADC_UCB1200 is not set
# CONFIG_TOUCHSCREEN_H3600 is not set
# CONFIG_PROFILER is not set
# CONFIG_PFS168_SPI is not set
# CONFIG_PFS168_DTMF is not set
# CONFIG_PFS168_MISC is not set
#
# I2C support
#
# CONFIG_I2C is not set
#
# L3 serial bus support
#
# CONFIG_L3 is not set
# CONFIG_L3_ALGOBIT is not set
# CONFIG_L3_BIT_SA1100_GPIO is not set
# CONFIG_BIT_SA1100_UCB1200 is not set
#
# Other L3 adapters
#
# CONFIG_L3_SA1111 is not set
#
# L3 driver support
#
# CONFIG_L3_DRV_UDA1341 is not set
# CONFIG_BIT_SA1100_GPIO is not set
#
# Mice
#
# CONFIG_BUSMOUSE is not set
# CONFIG_MOUSE is not set
#
# Joysticks
#
# CONFIG_INPUT_GAMEPORT is not set
#
# Input core support is needed for gameports
#
#
# Input core support is needed for joysticks
#
# CONFIG_QIC02_TAPE is not set
#
# Watchdog Cards
#
# CONFIG_WATCHDOG is not set
# CONFIG_INTEL_RNG is not set
# CONFIG_NVRAM is not set
# CONFIG_RTC is not set
CONFIG_SA1100_RTC=y
# CONFIG_DTLK is not set
# CONFIG_R3964 is not set
# CONFIG_APPLICOM is not set
# CONFIG_SONYPI is not set
#
# Ftape, the floppy tape device driver
#
# CONFIG_FTAPE is not set
# CONFIG_AGP is not set
# CONFIG_DRM is not set
#
# PCMCIA character devices
#
#
# Multimedia devices
#
# CONFIG_VIDEO_DEV is not set
#
# File systems
#
# CONFIG_QUOTA is not set
# CONFIG_AUTOFS_FS is not set
# CONFIG_AUTOFS4_FS is not set
# CONFIG_REISERFS_FS is not set
# CONFIG_REISERFS_CHECK is not set
# CONFIG_REISERFS_PROC_INFO is not set
# CONFIG_ADFS_FS is not set
# CONFIG_ADFS_FS_RW is not set
# CONFIG_AFFS_FS is not set
# CONFIG_HFS_FS is not set
# CONFIG_BFS_FS is not set
# CONFIG_CMS_FS is not set
# CONFIG_EXT3_FS is not set
# CONFIG_JBD is not set
# CONFIG_JBD_DEBUG is not set
CONFIG_FAT_FS=y
CONFIG_MSDOS_FS=y
CONFIG_UMSDOS_FS=y
CONFIG_VFAT_FS=y
# CONFIG_EFS_FS is not set
# CONFIG_JFFS_FS is not set
CONFIG_JFFS2_FS=y
CONFIG_JFFS2_FS_DEBUG=0
# CONFIG_CRAMFS is not set
# CONFIG_TMPFS is not set
CONFIG_RAMFS=y
# CONFIG_ISO9660_FS is not set
# CONFIG_JOLIET is not set
# CONFIG_MINIX_FS is not set
# CONFIG_FREEVXFS_FS is not set
# CONFIG_NTFS_FS is not set
# CONFIG_NTFS_DEBUG is not set
# CONFIG_NTFS_RW is not set
# CONFIG_HPFS_FS is not set
CONFIG_PROC_FS=y
# CONFIG_DEVFS_FS is not set
# CONFIG_DEVFS_MOUNT is not set
# CONFIG_DEVFS_DEBUG is not set
CONFIG_DEVPTS_FS=y
# CONFIG_QNX4FS_FS is not set
# CONFIG_QNX4FS_RW is not set
CONFIG_ROMFS_FS=y
CONFIG_EXT2_FS=y
# CONFIG_SYSV_FS is not set
# CONFIG_UDF_FS is not set
# CONFIG_UDF_RW is not set
# CONFIG_UFS_FS is not set
# CONFIG_UFS_FS_WRITE is not set
#
# Network File Systems
#
# CONFIG_CODA_FS is not set
# CONFIG_INTERMEZZO_FS is not set
CONFIG_NFS_FS=y
CONFIG_NFS_V3=y
# CONFIG_ROOT_NFS is not set
# CONFIG_NFSD is not set
# CONFIG_NFSD_V3 is not set
CONFIG_SUNRPC=y
CONFIG_LOCKD=y
CONFIG_LOCKD_V4=y
# CONFIG_SMB_FS is not set
# CONFIG_NCP_FS is not set
# CONFIG_NCPFS_PACKET_SIGNING is not set
# CONFIG_NCPFS_IOCTL_LOCKING is not set
# CONFIG_NCPFS_STRONG is not set
# CONFIG_NCPFS_NFS_NS is not set
# CONFIG_NCPFS_OS2_NS is not set
# CONFIG_NCPFS_SMALLDOS is not set
# CONFIG_NCPFS_NLS is not set
# CONFIG_NCPFS_EXTRAS is not set
#
# Partition Types
#
# CONFIG_PARTITION_ADVANCED is not set
CONFIG_MSDOS_PARTITION=y
# CONFIG_SMB_NLS is not set
CONFIG_NLS=y
#
# Native Language Support
#
CONFIG_NLS_DEFAULT="iso8859-1"
# CONFIG_NLS_CODEPAGE_437 is not set
# CONFIG_NLS_CODEPAGE_737 is not set
# CONFIG_NLS_CODEPAGE_775 is not set
# CONFIG_NLS_CODEPAGE_850 is not set
# CONFIG_NLS_CODEPAGE_852 is not set
# CONFIG_NLS_CODEPAGE_855 is not set
# CONFIG_NLS_CODEPAGE_857 is not set
# CONFIG_NLS_CODEPAGE_860 is not set
# CONFIG_NLS_CODEPAGE_861 is not set
# CONFIG_NLS_CODEPAGE_862 is not set
# CONFIG_NLS_CODEPAGE_863 is not set
# CONFIG_NLS_CODEPAGE_864 is not set
# CONFIG_NLS_CODEPAGE_865 is not set
# CONFIG_NLS_CODEPAGE_866 is not set
# CONFIG_NLS_CODEPAGE_869 is not set
# CONFIG_NLS_CODEPAGE_936 is not set
# CONFIG_NLS_CODEPAGE_950 is not set
# CONFIG_NLS_CODEPAGE_932 is not set
# CONFIG_NLS_CODEPAGE_949 is not set
# CONFIG_NLS_CODEPAGE_874 is not set
# CONFIG_NLS_ISO8859_8 is not set
# CONFIG_NLS_CODEPAGE_1251 is not set
# CONFIG_NLS_ISO8859_1 is not set
# CONFIG_NLS_ISO8859_2 is not set
# CONFIG_NLS_ISO8859_3 is not set
# CONFIG_NLS_ISO8859_4 is not set
# CONFIG_NLS_ISO8859_5 is not set
# CONFIG_NLS_ISO8859_6 is not set
# CONFIG_NLS_ISO8859_7 is not set
# CONFIG_NLS_ISO8859_9 is not set
# CONFIG_NLS_ISO8859_13 is not set
# CONFIG_NLS_ISO8859_14 is not set
# CONFIG_NLS_ISO8859_15 is not set
# CONFIG_NLS_KOI8_R is not set
# CONFIG_NLS_KOI8_U is not set
# CONFIG_NLS_UTF8 is not set
#
# Console drivers
#
CONFIG_PC_KEYMAP=y
# CONFIG_VGA_CONSOLE is not set
#
# Frame-buffer support
#
CONFIG_FB=y
CONFIG_DUMMY_CONSOLE=y
# CONFIG_FB_ACORN is not set
# CONFIG_FB_ANAKIN is not set
# CONFIG_FB_CLPS711X is not set
# CONFIG_FB_CYBER2000 is not set
CONFIG_FB_SA1100=y
# CONFIG_CERF_LCD_38_A is not set
CONFIG_CERF_LCD_57_A=y
# CONFIG_CERF_LCD_72_A is not set
# CONFIG_FB_VIRTUAL is not set
# CONFIG_FBCON_ADVANCED is not set
CONFIG_FBCON_CFB2=y
CONFIG_FBCON_CFB4=y
CONFIG_FBCON_CFB8=y
CONFIG_FBCON_CFB16=y
# CONFIG_FBCON_FONTWIDTH8_ONLY is not set
# CONFIG_FBCON_FONTS is not set
CONFIG_FONT_8x8=y
CONFIG_FONT_8x16=y
#
# Sound
#
# CONFIG_SOUND is not set
#
# USB support
#
# CONFIG_USB is not set
#
# USB Controllers
#
# CONFIG_USB_UHCI is not set
# CONFIG_USB_UHCI_ALT is not set
# CONFIG_USB_OHCI is not set
# CONFIG_USB_OHCI_SA1111 is not set
#
# USB Device Class drivers
#
# CONFIG_USB_AUDIO is not set
# CONFIG_USB_BLUETOOTH is not set
# CONFIG_USB_STORAGE is not set
# CONFIG_USB_STORAGE_DEBUG is not set
# CONFIG_USB_STORAGE_DATAFAB is not set
# CONFIG_USB_STORAGE_FREECOM is not set
# CONFIG_USB_STORAGE_ISD200 is not set
# CONFIG_USB_STORAGE_JUMPSHOT is not set
# CONFIG_USB_STORAGE_DPCM is not set
# CONFIG_USB_STORAGE_HP8200e is not set
# CONFIG_USB_STORAGE_SDDR09 is not set
# CONFIG_USB_ACM is not set
# CONFIG_USB_PRINTER is not set
#
# USB Human Interface Devices (HID)
#
#
# Input core support is needed for USB HID
#
#
# USB Imaging devices
#
# CONFIG_USB_DC2XX is not set
# CONFIG_USB_MDC800 is not set
# CONFIG_USB_SCANNER is not set
# CONFIG_USB_MICROTEK is not set
# CONFIG_USB_HPUSBSCSI is not set
#
# USB Multimedia devices
#
#
# Video4Linux support is needed for USB Multimedia device support
#
# CONFIG_USB_DABUSB is not set
#
# USB Network adaptors
#
# CONFIG_USB_PLUSB is not set
# CONFIG_USB_PEGASUS is not set
# CONFIG_USB_KAWETH is not set
# CONFIG_USB_CATC is not set
# CONFIG_USB_CDCETHER is not set
# CONFIG_USB_USBNET is not set
#
# USB port drivers
#
# CONFIG_USB_USS720 is not set
#
# USB Serial Converter support
#
# CONFIG_USB_SERIAL is not set
# CONFIG_USB_SERIAL_GENERIC is not set
# CONFIG_USB_SERIAL_BELKIN is not set
# CONFIG_USB_SERIAL_WHITEHEAT is not set
# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set
# CONFIG_USB_SERIAL_EMPEG is not set
# CONFIG_USB_SERIAL_FTDI_SIO is not set
# CONFIG_USB_SERIAL_VISOR is not set
# CONFIG_USB_SERIAL_EDGEPORT is not set
# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set
# CONFIG_USB_SERIAL_KEYSPAN is not set
# CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set
# CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set
# CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set
# CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set
# CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set
# CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set
# CONFIG_USB_SERIAL_MCT_U232 is not set
# CONFIG_USB_SERIAL_PL2303 is not set
# CONFIG_USB_SERIAL_CYBERJACK is not set
# CONFIG_USB_SERIAL_OMNINET is not set
#
# Miscellaneous USB drivers
#
# CONFIG_USB_RIO500 is not set
# CONFIG_USB_ID75 is not set
#
# Bluetooth support
#
# CONFIG_BT is not set
#
# Kernel hacking
#
CONFIG_FRAME_POINTER=y
CONFIG_DEBUG_ERRORS=y
CONFIG_DEBUG_USER=y
# CONFIG_DEBUG_INFO is not set
CONFIG_MAGIC_SYSRQ=y
# CONFIG_NO_PGT_CACHE is not set
# CONFIG_DEBUG_LL is not set
# CONFIG_DEBUG_DC21285_PORT is not set
# CONFIG_DEBUG_CLPS711X_UART2 is not set
arch/arm/kernel/setup.c
View file @
1c23361e
...
...
@@ -654,6 +654,17 @@ static struct init_tags {
{
0
,
ATAG_NONE
}
};
static
void
(
*
init_machine
)(
void
)
__initdata
;
static
int
__init
customize_machine
(
void
)
{
/* customizes platform devices, or adds new ones */
if
(
init_machine
)
init_machine
();
return
0
;
}
arch_initcall
(
customize_machine
);
void
__init
setup_arch
(
char
**
cmdline_p
)
{
struct
tag
*
tags
=
(
struct
tag
*
)
&
init_tags
;
...
...
@@ -704,6 +715,7 @@ void __init setup_arch(char **cmdline_p)
* Set up various architecture-specific pointers
*/
init_arch_irq
=
mdesc
->
init_irq
;
init_machine
=
mdesc
->
init_machine
;
#ifdef CONFIG_VT
#if defined(CONFIG_VGA_CONSOLE)
...
...
arch/arm/lib/memcpy.S
View file @
1c23361e
...
...
@@ -16,14 +16,14 @@
#define ENTER \
mov
ip
,
sp
;\
stmfd
sp
!,{
r4
-
r9
,
fp
,
ip
,
lr
,
pc
}
;\
stmfd
sp
!,{
r
0
,
r
4
-
r9
,
fp
,
ip
,
lr
,
pc
}
;\
sub
fp
,
ip
,#
4
#define EXIT \
LOADREGS
(
ea
,
fp
,
{
r4
-
r9
,
fp
,
sp
,
pc
})
LOADREGS
(
ea
,
fp
,
{
r
0
,
r
4
-
r9
,
fp
,
sp
,
pc
})
#define EXITEQ \
LOADREGS
(
eqea
,
fp
,
{
r4
-
r9
,
fp
,
sp
,
pc
})
LOADREGS
(
eqea
,
fp
,
{
r
0
,
r
4
-
r9
,
fp
,
sp
,
pc
})
/*
*
Prototype
:
void
memcpy
(
void
*
to
,
const
void
*
from
,
unsigned
long
n
)
;
...
...
arch/arm/mach-pxa/generic.c
View file @
1c23361e
...
...
@@ -20,13 +20,18 @@
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/device.h>
#include <linux/ioport.h>
#include <linux/pm.h>
#include <asm/hardware.h>
#include <asm/irq.h>
#include <asm/system.h>
#include <asm/pgtable.h>
#include <asm/mach/map.h>
#include <asm/arch/udc.h>
#include "generic.h"
/*
...
...
@@ -138,3 +143,76 @@ void __init pxa_map_io(void)
iotable_init
(
standard_io_desc
,
ARRAY_SIZE
(
standard_io_desc
));
get_clk_frequency_khz
(
1
);
}
static
struct
resource
pxamci_resources
[]
=
{
[
0
]
=
{
.
start
=
0x41100000
,
.
end
=
0x41100fff
,
.
flags
=
IORESOURCE_MEM
,
},
[
1
]
=
{
.
start
=
IRQ_MMC
,
.
end
=
IRQ_MMC
,
.
flags
=
IORESOURCE_IRQ
,
},
};
static
u64
pxamci_dmamask
=
0xffffffffUL
;
static
struct
platform_device
pxamci_device
=
{
.
name
=
"pxamci"
,
.
id
=
0
,
.
dev
=
{
.
dma_mask
=
&
pxamci_dmamask
,
},
.
num_resources
=
ARRAY_SIZE
(
pxamci_resources
),
.
resource
=
pxamci_resources
,
};
static
struct
pxa2xx_udc_mach_info
pxa_udc_info
;
void
__init
pxa_set_udc_info
(
struct
pxa2xx_udc_mach_info
*
info
)
{
memcpy
(
&
pxa_udc_info
,
info
,
sizeof
*
info
);
}
EXPORT_SYMBOL
(
pxa_set_udc_info
);
static
struct
resource
pxa2xx_udc_resources
[]
=
{
[
0
]
=
{
.
start
=
0x40600000
,
.
end
=
0x4060ffff
,
.
flags
=
IORESOURCE_MEM
,
},
[
1
]
=
{
.
start
=
IRQ_USB
,
.
end
=
IRQ_USB
,
.
flags
=
IORESOURCE_IRQ
,
},
};
static
u64
udc_dma_mask
=
~
(
u32
)
0
;
static
struct
platform_device
udc_device
=
{
.
name
=
"pxa2xx_udc"
,
.
id
=
0
,
.
resource
=
pxa2xx_udc_resources
,
.
num_resources
=
ARRAY_SIZE
(
pxa2xx_udc_resources
),
.
dev
=
{
.
platform_data
=
&
pxa_udc_info
,
.
dma_mask
=
&
udc_dma_mask
,
}
};
static
struct
platform_device
*
devices
[]
__initdata
=
{
&
pxamci_device
,
&
udc_device
,
};
static
int
__init
pxa_init
(
void
)
{
return
platform_add_devices
(
devices
,
ARRAY_SIZE
(
devices
));
}
subsys_initcall
(
pxa_init
);
arch/arm/mach-pxa/idp.c
View file @
1c23361e
...
...
@@ -54,14 +54,11 @@ unsigned int idp_control_port_shadow = ((0x7 << 21) | /* LCD power */
#endif
static
int
__init
idp_init
(
void
)
static
void
__init
idp_init
(
void
)
{
printk
(
"idp_init()
\n
"
);
return
0
;
}
__initcall
(
idp_init
);
static
void
__init
idp_init_irq
(
void
)
{
pxa_init_irq
();
...
...
@@ -119,4 +116,5 @@ MACHINE_START(PXA_IDP, "Accelent Xscale IDP")
BOOT_MEM
(
0xa0000000
,
0x40000000
,
0xfc000000
)
MAPIO
(
idp_map_io
)
INITIRQ
(
idp_init_irq
)
INIT_MACHINE
(
idp_init
)
MACHINE_END
arch/arm/mach-pxa/lubbock.c
View file @
1c23361e
...
...
@@ -29,6 +29,7 @@
#include <asm/mach/irq.h>
#include <asm/arch/irq.h>
#include <asm/arch/udc.h>
#include <asm/hardware/sa1111.h>
#include "generic.h"
...
...
@@ -88,6 +89,16 @@ static void __init lubbock_init_irq(void)
set_irq_type
(
IRQ_GPIO
(
0
),
IRQT_FALLING
);
}
static
int
lubbock_udc_is_connected
(
void
)
{
return
(
LUB_MISC_RD
&
(
1
<<
9
))
==
0
;
}
static
struct
pxa2xx_udc_mach_info
udc_info
__initdata
=
{
.
udc_is_connected
=
lubbock_udc_is_connected
,
// no D+ pullup; lubbock can't connect/disconnect in software
};
static
struct
resource
sa1111_resources
[]
=
{
[
0
]
=
{
.
start
=
0x10000000
,
...
...
@@ -112,13 +123,12 @@ static struct platform_device *devices[] __initdata = {
&
sa1111_device
,
};
static
int
__init
lubbock_init
(
void
)
static
void
__init
lubbock_init
(
void
)
{
return
platform_add_devices
(
devices
,
ARRAY_SIZE
(
devices
));
pxa_set_udc_info
(
&
udc_info
);
(
void
)
platform_add_devices
(
devices
,
ARRAY_SIZE
(
devices
));
}
subsys_initcall
(
lubbock_init
);
static
struct
map_desc
lubbock_io_desc
[]
__initdata
=
{
/* virtual physical length type */
{
0xf0000000
,
0x08000000
,
0x00100000
,
MT_DEVICE
},
/* CPLD */
...
...
@@ -157,4 +167,5 @@ MACHINE_START(LUBBOCK, "Intel DBPXA250 Development Platform")
BOOT_MEM
(
0xa0000000
,
0x40000000
,
io_p2v
(
0x40000000
))
MAPIO
(
lubbock_map_io
)
INITIRQ
(
lubbock_init_irq
)
INIT_MACHINE
(
lubbock_init
)
MACHINE_END
arch/arm/mach-sa1100/Kconfig
View file @
1c23361e
...
...
@@ -37,9 +37,9 @@ config SA1100_CERF
bool "CerfBoard"
depends on ARCH_SA1100
help
The Intrinsyc CerfBoard is based on the StrongARM 1110.
The Intrinsyc CerfBoard is based on the StrongARM 1110
(Discontinued)
.
More information is available at:
<http://www.intrinsyc.com/products/
referenceplatforms/cerfboard.html
>.
<http://www.intrinsyc.com/products/
cerfboard/
>.
Say Y if configuring for an Intrinsyc CerfBoard.
Say N otherwise.
...
...
@@ -60,15 +60,6 @@ config SA1100_CERF_FLASH_32MB
endchoice
config SA1100_CERF_CPLD
bool "Cerf w/CPLD support (CerfPDA)"
depends on SA1100_CERF
help
Say Y here to support the Linux CerfPDA development kit from
Intrinsyc. This is a StrongARM-1110-based reference platform for
designing custom PDAs. Product info is at
<http://www.intrinsyc.com/products/referencedesigns/cerfpda.asp>.
config SA1100_H3100
bool "Compaq iPAQ H3100"
depends on ARCH_SA1100
...
...
arch/arm/mach-sa1100/leds-cerf.c
View file @
1c23361e
...
...
@@ -19,24 +19,12 @@
static
unsigned
int
led_state
;
static
unsigned
int
hw_led_state
;
#ifdef CONFIG_SA1100_CERF_CPLD
#define LED_D0 GPIO_GPIO(0)
#define LED_D1 GPIO_GPIO(0)
#define LED_D2 GPIO_GPIO(0)
#define LED_D3 GPIO_GPIO(0)
#define LED_MASK (LED_D0|LED_D1|LED_D2|LED_D3)
#else
#define LED_D0 GPIO_GPIO(0)
#define LED_D1 GPIO_GPIO(1)
#define LED_D2 GPIO_GPIO(2)
#define LED_D3 GPIO_GPIO(3)
#define LED_MASK (LED_D0|LED_D1|LED_D2|LED_D3)
#endif
void
cerf_leds_event
(
led_event_t
evt
)
{
unsigned
long
flags
;
...
...
arch/arm/mm/proc-arm720.S
View file @
1c23361e
...
...
@@ -126,6 +126,21 @@ ENTRY(cpu_arm720_reset)
__INIT
.
type
__arm710_setup
,
#
function
__arm710_setup
:
mov
r0
,
#
0
mcr
p15
,
0
,
r0
,
c7
,
c7
,
0
@
invalidate
caches
mcr
p15
,
0
,
r0
,
c8
,
c7
,
0
@
flush
TLB
(
v4
)
mcr
p15
,
0
,
r4
,
c2
,
c0
@
load
page
table
pointer
mov
r0
,
#
0x1f
@
Domains
0
,
1
=
client
mcr
p15
,
0
,
r0
,
c3
,
c0
@
load
domain
access
register
mrc
p15
,
0
,
r0
,
c1
,
c0
@
get
control
register
bic
r0
,
r0
,
#
0x0e00
@
..
V
.
..
RS
BLDP
WCAM
orr
r0
,
r0
,
#
0x0100
@
....
....
.111
....
(
old
)
orr
r0
,
r0
,
#
0x003d
@
....
..01
..11
1101
(
new
)
mov
pc
,
lr
@
__ret
(
head
-
armv
.
S
)
.
size
__arm710_setup
,
.
-
__arm710_setup
.
type
__arm720_setup
,
#
function
__arm720_setup
:
mov
r0
,
#
0
mcr
p15
,
0
,
r0
,
c7
,
c7
,
0
@
invalidate
caches
...
...
@@ -169,6 +184,11 @@ cpu_arch_name: .asciz "armv4t"
cpu_elf_name
:
.
asciz
"v4"
.
size
cpu_elf_name
,
.
-
cpu_elf_name
.
type
cpu_arm710_name
,
#
object
cpu_arm710_name
:
.
asciz
"ARM710T"
.
size
cpu_arm710_name
,
.
-
cpu_arm710_name
.
type
cpu_arm720_name
,
#
object
cpu_arm720_name
:
.
asciz
"ARM720T"
...
...
@@ -182,6 +202,22 @@ cpu_arm720_name:
.
section
".proc.info"
,
#
alloc
,
#
execinstr
.
type
__arm710_proc_info
,
#
object
__arm710_proc_info
:
.
long
0x41807100
@
cpu_val
.
long
0xffffff00
@
cpu_mask
.
long
0x00000c1e
@
section_mmu_flags
b
__arm710_setup
@
cpu_flush
.
long
cpu_arch_name
@
arch_name
.
long
cpu_elf_name
@
elf_name
.
long
HWCAP_SWP
| HWCAP_HALF |
HWCAP_THUMB
@
elf_hwcap
.
long
cpu_arm710_name
@
name
.
long
arm720_processor_functions
.
long
v4_tlb_fns
.
long
v4wt_user_fns
.
long
v4_cache_fns
.
size
__arm710_proc_info
,
.
-
__arm710_proc_info
.
type
__arm720_proc_info
,
#
object
__arm720_proc_info
:
.
long
0x41807200
@
cpu_val
...
...
drivers/usb/gadget/pxa2xx_udc.c
0 → 100644
View file @
1c23361e
/*
* linux/drivers/usb/gadget/pxa2xx_udc.c
* Intel PXA2xx on-chip full speed USB device controllers
*
* Copyright (C) 2002 Intrinsyc, Inc. (Frank Becker)
* Copyright (C) 2003 Robert Schwebel, Pengutronix
* Copyright (C) 2003 Benedikt Spranger, Pengutronix
* Copyright (C) 2003 David Brownell
* Copyright (C) 2003 Joshua Wise
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
#undef DEBUG
// #define VERBOSE DBG_VERBOSE
#include <linux/config.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/ioport.h>
#include <linux/types.h>
#include <linux/version.h>
#include <linux/errno.h>
#include <linux/delay.h>
#include <linux/sched.h>
#include <linux/slab.h>
#include <linux/init.h>
#include <linux/timer.h>
#include <linux/list.h>
#include <linux/interrupt.h>
#include <linux/proc_fs.h>
#include <linux/mm.h>
#include <linux/device.h>
#include <linux/dma-mapping.h>
#include <asm/byteorder.h>
#include <asm/dma.h>
#include <asm/io.h>
#include <asm/irq.h>
#include <asm/system.h>
#include <asm/unaligned.h>
#include <asm/hardware.h>
#include <linux/usb_ch9.h>
#include <linux/usb_gadget.h>
#include <asm/arch/udc.h>
#include "pxa2xx_udc.h"
/*
* This driver handles the USB Device Controller (UDC) in Intel's PXA 2xx
* series processors. The UDC for the IXP 4xx series is very similar.
*
* Such controller drivers work with a gadget driver. The gadget driver
* returns descriptors, implements configuration and data protocols used
* by the host to interact with this device, and allocates endpoints to
* the different protocol interfaces. The controller driver virtualizes
* usb hardware so that the gadget drivers will be more portable.
*
* This UDC hardware wants to implement a bit too much USB protocol, so
* it constrains the sorts of USB configuration change events that work.
* The errata for these chips are misleading; some "fixed" bugs from
* pxa250 a0/a1 b0/b1/b2 sure act like they're still there.
*/
#define DRIVER_VERSION "7-Nov-2003"
#define DRIVER_DESC "PXA 2xx USB Device Controller driver"
static
const
char
driver_name
[]
=
"pxa2xx_udc"
;
static
const
char
ep0name
[]
=
"ep0"
;
// #define USE_DMA
// #define USE_OUT_DMA
// #define DISABLE_TEST_MODE
#ifdef CONFIG_PROC_FS
#define UDC_PROC_FILE
#endif
#ifdef CONFIG_EMBEDDED
/* few strings, and little code to use them */
#undef DEBUG
#undef UDC_PROC_FILE
#endif
#ifdef USE_DMA
static
int
use_dma
=
1
;
MODULE_PARM
(
use_dma
,
"i"
);
MODULE_PARM_DESC
(
use_dma
,
"true to use dma"
);
static
void
dma_nodesc_handler
(
int
dmach
,
void
*
_ep
,
struct
pt_regs
*
r
);
static
void
kick_dma
(
struct
pxa2xx_ep
*
ep
,
struct
pxa2xx_request
*
req
);
#ifdef USE_OUT_DMA
#define DMASTR " (dma support)"
#else
#define DMASTR " (dma in)"
#endif
#else
/* !USE_DMA */
#define DMASTR " (pio only)"
#undef USE_OUT_DMA
#endif
#ifdef CONFIG_USB_PXA2XX_SMALL
#define SIZE_STR " (small)"
#else
#define SIZE_STR ""
#endif
#ifdef DISABLE_TEST_MODE
/* (mode == 0) == no undocumented chip tweaks
* (mode & 1) == double buffer bulk IN
* (mode & 2) == double buffer bulk OUT
* ... so mode = 3 (or 7, 15, etc) does it for both
*/
static
ushort
fifo_mode
=
0
;
MODULE_PARM
(
fifo_mode
,
"h"
);
MODULE_PARM_DESC
(
fifo_mode
,
"pxa2xx udc fifo mode"
);
#endif
/* ---------------------------------------------------------------------------
* endpoint related parts of the api to the usb controller hardware,
* used by gadget driver; and the inner talker-to-hardware core.
* ---------------------------------------------------------------------------
*/
static
void
pxa2xx_ep_fifo_flush
(
struct
usb_ep
*
ep
);
static
void
nuke
(
struct
pxa2xx_ep
*
,
int
status
);
static
void
pio_irq_enable
(
int
bEndpointAddress
)
{
bEndpointAddress
&=
0xf
;
if
(
bEndpointAddress
<
8
)
UICR0
&=
~
(
1
<<
bEndpointAddress
);
else
{
bEndpointAddress
-=
8
;
UICR1
&=
~
(
1
<<
bEndpointAddress
);
}
}
static
void
pio_irq_disable
(
int
bEndpointAddress
)
{
bEndpointAddress
&=
0xf
;
if
(
bEndpointAddress
<
8
)
UICR0
|=
1
<<
bEndpointAddress
;
else
{
bEndpointAddress
-=
8
;
UICR1
|=
1
<<
bEndpointAddress
;
}
}
/* The UDCCR reg contains mask and interrupt status bits,
* so using '|=' isn't safe as it may ack an interrupt.
*/
#define UDCCR_MASK_BITS (UDCCR_REM | UDCCR_SRM | UDCCR_UDE)
static
inline
void
udc_set_mask_UDCCR
(
int
mask
)
{
UDCCR
=
(
UDCCR
&
UDCCR_MASK_BITS
)
|
(
mask
&
UDCCR_MASK_BITS
);
}
static
inline
void
udc_clear_mask_UDCCR
(
int
mask
)
{
UDCCR
=
(
UDCCR
&
UDCCR_MASK_BITS
)
&
~
(
mask
&
UDCCR_MASK_BITS
);
}
static
inline
void
udc_ack_int_UDCCR
(
int
mask
)
{
/* udccr contains the bits we dont want to change */
__u32
udccr
=
UDCCR
&
UDCCR_MASK_BITS
;
UDCCR
=
udccr
|
(
mask
&
~
UDCCR_MASK_BITS
);
}
/*
* endpoint enable/disable
*
* we need to verify the descriptors used to enable endpoints. since pxa2xx
* endpoint configurations are fixed, and are pretty much always enabled,
* there's not a lot to manage here.
*
* because pxa2xx can't selectively initialize bulk (or interrupt) endpoints,
* (resetting endpoint halt and toggle), SET_INTERFACE is unusable except
* for a single interface (with only the default altsetting) and for gadget
* drivers that don't halt endpoints (not reset by set_interface). that also
* means that if you use ISO, you must violate the USB spec rule that all
* iso endpoints must be in non-default altsettings.
*/
static
int
pxa2xx_ep_enable
(
struct
usb_ep
*
_ep
,
const
struct
usb_endpoint_descriptor
*
desc
)
{
struct
pxa2xx_ep
*
ep
;
struct
pxa2xx_udc
*
dev
;
ep
=
container_of
(
_ep
,
struct
pxa2xx_ep
,
ep
);
if
(
!
_ep
||
!
desc
||
ep
->
desc
||
_ep
->
name
==
ep0name
||
desc
->
bDescriptorType
!=
USB_DT_ENDPOINT
||
ep
->
bEndpointAddress
!=
desc
->
bEndpointAddress
||
ep
->
ep
.
maxpacket
<
desc
->
wMaxPacketSize
)
{
DMSG
(
"%s, bad ep or descriptor
\n
"
,
__FUNCTION__
);
return
-
EINVAL
;
}
/* xfer types must match, except that interrupt ~= bulk */
if
(
ep
->
bmAttributes
!=
desc
->
bmAttributes
&&
ep
->
bmAttributes
!=
USB_ENDPOINT_XFER_BULK
&&
desc
->
bmAttributes
!=
USB_ENDPOINT_XFER_INT
)
{
DMSG
(
"%s, %s type mismatch
\n
"
,
__FUNCTION__
,
_ep
->
name
);
return
-
EINVAL
;
}
/* hardware _could_ do smaller, but driver doesn't */
if
((
desc
->
bmAttributes
==
USB_ENDPOINT_XFER_BULK
&&
desc
->
wMaxPacketSize
!=
BULK_FIFO_SIZE
)
||
!
desc
->
wMaxPacketSize
)
{
DMSG
(
"%s, bad %s maxpacket
\n
"
,
__FUNCTION__
,
_ep
->
name
);
return
-
ERANGE
;
}
dev
=
ep
->
dev
;
if
(
!
dev
->
driver
||
dev
->
gadget
.
speed
==
USB_SPEED_UNKNOWN
)
{
DMSG
(
"%s, bogus device state
\n
"
,
__FUNCTION__
);
return
-
ESHUTDOWN
;
}
ep
->
desc
=
desc
;
ep
->
dma
=
-
1
;
ep
->
stopped
=
0
;
ep
->
pio_irqs
=
ep
->
dma_irqs
=
0
;
/* flush fifo (mostly for OUT buffers) */
pxa2xx_ep_fifo_flush
(
_ep
);
/* ... reset halt state too, if we could ... */
#ifdef USE_DMA
/* for (some) bulk and ISO endpoints, try to get a DMA channel and
* bind it to the endpoint. otherwise use PIO.
*/
switch
(
ep
->
bmAttributes
)
{
case
USB_ENDPOINT_XFER_ISOC
:
if
(
desc
->
wMaxPacketSize
%
32
)
break
;
// fall through
case
USB_ENDPOINT_XFER_BULK
:
if
(
!
use_dma
||
!
ep
->
reg_drcmr
)
break
;
ep
->
dma
=
pxa_request_dma
((
char
*
)
_ep
->
name
,
(
desc
->
wMaxPacketSize
>
64
)
?
DMA_PRIO_MEDIUM
/* some iso */
:
DMA_PRIO_LOW
,
dma_nodesc_handler
,
ep
);
if
(
ep
->
dma
>=
0
)
{
*
ep
->
reg_drcmr
=
DRCMR_MAPVLD
|
ep
->
dma
;
DMSG
(
"%s using dma%d
\n
"
,
_ep
->
name
,
ep
->
dma
);
}
}
#endif
DBG
(
DBG_VERBOSE
,
"enabled %s
\n
"
,
_ep
->
name
);
return
0
;
}
static
int
pxa2xx_ep_disable
(
struct
usb_ep
*
_ep
)
{
struct
pxa2xx_ep
*
ep
;
ep
=
container_of
(
_ep
,
struct
pxa2xx_ep
,
ep
);
if
(
!
_ep
||
!
ep
->
desc
)
{
DMSG
(
"%s, %s not enabled
\n
"
,
__FUNCTION__
,
_ep
?
ep
->
ep
.
name
:
NULL
);
return
-
EINVAL
;
}
nuke
(
ep
,
-
ESHUTDOWN
);
#ifdef USE_DMA
if
(
ep
->
dma
>=
0
)
{
*
ep
->
reg_drcmr
=
0
;
pxa_free_dma
(
ep
->
dma
);
ep
->
dma
=
-
1
;
}
#endif
/* flush fifo (mostly for IN buffers) */
pxa2xx_ep_fifo_flush
(
_ep
);
ep
->
desc
=
0
;
ep
->
stopped
=
1
;
DBG
(
DBG_VERBOSE
,
"%s disabled
\n
"
,
_ep
->
name
);
return
0
;
}
/*-------------------------------------------------------------------------*/
/* for the pxa2xx, these can just wrap kmalloc/kfree. gadget drivers
* must still pass correctly initialized endpoints, since other controller
* drivers may care about how it's currently set up (dma issues etc).
*/
/*
* pxa2xx_ep_alloc_request - allocate a request data structure
*/
static
struct
usb_request
*
pxa2xx_ep_alloc_request
(
struct
usb_ep
*
_ep
,
int
gfp_flags
)
{
struct
pxa2xx_request
*
req
;
req
=
kmalloc
(
sizeof
*
req
,
gfp_flags
);
if
(
!
req
)
return
0
;
memset
(
req
,
0
,
sizeof
*
req
);
INIT_LIST_HEAD
(
&
req
->
queue
);
return
&
req
->
req
;
}
/*
* pxa2xx_ep_free_request - deallocate a request data structure
*/
static
void
pxa2xx_ep_free_request
(
struct
usb_ep
*
_ep
,
struct
usb_request
*
_req
)
{
struct
pxa2xx_request
*
req
;
req
=
container_of
(
_req
,
struct
pxa2xx_request
,
req
);
WARN_ON
(
!
list_empty
(
&
req
->
queue
));
kfree
(
req
);
}
/* PXA cache needs flushing with DMA I/O (it's dma-incoherent), but there's
* no device-affinity and the heap works perfectly well for i/o buffers.
* It wastes much less memory than dma_alloc_coherent() would, and even
* prevents cacheline (32 bytes wide) sharing problems.
*/
static
void
*
pxa2xx_ep_alloc_buffer
(
struct
usb_ep
*
_ep
,
unsigned
bytes
,
dma_addr_t
*
dma
,
int
gfp_flags
)
{
char
*
retval
;
retval
=
kmalloc
(
bytes
,
gfp_flags
&
~
(
__GFP_DMA
|
__GFP_HIGHMEM
));
if
(
retval
)
*
dma
=
virt_to_bus
(
retval
);
return
retval
;
}
static
void
pxa2xx_ep_free_buffer
(
struct
usb_ep
*
_ep
,
void
*
buf
,
dma_addr_t
dma
,
unsigned
bytes
)
{
kfree
(
buf
);
}
/*-------------------------------------------------------------------------*/
/*
* done - retire a request; caller blocked irqs
*/
static
void
done
(
struct
pxa2xx_ep
*
ep
,
struct
pxa2xx_request
*
req
,
int
status
)
{
unsigned
stopped
=
ep
->
stopped
;
list_del_init
(
&
req
->
queue
);
if
(
likely
(
req
->
req
.
status
==
-
EINPROGRESS
))
req
->
req
.
status
=
status
;
else
status
=
req
->
req
.
status
;
if
(
status
&&
status
!=
-
ESHUTDOWN
)
DBG
(
DBG_VERBOSE
,
"complete %s req %p stat %d len %u/%u
\n
"
,
ep
->
ep
.
name
,
&
req
->
req
,
status
,
req
->
req
.
actual
,
req
->
req
.
length
);
/* don't modify queue heads during completion callback */
ep
->
stopped
=
1
;
req
->
req
.
complete
(
&
ep
->
ep
,
&
req
->
req
);
ep
->
stopped
=
stopped
;
}
static
inline
void
ep0_idle
(
struct
pxa2xx_udc
*
dev
)
{
dev
->
ep0state
=
EP0_IDLE
;
LED_EP0_OFF
;
}
static
int
write_packet
(
volatile
u32
*
uddr
,
struct
pxa2xx_request
*
req
,
unsigned
max
)
{
u8
*
buf
;
unsigned
length
,
count
;
buf
=
req
->
req
.
buf
+
req
->
req
.
actual
;
prefetch
(
buf
);
/* how big will this packet be? */
length
=
min
(
req
->
req
.
length
-
req
->
req
.
actual
,
max
);
req
->
req
.
actual
+=
length
;
count
=
length
;
while
(
likely
(
count
--
))
*
uddr
=
*
buf
++
;
return
length
;
}
/*
* write to an IN endpoint fifo, as many packets as possible.
* irqs will use this to write the rest later.
* caller guarantees at least one packet buffer is ready (or a zlp).
*/
static
int
write_fifo
(
struct
pxa2xx_ep
*
ep
,
struct
pxa2xx_request
*
req
)
{
unsigned
max
;
max
=
ep
->
desc
->
wMaxPacketSize
;
do
{
unsigned
count
;
int
is_last
,
is_short
;
count
=
write_packet
(
ep
->
reg_uddr
,
req
,
max
);
/* last packet is usually short (or a zlp) */
if
(
unlikely
(
count
!=
max
))
is_last
=
is_short
=
1
;
else
{
if
(
likely
(
req
->
req
.
length
!=
req
->
req
.
actual
)
||
req
->
req
.
zero
)
is_last
=
0
;
else
is_last
=
1
;
/* interrupt/iso maxpacket may not fill the fifo */
is_short
=
unlikely
(
max
<
ep
->
ep
.
maxpacket
);
/* FIXME ep.maxpacket should be the current size,
* modified (for periodic endpoints) when the
* ep is enabled. do that, re-init as needed,
* and change maxpacket refs accordingly.
*/
}
DBG
(
DBG_VERY_NOISY
,
"wrote %s %d bytes%s%s %d left %p
\n
"
,
ep
->
ep
.
name
,
count
,
is_last
?
"/L"
:
""
,
is_short
?
"/S"
:
""
,
req
->
req
.
length
-
req
->
req
.
actual
,
req
);
/* let loose that packet. maybe try writing another one,
* double buffering might work. TSP, TPC, and TFS
* bit values are the same for all normal IN endpoints.
*/
*
ep
->
reg_udccs
=
UDCCS_BI_TPC
;
if
(
is_short
)
*
ep
->
reg_udccs
=
UDCCS_BI_TSP
;
/* requests complete when all IN data is in the FIFO */
if
(
is_last
)
{
done
(
ep
,
req
,
0
);
if
(
list_empty
(
&
ep
->
queue
)
||
unlikely
(
ep
->
dma
>=
0
))
{
pio_irq_disable
(
ep
->
bEndpointAddress
);
#ifdef USE_DMA
/* unaligned data and zlps couldn't use dma */
if
(
unlikely
(
!
list_empty
(
&
ep
->
queue
)))
{
req
=
list_entry
(
ep
->
queue
.
next
,
struct
pxa2xx_request
,
queue
);
kick_dma
(
ep
,
req
);
return
0
;
}
#endif
}
return
1
;
}
// TODO experiment: how robust can fifo mode tweaking be?
// double buffering is off in the default fifo mode, which
// prevents TFS from being set here.
}
while
(
*
ep
->
reg_udccs
&
UDCCS_BI_TFS
);
return
0
;
}
/* caller asserts req->pending (ep0 irq status nyet cleared); starts
* ep0 data stage. these chips want very simple state transitions.
*/
static
inline
void
ep0start
(
struct
pxa2xx_udc
*
dev
,
u32
flags
,
const
char
*
tag
)
{
UDCCS0
=
flags
|
UDCCS0_SA
|
UDCCS0_OPR
;
USIR0
=
USIR0_IR0
;
dev
->
req_pending
=
0
;
DBG
(
DBG_VERY_NOISY
,
"%s %s, %02x/%02x
\n
"
,
__FUNCTION__
,
tag
,
UDCCS0
,
flags
);
}
static
int
write_ep0_fifo
(
struct
pxa2xx_ep
*
ep
,
struct
pxa2xx_request
*
req
)
{
unsigned
count
;
int
is_short
;
count
=
write_packet
(
&
UDDR0
,
req
,
EP0_FIFO_SIZE
);
ep
->
dev
->
stats
.
write
.
bytes
+=
count
;
/* last packet "must be" short (or a zlp) */
is_short
=
(
count
!=
EP0_FIFO_SIZE
);
DBG
(
DBG_VERY_NOISY
,
"ep0in %d bytes %d left %p
\n
"
,
count
,
req
->
req
.
length
-
req
->
req
.
actual
,
req
);
if
(
unlikely
(
is_short
))
{
if
(
ep
->
dev
->
req_pending
)
ep0start
(
ep
->
dev
,
UDCCS0_IPR
,
"short IN"
);
else
UDCCS0
=
UDCCS0_IPR
;
count
=
req
->
req
.
length
;
done
(
ep
,
req
,
0
);
ep0_idle
(
ep
->
dev
);
#if 1
/* This seems to get rid of lost status irqs in some cases:
* host responds quickly, or next request involves config
* change automagic, or should have been hidden, or ...
*
* FIXME get rid of all udelays possible...
*/
if
(
count
>=
EP0_FIFO_SIZE
)
{
count
=
100
;
do
{
if
((
UDCCS0
&
UDCCS0_OPR
)
!=
0
)
{
/* clear OPR, generate ack */
UDCCS0
=
UDCCS0_OPR
;
break
;
}
count
--
;
udelay
(
1
);
}
while
(
count
);
}
#endif
}
else
if
(
ep
->
dev
->
req_pending
)
ep0start
(
ep
->
dev
,
0
,
"IN"
);
return
is_short
;
}
/*
* read_fifo - unload packet(s) from the fifo we use for usb OUT
* transfers and put them into the request. caller should have made
* sure there's at least one packet ready.
*
* returns true if the request completed because of short packet or the
* request buffer having filled (and maybe overran till end-of-packet).
*/
static
int
read_fifo
(
struct
pxa2xx_ep
*
ep
,
struct
pxa2xx_request
*
req
)
{
for
(;;)
{
u32
udccs
;
u8
*
buf
;
unsigned
bufferspace
,
count
,
is_short
;
/* make sure there's a packet in the FIFO.
* UDCCS_{BO,IO}_RPC are all the same bit value.
* UDCCS_{BO,IO}_RNE are all the same bit value.
*/
udccs
=
*
ep
->
reg_udccs
;
if
(
unlikely
((
udccs
&
UDCCS_BO_RPC
)
==
0
))
break
;
buf
=
req
->
req
.
buf
+
req
->
req
.
actual
;
prefetchw
(
buf
);
bufferspace
=
req
->
req
.
length
-
req
->
req
.
actual
;
/* read all bytes from this packet */
if
(
likely
(
udccs
&
UDCCS_BO_RNE
))
{
count
=
1
+
(
0x0ff
&
*
ep
->
reg_ubcr
);
req
->
req
.
actual
+=
min
(
count
,
bufferspace
);
}
else
/* zlp */
count
=
0
;
is_short
=
(
count
<
ep
->
desc
->
wMaxPacketSize
);
DBG
(
DBG_VERY_NOISY
,
"read %s %02x, %d bytes%s req %p %d/%d
\n
"
,
ep
->
ep
.
name
,
udccs
,
count
,
is_short
?
"/S"
:
""
,
req
,
req
->
req
.
actual
,
req
->
req
.
length
);
while
(
likely
(
count
--
!=
0
))
{
u8
byte
=
(
u8
)
*
ep
->
reg_uddr
;
if
(
unlikely
(
bufferspace
==
0
))
{
/* this happens when the driver's buffer
* is smaller than what the host sent.
* discard the extra data.
*/
if
(
req
->
req
.
status
!=
-
EOVERFLOW
)
DMSG
(
"%s overflow %d
\n
"
,
ep
->
ep
.
name
,
count
);
req
->
req
.
status
=
-
EOVERFLOW
;
}
else
{
*
buf
++
=
byte
;
bufferspace
--
;
}
}
*
ep
->
reg_udccs
=
UDCCS_BO_RPC
;
/* RPC/RSP/RNE could now reflect the other packet buffer */
/* iso is one request per packet */
if
(
ep
->
bmAttributes
==
USB_ENDPOINT_XFER_ISOC
)
{
if
(
udccs
&
UDCCS_IO_ROF
)
req
->
req
.
status
=
-
EHOSTUNREACH
;
/* more like "is_done" */
is_short
=
1
;
}
/* completion */
if
(
is_short
||
req
->
req
.
actual
==
req
->
req
.
length
)
{
done
(
ep
,
req
,
0
);
if
(
list_empty
(
&
ep
->
queue
))
pio_irq_disable
(
ep
->
bEndpointAddress
);
return
1
;
}
/* finished that packet. the next one may be waiting... */
}
return
0
;
}
/*
* special ep0 version of the above. no UBCR0 or double buffering; status
* handshaking is magic. most device protocols don't need control-OUT.
* CDC vendor commands (and RNDIS), mass storage CB/CBI, and some other
* protocols do use them.
*/
static
int
read_ep0_fifo
(
struct
pxa2xx_ep
*
ep
,
struct
pxa2xx_request
*
req
)
{
u8
*
buf
,
byte
;
unsigned
bufferspace
;
buf
=
req
->
req
.
buf
+
req
->
req
.
actual
;
bufferspace
=
req
->
req
.
length
-
req
->
req
.
actual
;
while
(
UDCCS0
&
UDCCS0_RNE
)
{
byte
=
(
u8
)
UDDR0
;
if
(
unlikely
(
bufferspace
==
0
))
{
/* this happens when the driver's buffer
* is smaller than what the host sent.
* discard the extra data.
*/
if
(
req
->
req
.
status
!=
-
EOVERFLOW
)
DMSG
(
"%s overflow
\n
"
,
ep
->
ep
.
name
);
req
->
req
.
status
=
-
EOVERFLOW
;
}
else
{
*
buf
++
=
byte
;
req
->
req
.
actual
++
;
bufferspace
--
;
}
}
UDCCS0
=
UDCCS0_OPR
|
UDCCS0_IPR
;
/* completion */
if
(
req
->
req
.
actual
>=
req
->
req
.
length
)
return
1
;
/* finished that packet. the next one may be waiting... */
return
0
;
}
#ifdef USE_DMA
#define MAX_IN_DMA ((DCMD_LENGTH + 1) - BULK_FIFO_SIZE)
static
void
start_dma_nodesc
(
struct
pxa2xx_ep
*
ep
,
struct
pxa2xx_request
*
req
,
int
is_in
)
{
u32
dcmd
=
req
->
req
.
length
;
u32
buf
=
req
->
req
.
dma
;
u32
fifo
=
io_v2p
((
u32
)
ep
->
reg_uddr
);
/* caller guarantees there's a packet or more remaining
* - IN may end with a short packet (TSP set separately),
* - OUT is always full length
*/
buf
+=
req
->
req
.
actual
;
dcmd
-=
req
->
req
.
actual
;
ep
->
dma_fixup
=
0
;
/* no-descriptor mode can be simple for bulk-in, iso-in, iso-out */
DCSR
(
ep
->
dma
)
=
DCSR_NODESC
;
if
(
is_in
)
{
DSADR
(
ep
->
dma
)
=
buf
;
DTADR
(
ep
->
dma
)
=
fifo
;
if
(
dcmd
>
MAX_IN_DMA
)
dcmd
=
MAX_IN_DMA
;
else
ep
->
dma_fixup
=
(
dcmd
%
ep
->
ep
.
maxpacket
)
!=
0
;
dcmd
|=
DCMD_BURST32
|
DCMD_WIDTH1
|
DCMD_FLOWTRG
|
DCMD_INCSRCADDR
;
}
else
{
#ifdef USE_OUT_DMA
DSADR
(
ep
->
dma
)
=
fifo
;
DTADR
(
ep
->
dma
)
=
buf
;
if
(
ep
->
bmAttributes
!=
USB_ENDPOINT_XFER_ISOC
)
dcmd
=
ep
->
ep
.
maxpacket
;
dcmd
|=
DCMD_BURST32
|
DCMD_WIDTH1
|
DCMD_FLOWSRC
|
DCMD_INCTRGADDR
;
#endif
}
DCMD
(
ep
->
dma
)
=
dcmd
;
DCSR
(
ep
->
dma
)
=
DCSR_RUN
|
DCSR_NODESC
|
(
unlikely
(
is_in
)
?
DCSR_STOPIRQEN
/* use dma_nodesc_handler() */
:
0
);
/* use handle_ep() */
}
static
void
kick_dma
(
struct
pxa2xx_ep
*
ep
,
struct
pxa2xx_request
*
req
)
{
int
is_in
=
ep
->
bEndpointAddress
&
USB_DIR_IN
;
if
(
is_in
)
{
/* unaligned tx buffers and zlps only work with PIO */
if
((
req
->
req
.
dma
&
0x0f
)
!=
0
||
unlikely
((
req
->
req
.
length
-
req
->
req
.
actual
)
==
0
))
{
pio_irq_enable
(
ep
->
bEndpointAddress
);
if
((
*
ep
->
reg_udccs
&
UDCCS_BI_TFS
)
!=
0
)
(
void
)
write_fifo
(
ep
,
req
);
}
else
{
start_dma_nodesc
(
ep
,
req
,
USB_DIR_IN
);
}
}
else
{
if
((
req
->
req
.
length
-
req
->
req
.
actual
)
<
ep
->
ep
.
maxpacket
)
{
DMSG
(
"%s short dma read...
\n
"
,
ep
->
ep
.
name
);
/* we're always set up for pio out */
read_fifo
(
ep
,
req
);
}
else
{
*
ep
->
reg_udccs
=
UDCCS_BO_DME
|
(
*
ep
->
reg_udccs
&
UDCCS_BO_FST
);
start_dma_nodesc
(
ep
,
req
,
USB_DIR_OUT
);
}
}
}
static
void
cancel_dma
(
struct
pxa2xx_ep
*
ep
)
{
struct
pxa2xx_request
*
req
;
u32
tmp
;
if
(
DCSR
(
ep
->
dma
)
==
0
||
list_empty
(
&
ep
->
queue
))
return
;
DCSR
(
ep
->
dma
)
=
0
;
while
((
DCSR
(
ep
->
dma
)
&
DCSR_STOPSTATE
)
==
0
)
cpu_relax
();
req
=
list_entry
(
ep
->
queue
.
next
,
struct
pxa2xx_request
,
queue
);
tmp
=
DCMD
(
ep
->
dma
)
&
DCMD_LENGTH
;
req
->
req
.
actual
=
req
->
req
.
length
-
(
tmp
&
DCMD_LENGTH
);
/* the last tx packet may be incomplete, so flush the fifo.
* FIXME correct req.actual if we can
*/
if
(
ep
->
bEndpointAddress
&
USB_DIR_IN
)
*
ep
->
reg_udccs
=
UDCCS_BI_FTF
;
}
/* dma channel stopped ... normal tx end (IN), or on error (IN/OUT) */
static
void
dma_nodesc_handler
(
int
dmach
,
void
*
_ep
,
struct
pt_regs
*
r
)
{
struct
pxa2xx_ep
*
ep
=
_ep
;
struct
pxa2xx_request
*
req
;
u32
tmp
,
completed
;
local_irq_disable
();
req
=
list_entry
(
ep
->
queue
.
next
,
struct
pxa2xx_request
,
queue
);
ep
->
dma_irqs
++
;
ep
->
dev
->
stats
.
irqs
++
;
HEX_DISPLAY
(
ep
->
dev
->
stats
.
irqs
);
/* ack/clear */
tmp
=
DCSR
(
ep
->
dma
);
DCSR
(
ep
->
dma
)
=
tmp
;
if
((
tmp
&
DCSR_STOPSTATE
)
==
0
||
(
DDADR
(
ep
->
dma
)
&
DDADR_STOP
)
!=
0
)
{
DBG
(
DBG_VERBOSE
,
"%s, dcsr %08x ddadr %08x
\n
"
,
ep
->
ep
.
name
,
DCSR
(
ep
->
dma
),
DDADR
(
ep
->
dma
));
goto
done
;
}
DCSR
(
ep
->
dma
)
=
0
;
/* clear DCSR_STOPSTATE */
/* update transfer status */
completed
=
tmp
&
DCSR_BUSERR
;
if
(
ep
->
bEndpointAddress
&
USB_DIR_IN
)
tmp
=
DSADR
(
ep
->
dma
);
else
tmp
=
DTADR
(
ep
->
dma
);
req
->
req
.
actual
=
tmp
-
req
->
req
.
dma
;
/* FIXME seems we sometimes see partial transfers... */
if
(
unlikely
(
completed
!=
0
))
req
->
req
.
status
=
-
EIO
;
else
if
(
req
->
req
.
actual
)
{
/* these registers have zeroes in low bits; they miscount
* some (end-of-transfer) short packets: tx 14 as tx 12
*/
if
(
ep
->
dma_fixup
)
req
->
req
.
actual
=
min
(
req
->
req
.
actual
+
3
,
req
->
req
.
length
);
tmp
=
(
req
->
req
.
length
-
req
->
req
.
actual
);
completed
=
(
tmp
==
0
);
if
(
completed
&&
(
ep
->
bEndpointAddress
&
USB_DIR_IN
))
{
/* maybe validate final short packet ... */
if
((
req
->
req
.
actual
%
ep
->
ep
.
maxpacket
)
!=
0
)
*
ep
->
reg_udccs
=
UDCCS_BI_TSP
/*|UDCCS_BI_TPC*/
;
/* ... or zlp, using pio fallback */
else
if
(
ep
->
bmAttributes
==
USB_ENDPOINT_XFER_BULK
&&
req
->
req
.
zero
)
{
DMSG
(
"%s zlp terminate ...
\n
"
,
ep
->
ep
.
name
);
completed
=
0
;
}
}
}
if
(
likely
(
completed
))
{
done
(
ep
,
req
,
0
);
/* maybe re-activate after completion */
if
(
ep
->
stopped
||
list_empty
(
&
ep
->
queue
))
goto
done
;
req
=
list_entry
(
ep
->
queue
.
next
,
struct
pxa2xx_request
,
queue
);
}
kick_dma
(
ep
,
req
);
done:
local_irq_enable
();
}
#endif
/*-------------------------------------------------------------------------*/
static
int
pxa2xx_ep_queue
(
struct
usb_ep
*
_ep
,
struct
usb_request
*
_req
,
int
gfp_flags
)
{
struct
pxa2xx_request
*
req
;
struct
pxa2xx_ep
*
ep
;
struct
pxa2xx_udc
*
dev
;
unsigned
long
flags
;
req
=
container_of
(
_req
,
struct
pxa2xx_request
,
req
);
if
(
unlikely
(
!
_req
||
!
_req
->
complete
||
!
_req
->
buf
||
!
list_empty
(
&
req
->
queue
)))
{
DMSG
(
"%s, bad params
\n
"
,
__FUNCTION__
);
return
-
EINVAL
;
}
ep
=
container_of
(
_ep
,
struct
pxa2xx_ep
,
ep
);
if
(
unlikely
(
!
_ep
||
(
!
ep
->
desc
&&
ep
->
ep
.
name
!=
ep0name
)))
{
DMSG
(
"%s, bad ep
\n
"
,
__FUNCTION__
);
return
-
EINVAL
;
}
dev
=
ep
->
dev
;
if
(
unlikely
(
!
dev
->
driver
||
dev
->
gadget
.
speed
==
USB_SPEED_UNKNOWN
))
{
DMSG
(
"%s, bogus device state
\n
"
,
__FUNCTION__
);
return
-
ESHUTDOWN
;
}
/* iso is always one packet per request, that's the only way
* we can report per-packet status. that also helps with dma.
*/
if
(
unlikely
(
ep
->
bmAttributes
==
USB_ENDPOINT_XFER_ISOC
&&
req
->
req
.
length
>
ep
->
desc
->
wMaxPacketSize
))
return
-
EMSGSIZE
;
#ifdef USE_DMA
// FIXME caller may already have done the dma mapping
if
(
ep
->
dma
>=
0
)
{
_req
->
dma
=
dma_map_single
(
&
dev
->
dev
.
dev
,
_req
->
buf
,
_req
->
length
,
((
ep
->
bEndpointAddress
&
USB_DIR_IN
)
!=
0
)
?
DMA_TO_DEVICE
:
DMA_FROM_DEVICE
);
}
#endif
DBG
(
DBG_NOISY
,
"%s queue req %p, len %d buf %p
\n
"
,
_ep
->
name
,
_req
,
_req
->
length
,
_req
->
buf
);
local_irq_save
(
flags
);
_req
->
status
=
-
EINPROGRESS
;
_req
->
actual
=
0
;
/* kickstart this i/o queue? */
if
(
list_empty
(
&
ep
->
queue
)
&&
!
ep
->
stopped
)
{
if
(
ep
->
desc
==
0
/* ep0 */
)
{
unsigned
length
=
_req
->
length
;
switch
(
dev
->
ep0state
)
{
case
EP0_IN_DATA_PHASE
:
dev
->
stats
.
write
.
ops
++
;
if
(
write_ep0_fifo
(
ep
,
req
))
req
=
0
;
break
;
case
EP0_OUT_DATA_PHASE
:
dev
->
stats
.
read
.
ops
++
;
/* messy ... */
if
(
dev
->
req_config
)
{
DBG
(
DBG_VERBOSE
,
"ep0 config ack%s
\n
"
,
dev
->
has_cfr
?
""
:
" raced"
);
if
(
dev
->
has_cfr
)
UDCCFR
=
UDCCFR_AREN
|
UDCCFR_ACM
;
done
(
ep
,
req
,
0
);
dev
->
ep0state
=
EP0_END_XFER
;
return
0
;
}
if
(
dev
->
req_pending
)
ep0start
(
dev
,
UDCCS0_IPR
,
"OUT"
);
if
(
length
==
0
||
((
UDCCS0
&
UDCCS0_RNE
)
!=
0
&&
read_ep0_fifo
(
ep
,
req
)))
{
ep0_idle
(
dev
);
done
(
ep
,
req
,
0
);
req
=
0
;
}
break
;
default:
DMSG
(
"ep0 i/o, odd state %d
\n
"
,
dev
->
ep0state
);
local_irq_restore
(
flags
);
return
-
EL2HLT
;
}
#ifdef USE_DMA
/* either start dma or prime pio pump */
}
else
if
(
ep
->
dma
>=
0
)
{
kick_dma
(
ep
,
req
);
#endif
/* can the FIFO can satisfy the request immediately? */
}
else
if
((
ep
->
bEndpointAddress
&
USB_DIR_IN
)
!=
0
&&
(
*
ep
->
reg_udccs
&
UDCCS_BI_TFS
)
!=
0
&&
write_fifo
(
ep
,
req
))
{
req
=
0
;
}
else
if
((
*
ep
->
reg_udccs
&
UDCCS_BO_RFS
)
!=
0
&&
read_fifo
(
ep
,
req
))
{
req
=
0
;
}
if
(
likely
(
req
&&
ep
->
desc
)
&&
ep
->
dma
<
0
)
pio_irq_enable
(
ep
->
bEndpointAddress
);
}
/* pio or dma irq handler advances the queue. */
if
(
likely
(
req
!=
0
))
list_add_tail
(
&
req
->
queue
,
&
ep
->
queue
);
local_irq_restore
(
flags
);
return
0
;
}
/*
* nuke - dequeue ALL requests
*/
static
void
nuke
(
struct
pxa2xx_ep
*
ep
,
int
status
)
{
struct
pxa2xx_request
*
req
;
/* called with irqs blocked */
#ifdef USE_DMA
if
(
ep
->
dma
>=
0
&&
!
ep
->
stopped
)
cancel_dma
(
ep
);
#endif
while
(
!
list_empty
(
&
ep
->
queue
))
{
req
=
list_entry
(
ep
->
queue
.
next
,
struct
pxa2xx_request
,
queue
);
done
(
ep
,
req
,
status
);
}
if
(
ep
->
desc
)
pio_irq_disable
(
ep
->
bEndpointAddress
);
}
/* dequeue JUST ONE request */
static
int
pxa2xx_ep_dequeue
(
struct
usb_ep
*
_ep
,
struct
usb_request
*
_req
)
{
struct
pxa2xx_ep
*
ep
;
struct
pxa2xx_request
*
req
;
unsigned
long
flags
;
ep
=
container_of
(
_ep
,
struct
pxa2xx_ep
,
ep
);
req
=
container_of
(
_req
,
struct
pxa2xx_request
,
req
);
if
(
!
_ep
||
!
_req
||
ep
->
ep
.
name
==
ep0name
)
return
-
EINVAL
;
local_irq_save
(
flags
);
#ifdef USE_DMA
if
(
ep
->
dma
>=
0
&&
ep
->
queue
.
next
==
&
req
->
queue
&&
!
ep
->
stopped
)
{
cancel_dma
(
ep
);
done
(
ep
,
req
,
-
ECONNRESET
);
/* restart i/o */
if
(
!
list_empty
(
&
ep
->
queue
))
{
req
=
list_entry
(
ep
->
queue
.
next
,
struct
pxa2xx_request
,
queue
);
kick_dma
(
ep
,
req
);
}
}
else
#endif
if
(
!
list_empty
(
&
req
->
queue
))
done
(
ep
,
req
,
-
ECONNRESET
);
else
req
=
0
;
local_irq_restore
(
flags
);
return
req
?
0
:
-
EOPNOTSUPP
;
}
/*-------------------------------------------------------------------------*/
static
int
pxa2xx_ep_set_halt
(
struct
usb_ep
*
_ep
,
int
value
)
{
struct
pxa2xx_ep
*
ep
;
unsigned
long
flags
;
ep
=
container_of
(
_ep
,
struct
pxa2xx_ep
,
ep
);
if
(
unlikely
(
!
_ep
||
(
!
ep
->
desc
&&
ep
->
ep
.
name
!=
ep0name
))
||
ep
->
bmAttributes
==
USB_ENDPOINT_XFER_ISOC
)
{
DMSG
(
"%s, bad ep
\n
"
,
__FUNCTION__
);
return
-
EINVAL
;
}
if
(
value
==
0
)
{
/* this path (reset toggle+halt) is needed to implement
* SET_INTERFACE on normal hardware. but it can't be
* done from software on the PXA UDC, and the hardware
* forgets to do it as part of SET_INTERFACE automagic.
*/
DMSG
(
"only host can clear %s halt
\n
"
,
_ep
->
name
);
return
-
EROFS
;
}
local_irq_save
(
flags
);
if
((
ep
->
bEndpointAddress
&
USB_DIR_IN
)
!=
0
&&
((
*
ep
->
reg_udccs
&
UDCCS_BI_TFS
)
==
0
||
!
list_empty
(
&
ep
->
queue
)))
{
local_irq_restore
(
flags
);
return
-
EAGAIN
;
}
/* FST bit is the same for control, bulk in, bulk out, interrupt in */
*
ep
->
reg_udccs
=
UDCCS_BI_FST
|
UDCCS_BI_FTF
;
/* ep0 needs special care */
if
(
!
ep
->
desc
)
{
start_watchdog
(
ep
->
dev
);
ep
->
dev
->
req_pending
=
0
;
ep
->
dev
->
ep0state
=
EP0_STALL
;
LED_EP0_OFF
;
/* and bulk/intr endpoints like dropping stalls too */
}
else
{
unsigned
i
;
for
(
i
=
0
;
i
<
1000
;
i
+=
20
)
{
if
(
*
ep
->
reg_udccs
&
UDCCS_BI_SST
)
break
;
udelay
(
20
);
}
}
local_irq_restore
(
flags
);
DBG
(
DBG_VERBOSE
,
"%s halt
\n
"
,
_ep
->
name
);
return
0
;
}
static
int
pxa2xx_ep_fifo_status
(
struct
usb_ep
*
_ep
)
{
struct
pxa2xx_ep
*
ep
;
ep
=
container_of
(
_ep
,
struct
pxa2xx_ep
,
ep
);
if
(
!
_ep
)
{
DMSG
(
"%s, bad ep
\n
"
,
__FUNCTION__
);
return
-
ENODEV
;
}
/* pxa can't report unclaimed bytes from IN fifos */
if
((
ep
->
bEndpointAddress
&
USB_DIR_IN
)
!=
0
)
return
-
EOPNOTSUPP
;
if
(
ep
->
dev
->
gadget
.
speed
==
USB_SPEED_UNKNOWN
||
(
*
ep
->
reg_udccs
&
UDCCS_BO_RFS
)
==
0
)
return
0
;
else
return
(
*
ep
->
reg_ubcr
&
0xfff
)
+
1
;
}
static
void
pxa2xx_ep_fifo_flush
(
struct
usb_ep
*
_ep
)
{
struct
pxa2xx_ep
*
ep
;
ep
=
container_of
(
_ep
,
struct
pxa2xx_ep
,
ep
);
if
(
!
_ep
||
ep
->
ep
.
name
==
ep0name
||
!
list_empty
(
&
ep
->
queue
))
{
DMSG
(
"%s, bad ep
\n
"
,
__FUNCTION__
);
return
;
}
/* toggle and halt bits stay unchanged */
/* for OUT, just read and discard the FIFO contents. */
if
((
ep
->
bEndpointAddress
&
USB_DIR_IN
)
==
0
)
{
while
(((
*
ep
->
reg_udccs
)
&
UDCCS_BO_RNE
)
!=
0
)
(
void
)
*
ep
->
reg_uddr
;
return
;
}
/* most IN status is the same, but ISO can't stall */
*
ep
->
reg_udccs
=
UDCCS_BI_TPC
|
UDCCS_BI_FTF
|
UDCCS_BI_TUR
|
(
ep
->
bmAttributes
==
USB_ENDPOINT_XFER_ISOC
)
?
0
:
UDCCS_BI_SST
;
}
static
struct
usb_ep_ops
pxa2xx_ep_ops
=
{
.
enable
=
pxa2xx_ep_enable
,
.
disable
=
pxa2xx_ep_disable
,
.
alloc_request
=
pxa2xx_ep_alloc_request
,
.
free_request
=
pxa2xx_ep_free_request
,
.
alloc_buffer
=
pxa2xx_ep_alloc_buffer
,
.
free_buffer
=
pxa2xx_ep_free_buffer
,
.
queue
=
pxa2xx_ep_queue
,
.
dequeue
=
pxa2xx_ep_dequeue
,
.
set_halt
=
pxa2xx_ep_set_halt
,
.
fifo_status
=
pxa2xx_ep_fifo_status
,
.
fifo_flush
=
pxa2xx_ep_fifo_flush
,
};
/* ---------------------------------------------------------------------------
* device-scoped parts of the api to the usb controller hardware
* ---------------------------------------------------------------------------
*/
static
int
pxa2xx_udc_get_frame
(
struct
usb_gadget
*
_gadget
)
{
return
((
UFNRH
&
0x07
)
<<
8
)
|
(
UFNRL
&
0xff
);
}
static
int
pxa2xx_udc_wakeup
(
struct
usb_gadget
*
_gadget
)
{
/* host may not have enabled remote wakeup */
if
((
UDCCS0
&
UDCCS0_DRWF
)
==
0
)
return
-
EHOSTUNREACH
;
udc_set_mask_UDCCR
(
UDCCR_RSM
);
return
0
;
}
static
const
struct
usb_gadget_ops
pxa2xx_udc_ops
=
{
.
get_frame
=
pxa2xx_udc_get_frame
,
.
wakeup
=
pxa2xx_udc_wakeup
,
// current versions must always be self-powered
};
/*-------------------------------------------------------------------------*/
#ifdef UDC_PROC_FILE
static
const
char
proc_node_name
[]
=
"driver/udc"
;
static
int
udc_proc_read
(
char
*
page
,
char
**
start
,
off_t
off
,
int
count
,
int
*
eof
,
void
*
_dev
)
{
char
*
buf
=
page
;
struct
pxa2xx_udc
*
dev
=
_dev
;
char
*
next
=
buf
;
unsigned
size
=
count
;
unsigned
long
flags
;
int
i
,
t
;
u32
tmp
;
if
(
off
!=
0
)
return
0
;
local_irq_save
(
flags
);
/* basic device status */
t
=
snprintf
(
next
,
size
,
DRIVER_DESC
"
\n
"
"%s version: %s
\n
Gadget driver: %s
\n
Host %s
\n\n
"
,
driver_name
,
DRIVER_VERSION
SIZE_STR
DMASTR
,
dev
->
driver
?
dev
->
driver
->
driver
.
name
:
"(none)"
,
is_usb_connected
()
?
"full speed"
:
"disconnected"
);
size
-=
t
;
next
+=
t
;
/* registers for device and ep0 */
t
=
snprintf
(
next
,
size
,
"uicr %02X.%02X, usir %02X.%02x, ufnr %02X.%02X
\n
"
,
UICR1
,
UICR0
,
USIR1
,
USIR0
,
UFNRH
,
UFNRL
);
size
-=
t
;
next
+=
t
;
tmp
=
UDCCR
;
t
=
snprintf
(
next
,
size
,
"udccr %02X =%s%s%s%s%s%s%s%s
\n
"
,
tmp
,
(
tmp
&
UDCCR_REM
)
?
" rem"
:
""
,
(
tmp
&
UDCCR_RSTIR
)
?
" rstir"
:
""
,
(
tmp
&
UDCCR_SRM
)
?
" srm"
:
""
,
(
tmp
&
UDCCR_SUSIR
)
?
" susir"
:
""
,
(
tmp
&
UDCCR_RESIR
)
?
" resir"
:
""
,
(
tmp
&
UDCCR_RSM
)
?
" rsm"
:
""
,
(
tmp
&
UDCCR_UDA
)
?
" uda"
:
""
,
(
tmp
&
UDCCR_UDE
)
?
" ude"
:
""
);
size
-=
t
;
next
+=
t
;
tmp
=
UDCCS0
;
t
=
snprintf
(
next
,
size
,
"udccs0 %02X =%s%s%s%s%s%s%s%s
\n
"
,
tmp
,
(
tmp
&
UDCCS0_SA
)
?
" sa"
:
""
,
(
tmp
&
UDCCS0_RNE
)
?
" rne"
:
""
,
(
tmp
&
UDCCS0_FST
)
?
" fst"
:
""
,
(
tmp
&
UDCCS0_SST
)
?
" sst"
:
""
,
(
tmp
&
UDCCS0_DRWF
)
?
" dwrf"
:
""
,
(
tmp
&
UDCCS0_FTF
)
?
" ftf"
:
""
,
(
tmp
&
UDCCS0_IPR
)
?
" ipr"
:
""
,
(
tmp
&
UDCCS0_OPR
)
?
" opr"
:
""
);
size
-=
t
;
next
+=
t
;
if
(
dev
->
has_cfr
)
{
tmp
=
UDCCFR
;
t
=
snprintf
(
next
,
size
,
"udccfr %02X =%s%s
\n
"
,
tmp
,
(
tmp
&
UDCCFR_AREN
)
?
" aren"
:
""
,
(
tmp
&
UDCCFR_ACM
)
?
" acm"
:
""
);
size
-=
t
;
next
+=
t
;
}
if
(
!
is_usb_connected
()
||
!
dev
->
driver
)
goto
done
;
t
=
snprintf
(
next
,
size
,
"ep0 IN %lu/%lu, OUT %lu/%lu
\n
irqs %lu
\n\n
"
,
dev
->
stats
.
write
.
bytes
,
dev
->
stats
.
write
.
ops
,
dev
->
stats
.
read
.
bytes
,
dev
->
stats
.
read
.
ops
,
dev
->
stats
.
irqs
);
size
-=
t
;
next
+=
t
;
/* dump endpoint queues */
for
(
i
=
0
;
i
<
PXA_UDC_NUM_ENDPOINTS
;
i
++
)
{
struct
pxa2xx_ep
*
ep
=
&
dev
->
ep
[
i
];
struct
pxa2xx_request
*
req
;
int
t
;
if
(
i
!=
0
)
{
const
struct
usb_endpoint_descriptor
*
d
;
d
=
ep
->
desc
;
if
(
!
d
)
continue
;
tmp
=
*
dev
->
ep
[
i
].
reg_udccs
;
t
=
snprintf
(
next
,
size
,
"%s max %d %s udccs %02x irqs %lu/%lu
\n
"
,
ep
->
ep
.
name
,
le16_to_cpu
(
d
->
wMaxPacketSize
),
(
ep
->
dma
>=
0
)
?
"dma"
:
"pio"
,
tmp
,
ep
->
pio_irqs
,
ep
->
dma_irqs
);
/* TODO translate all five groups of udccs bits! */
}
else
/* ep0 should only have one transfer queued */
t
=
snprintf
(
next
,
size
,
"ep0 max 16 pio irqs %lu
\n
"
,
ep
->
pio_irqs
);
if
(
t
<=
0
||
t
>
size
)
goto
done
;
size
-=
t
;
next
+=
t
;
if
(
list_empty
(
&
ep
->
queue
))
{
t
=
snprintf
(
next
,
size
,
"
\t
(nothing queued)
\n
"
);
if
(
t
<=
0
||
t
>
size
)
goto
done
;
size
-=
t
;
next
+=
t
;
continue
;
}
list_for_each_entry
(
req
,
&
ep
->
queue
,
queue
)
{
#ifdef USE_DMA
if
(
ep
->
dma
>=
0
&&
req
->
queue
.
prev
==
&
ep
->
queue
)
t
=
snprintf
(
next
,
size
,
"
\t
req %p len %d/%d "
"buf %p (dma%d dcmd %08x)
\n
"
,
&
req
->
req
,
req
->
req
.
actual
,
req
->
req
.
length
,
req
->
req
.
buf
,
ep
->
dma
,
DCMD
(
ep
->
dma
)
// low 13 bits == bytes-to-go
);
else
#endif
t
=
snprintf
(
next
,
size
,
"
\t
req %p len %d/%d buf %p
\n
"
,
&
req
->
req
,
req
->
req
.
actual
,
req
->
req
.
length
,
req
->
req
.
buf
);
if
(
t
<=
0
||
t
>
size
)
goto
done
;
size
-=
t
;
next
+=
t
;
}
}
done:
local_irq_restore
(
flags
);
*
eof
=
1
;
return
count
-
size
;
}
#define create_proc_files() \
create_proc_read_entry(proc_node_name, 0, NULL, udc_proc_read, dev)
#define remove_proc_files() \
remove_proc_entry(proc_node_name, NULL)
#else
/* !UDC_PROC_FILE */
#define create_proc_files() do {} while (0)
#define remove_proc_files() do {} while (0)
#endif
/* UDC_PROC_FILE */
/* "function" sysfs attribute */
static
ssize_t
show_function
(
struct
device
*
_dev
,
char
*
buf
)
{
struct
pxa2xx_udc
*
dev
=
dev_get_drvdata
(
_dev
);
if
(
!
dev
->
driver
||
!
dev
->
driver
->
function
||
strlen
(
dev
->
driver
->
function
)
>
PAGE_SIZE
)
return
0
;
return
snprintf
(
buf
,
PAGE_SIZE
,
"%s
\n
"
,
dev
->
driver
->
function
);
}
static
DEVICE_ATTR
(
function
,
S_IRUGO
,
show_function
,
NULL
);
/*-------------------------------------------------------------------------*/
/*
* udc_disable - disable USB device controller
*/
static
void
udc_disable
(
struct
pxa2xx_udc
*
dev
)
{
/* block all irqs */
udc_set_mask_UDCCR
(
UDCCR_SRM
|
UDCCR_REM
);
UICR0
=
UICR1
=
0xff
;
UFNRH
=
UFNRH_SIM
;
/* if hardware supports it, disconnect from usb */
make_usb_disappear
();
udc_clear_mask_UDCCR
(
UDCCR_UDE
);
/* Disable clock for USB device */
CKEN
&=
~
CKEN11_USB
;
ep0_idle
(
dev
);
dev
->
gadget
.
speed
=
USB_SPEED_UNKNOWN
;
LED_CONNECTED_OFF
;
}
/*
* udc_reinit - initialize software state
*/
static
void
udc_reinit
(
struct
pxa2xx_udc
*
dev
)
{
u32
i
;
/* device/ep0 records init */
INIT_LIST_HEAD
(
&
dev
->
gadget
.
ep_list
);
INIT_LIST_HEAD
(
&
dev
->
gadget
.
ep0
->
ep_list
);
dev
->
ep0state
=
EP0_IDLE
;
/* basic endpoint records init */
for
(
i
=
0
;
i
<
PXA_UDC_NUM_ENDPOINTS
;
i
++
)
{
struct
pxa2xx_ep
*
ep
=
&
dev
->
ep
[
i
];
if
(
i
!=
0
)
list_add_tail
(
&
ep
->
ep
.
ep_list
,
&
dev
->
gadget
.
ep_list
);
ep
->
desc
=
0
;
ep
->
stopped
=
0
;
INIT_LIST_HEAD
(
&
ep
->
queue
);
ep
->
pio_irqs
=
ep
->
dma_irqs
=
0
;
}
/* the rest was statically initialized, and is read-only */
}
/* until it's enabled, this UDC should be completely invisible
* to any USB host.
*/
static
void
udc_enable
(
struct
pxa2xx_udc
*
dev
)
{
udc_clear_mask_UDCCR
(
UDCCR_UDE
);
/* Enable clock for USB device */
CKEN
|=
CKEN11_USB
;
/* try to clear these bits before we enable the udc */
udc_ack_int_UDCCR
(
UDCCR_SUSIR
|
/*UDCCR_RSTIR|*/
UDCCR_RESIR
);
ep0_idle
(
dev
);
dev
->
gadget
.
speed
=
USB_SPEED_UNKNOWN
;
dev
->
stats
.
irqs
=
0
;
/*
* sequence taken from chapter 12.5.10, PXA250 AppProcDevManual:
* - enable UDC
* - if RESET is already in progress, ack interrupt
* - unmask reset interrupt
*/
udc_set_mask_UDCCR
(
UDCCR_UDE
);
if
(
!
(
UDCCR
&
UDCCR_UDA
))
udc_ack_int_UDCCR
(
UDCCR_RSTIR
);
if
(
dev
->
has_cfr
/* UDC_RES2 is defined */
)
{
/* pxa255 (a0+) can avoid a set_config race that could
* prevent gadget drivers from configuring correctly
*/
UDCCFR
=
UDCCFR_ACM
;
}
else
{
/* "USB test mode" for pxa250 errata 40-42 (stepping a0, a1)
* which could result in missing packets and interrupts.
* supposedly one bit per endpoint, controlling whether it
* double buffers or not; ACM/AREN bits fit into the holes.
* zero bits (like USIR0_IRx) disable double buffering.
*/
UDC_RES1
=
0x00
;
UDC_RES2
=
0x00
;
}
#ifdef DISABLE_TEST_MODE
/* "test mode" seems to have become the default in later chip
* revs, preventing double buffering (and invalidating docs).
* this EXPERIMENT enables it for bulk endpoints by tweaking
* undefined/reserved register bits (that other drivers clear).
* Belcarra code comments noted this usage.
*/
if
(
fifo_mode
&
1
)
{
/* IN endpoints */
UDC_RES1
|=
USIR0_IR1
|
USIR0_IR6
;
UDC_RES2
|=
USIR1_IR11
;
}
if
(
fifo_mode
&
2
)
{
/* OUT endpoints */
UDC_RES1
|=
USIR0_IR2
|
USIR0_IR7
;
UDC_RES2
|=
USIR1_IR12
;
}
#endif
/* caller must be able to sleep in order to cope
* with startup transients.
*/
schedule_timeout
(
HZ
/
10
);
/* enable suspend/resume and reset irqs */
udc_clear_mask_UDCCR
(
UDCCR_SRM
|
UDCCR_REM
);
/* enable ep0 irqs */
UICR0
&=
~
UICR0_IM0
;
/* if hardware supports it, connect to usb and wait for host */
let_usb_appear
();
}
/* when a driver is successfully registered, it will receive
* control requests including set_configuration(), which enables
* non-control requests. then usb traffic follows until a
* disconnect is reported. then a host may connect again, or
* the driver might get unbound.
*/
int
usb_gadget_register_driver
(
struct
usb_gadget_driver
*
driver
)
{
struct
pxa2xx_udc
*
dev
=
the_controller
;
int
retval
;
if
(
!
driver
||
driver
->
speed
!=
USB_SPEED_FULL
||
!
driver
->
bind
||
!
driver
->
unbind
||
!
driver
->
disconnect
||
!
driver
->
setup
)
return
-
EINVAL
;
if
(
!
dev
)
return
-
ENODEV
;
if
(
dev
->
driver
)
return
-
EBUSY
;
/* first hook up the driver ... */
dev
->
driver
=
driver
;
dev
->
gadget
.
dev
.
driver
=
&
driver
->
driver
;
device_add
(
&
dev
->
gadget
.
dev
);
retval
=
driver
->
bind
(
&
dev
->
gadget
);
if
(
retval
)
{
DMSG
(
"bind to driver %s --> error %d
\n
"
,
driver
->
driver
.
name
,
retval
);
device_del
(
&
dev
->
gadget
.
dev
);
dev
->
driver
=
0
;
dev
->
gadget
.
dev
.
driver
=
0
;
return
retval
;
}
device_create_file
(
dev
->
dev
,
&
dev_attr_function
);
/* ... then enable host detection and ep0; and we're ready
* for set_configuration as well as eventual disconnect.
* NOTE: this shouldn't power up until later.
*/
DMSG
(
"registered gadget driver '%s'
\n
"
,
driver
->
driver
.
name
);
udc_enable
(
dev
);
dump_state
(
dev
);
return
0
;
}
EXPORT_SYMBOL
(
usb_gadget_register_driver
);
static
void
stop_activity
(
struct
pxa2xx_udc
*
dev
,
struct
usb_gadget_driver
*
driver
)
{
int
i
;
/* don't disconnect drivers more than once */
if
(
dev
->
gadget
.
speed
==
USB_SPEED_UNKNOWN
)
driver
=
0
;
dev
->
gadget
.
speed
=
USB_SPEED_UNKNOWN
;
/* prevent new request submissions, kill any outstanding requests */
for
(
i
=
0
;
i
<
PXA_UDC_NUM_ENDPOINTS
;
i
++
)
{
struct
pxa2xx_ep
*
ep
=
&
dev
->
ep
[
i
];
ep
->
stopped
=
1
;
nuke
(
ep
,
-
ESHUTDOWN
);
}
del_timer_sync
(
&
dev
->
timer
);
/* report disconnect; the driver is already quiesced */
LED_CONNECTED_OFF
;
if
(
driver
)
driver
->
disconnect
(
&
dev
->
gadget
);
/* re-init driver-visible data structures */
udc_reinit
(
dev
);
}
int
usb_gadget_unregister_driver
(
struct
usb_gadget_driver
*
driver
)
{
struct
pxa2xx_udc
*
dev
=
the_controller
;
if
(
!
dev
)
return
-
ENODEV
;
if
(
!
driver
||
driver
!=
dev
->
driver
)
return
-
EINVAL
;
local_irq_disable
();
udc_disable
(
dev
);
stop_activity
(
dev
,
driver
);
driver
->
unbind
(
&
dev
->
gadget
);
dev
->
driver
=
0
;
local_irq_enable
();
device_del
(
&
dev
->
gadget
.
dev
);
device_remove_file
(
dev
->
dev
,
&
dev_attr_function
);
DMSG
(
"unregistered gadget driver '%s'
\n
"
,
driver
->
driver
.
name
);
dump_state
(
dev
);
return
0
;
}
EXPORT_SYMBOL
(
usb_gadget_unregister_driver
);
/*-------------------------------------------------------------------------*/
#ifdef CONFIG_ARCH_LUBBOCK
/* Lubbock can report connect or disconnect irqs. Likely more hardware
* could support it as a timer callback.
*
* FIXME for better power management, keep the hardware powered down
* until a host is powering the link. means scheduling work later
* in some task that can udc_enable().
*/
#define enable_disconnect_irq() \
if (machine_is_lubbock()) { enable_irq(LUBBOCK_USB_DISC_IRQ); }
#define disable_disconnect_irq() \
if (machine_is_lubbock()) { disable_irq(LUBBOCK_USB_DISC_IRQ); }
static
irqreturn_t
usb_connection_irq
(
int
irq
,
void
*
_dev
,
struct
pt_regs
*
r
)
{
struct
pxa2xx_udc
*
dev
=
_dev
;
dev
->
stats
.
irqs
++
;
HEX_DISPLAY
(
dev
->
stats
.
irqs
);
if
(
!
is_usb_connected
())
{
LED_CONNECTED_OFF
;
disable_disconnect_irq
();
/* report disconnect just once */
if
(
dev
->
gadget
.
speed
!=
USB_SPEED_UNKNOWN
)
{
DMSG
(
"disconnect %s
\n
"
,
dev
->
driver
?
dev
->
driver
->
driver
.
name
:
0
);
stop_activity
(
dev
,
dev
->
driver
);
// udc_disable (dev);
// no more udc irqs
// maybe "ACTION=disconnect /sbin/hotplug gadget".
}
}
else
if
(
dev
->
gadget
.
speed
==
USB_SPEED_UNKNOWN
)
{
LED_CONNECTED_ON
;
DMSG
(
"?? connect irq ??
\n
"
);
// if there's no driver bound, ignore; else
// udc_enable (dev);
// UDC irqs drive the rest.
// maybe "ACTION=connect /sbin/hotplug gadget".
}
return
IRQ_HANDLED
;
}
#endif
#ifndef enable_disconnect_irq
#warning USB disconnect() is not yet reported.
#define enable_disconnect_irq() do {} while (0)
#define disable_disconnect_irq() do {} while (0)
#endif
/*-------------------------------------------------------------------------*/
static
inline
void
clear_ep_state
(
struct
pxa2xx_udc
*
dev
)
{
unsigned
i
;
/* hardware SET_{CONFIGURATION,INTERFACE} automagic resets endpoint
* fifos, and pending transactions mustn't be continued in any case.
*/
for
(
i
=
1
;
i
<
PXA_UDC_NUM_ENDPOINTS
;
i
++
)
nuke
(
&
dev
->
ep
[
i
],
-
ECONNABORTED
);
}
static
void
udc_watchdog
(
unsigned
long
_dev
)
{
struct
pxa2xx_udc
*
dev
=
(
void
*
)
_dev
;
local_irq_disable
();
if
(
dev
->
ep0state
==
EP0_STALL
&&
(
UDCCS0
&
UDCCS0_FST
)
==
0
&&
(
UDCCS0
&
UDCCS0_SST
)
==
0
)
{
UDCCS0
=
UDCCS0_FST
|
UDCCS0_FTF
;
DBG
(
DBG_VERBOSE
,
"ep0 re-stall
\n
"
);
start_watchdog
(
dev
);
}
local_irq_enable
();
}
static
void
handle_ep0
(
struct
pxa2xx_udc
*
dev
)
{
u32
udccs0
=
UDCCS0
;
struct
pxa2xx_ep
*
ep
=
&
dev
->
ep
[
0
];
struct
pxa2xx_request
*
req
;
union
{
struct
usb_ctrlrequest
r
;
u8
raw
[
8
];
u32
word
[
2
];
}
u
;
if
(
list_empty
(
&
ep
->
queue
))
req
=
0
;
else
req
=
list_entry
(
ep
->
queue
.
next
,
struct
pxa2xx_request
,
queue
);
/* clear stall status */
if
(
udccs0
&
UDCCS0_SST
)
{
nuke
(
ep
,
-
EPIPE
);
UDCCS0
=
UDCCS0_SST
;
del_timer
(
&
dev
->
timer
);
ep0_idle
(
dev
);
}
/* previous request unfinished? non-error iff back-to-back ... */
if
((
udccs0
&
UDCCS0_SA
)
!=
0
&&
dev
->
ep0state
!=
EP0_IDLE
)
{
nuke
(
ep
,
0
);
del_timer
(
&
dev
->
timer
);
ep0_idle
(
dev
);
}
switch
(
dev
->
ep0state
)
{
case
EP0_IDLE
:
/* late-breaking status? */
udccs0
=
UDCCS0
;
/* start control request? */
if
(
likely
((
udccs0
&
(
UDCCS0_OPR
|
UDCCS0_SA
|
UDCCS0_RNE
))
==
(
UDCCS0_OPR
|
UDCCS0_SA
|
UDCCS0_RNE
)))
{
int
i
;
nuke
(
ep
,
-
EPROTO
);
/* read SETUP packet */
for
(
i
=
0
;
i
<
8
;
i
++
)
{
if
(
unlikely
(
!
(
UDCCS0
&
UDCCS0_RNE
)))
{
bad_setup:
DMSG
(
"SETUP %d!
\n
"
,
i
);
goto
stall
;
}
u
.
raw
[
i
]
=
(
u8
)
UDDR0
;
}
if
(
unlikely
((
UDCCS0
&
UDCCS0_RNE
)
!=
0
))
goto
bad_setup
;
got_setup:
le16_to_cpus
(
&
u
.
r
.
wValue
);
le16_to_cpus
(
&
u
.
r
.
wIndex
);
le16_to_cpus
(
&
u
.
r
.
wLength
);
LED_EP0_ON
;
DBG
(
DBG_VERBOSE
,
"SETUP %02x.%02x v%04x i%04x l%04x
\n
"
,
u
.
r
.
bRequestType
,
u
.
r
.
bRequest
,
u
.
r
.
wValue
,
u
.
r
.
wIndex
,
u
.
r
.
wLength
);
/* cope with automagic for some standard requests. */
dev
->
req_std
=
(
u
.
r
.
bRequestType
&
USB_TYPE_MASK
)
==
USB_TYPE_STANDARD
;
dev
->
req_config
=
0
;
dev
->
req_pending
=
1
;
switch
(
u
.
r
.
bRequest
)
{
/* hardware restricts gadget drivers here! */
case
USB_REQ_SET_CONFIGURATION
:
if
(
u
.
r
.
bRequestType
==
USB_RECIP_DEVICE
)
{
/* reflect hardware's automagic
* up to the gadget driver.
*/
config_change:
dev
->
req_config
=
1
;
clear_ep_state
(
dev
);
/* if !has_cfr, there's no synch
* else use AREN (later) not SA|OPR
* USIR0_IR0 acts edge sensitive
*/
dev
->
req_pending
=
0
;
}
break
;
/* ... and here, even more ... */
case
USB_REQ_SET_INTERFACE
:
if
(
u
.
r
.
bRequestType
==
USB_RECIP_INTERFACE
)
{
/* udc hardware is broken by design:
* - altsetting may only be zero;
* - hw resets all interfaces' eps;
* - ep reset doesn't include halt(?).
*/
DMSG
(
"broken set_interface (%d/%d)
\n
"
,
u
.
r
.
wIndex
,
u
.
r
.
wValue
);
goto
config_change
;
}
break
;
/* hardware was supposed to hide this */
case
USB_REQ_SET_ADDRESS
:
if
(
u
.
r
.
bRequestType
==
USB_RECIP_DEVICE
)
{
ep0start
(
dev
,
0
,
"address"
);
return
;
}
break
;
}
if
(
u
.
r
.
bRequestType
&
USB_DIR_IN
)
dev
->
ep0state
=
EP0_IN_DATA_PHASE
;
else
dev
->
ep0state
=
EP0_OUT_DATA_PHASE
;
i
=
dev
->
driver
->
setup
(
&
dev
->
gadget
,
&
u
.
r
);
if
(
i
<
0
)
{
/* hardware automagic preventing STALL... */
if
(
dev
->
req_config
)
{
/* hardware sometimes neglects to tell
* tell us about config change events,
* so later ones may fail...
*/
WARN
(
"config change %02x fail %d?
\n
"
,
u
.
r
.
bRequest
,
i
);
return
;
/* TODO experiment: if has_cfr,
* hardware didn't ACK; maybe we
* could actually STALL!
*/
}
DBG
(
DBG_VERBOSE
,
"protocol STALL, "
"%02x err %d
\n
"
,
UDCCS0
,
i
);
stall:
/* the watchdog timer helps deal with cases
* where udc seems to clear FST wrongly, and
* then NAKs instead of STALLing.
*/
ep0start
(
dev
,
UDCCS0_FST
|
UDCCS0_FTF
,
"stall"
);
start_watchdog
(
dev
);
dev
->
ep0state
=
EP0_STALL
;
LED_EP0_OFF
;
/* deferred i/o == no response yet */
}
else
if
(
dev
->
req_pending
)
{
if
(
likely
(
dev
->
ep0state
==
EP0_IN_DATA_PHASE
||
dev
->
req_std
||
u
.
r
.
wLength
))
ep0start
(
dev
,
0
,
"defer"
);
else
ep0start
(
dev
,
UDCCS0_IPR
,
"defer/IPR"
);
}
/* expect at least one data or status stage irq */
return
;
}
else
if
(
likely
((
udccs0
&
(
UDCCS0_OPR
|
UDCCS0_SA
))
==
(
UDCCS0_OPR
|
UDCCS0_SA
)))
{
unsigned
i
;
/* pxa210/250 erratum 131 for B0/B1 says RNE lies.
* still observed on a pxa255 a0.
*/
nuke
(
ep
,
-
EPROTO
);
/* read SETUP data, but don't trust it too much */
for
(
i
=
0
;
i
<
8
;
i
++
)
u
.
raw
[
i
]
=
(
u8
)
UDDR0
;
if
((
u
.
r
.
bRequestType
&
USB_RECIP_MASK
)
>
USB_RECIP_OTHER
)
goto
stall
;
if
(
u
.
word
[
0
]
==
0
&&
u
.
word
[
1
]
==
0
)
goto
stall
;
goto
got_setup
;
}
else
{
/* some random early IRQ:
* - we acked FST
* - IPR cleared
* - OPR got set, without SA (likely status stage)
*/
UDCCS0
=
udccs0
&
(
UDCCS0_SA
|
UDCCS0_OPR
);
}
break
;
case
EP0_IN_DATA_PHASE
:
/* GET_DESCRIPTOR etc */
if
(
udccs0
&
UDCCS0_OPR
)
{
UDCCS0
=
UDCCS0_OPR
|
UDCCS0_FTF
;
DBG
(
DBG_VERBOSE
,
"ep0in premature status
\n
"
);
if
(
req
)
done
(
ep
,
req
,
0
);
ep0_idle
(
dev
);
}
else
/* irq was IPR clearing */
{
if
(
req
)
{
/* this IN packet might finish the request */
(
void
)
write_ep0_fifo
(
ep
,
req
);
}
/* else IN token before response was written */
}
break
;
case
EP0_OUT_DATA_PHASE
:
/* SET_DESCRIPTOR etc */
if
(
udccs0
&
UDCCS0_OPR
)
{
if
(
req
)
{
/* this OUT packet might finish the request */
if
(
read_ep0_fifo
(
ep
,
req
))
done
(
ep
,
req
,
0
);
/* else more OUT packets expected */
}
/* else OUT token before read was issued */
}
else
/* irq was IPR clearing */
{
DBG
(
DBG_VERBOSE
,
"ep0out premature status
\n
"
);
if
(
req
)
done
(
ep
,
req
,
0
);
ep0_idle
(
dev
);
}
break
;
case
EP0_END_XFER
:
if
(
req
)
done
(
ep
,
req
,
0
);
/* ack control-IN status (maybe in-zlp was skipped)
* also appears after some config change events.
*/
if
(
udccs0
&
UDCCS0_OPR
)
UDCCS0
=
UDCCS0_OPR
;
ep0_idle
(
dev
);
break
;
case
EP0_STALL
:
UDCCS0
=
UDCCS0_FST
;
break
;
}
USIR0
=
USIR0_IR0
;
}
static
void
handle_ep
(
struct
pxa2xx_ep
*
ep
)
{
struct
pxa2xx_request
*
req
;
int
is_in
=
ep
->
bEndpointAddress
&
USB_DIR_IN
;
int
completed
;
u32
udccs
,
tmp
;
do
{
completed
=
0
;
if
(
likely
(
!
list_empty
(
&
ep
->
queue
)))
req
=
list_entry
(
ep
->
queue
.
next
,
struct
pxa2xx_request
,
queue
);
else
req
=
0
;
// TODO check FST handling
udccs
=
*
ep
->
reg_udccs
;
if
(
unlikely
(
is_in
))
{
/* irq from TPC, SST, or (ISO) TUR */
tmp
=
UDCCS_BI_TUR
;
if
(
likely
(
ep
->
bmAttributes
==
USB_ENDPOINT_XFER_BULK
))
tmp
|=
UDCCS_BI_SST
;
tmp
&=
udccs
;
if
(
likely
(
tmp
))
*
ep
->
reg_udccs
=
tmp
;
if
(
req
&&
likely
((
udccs
&
UDCCS_BI_TFS
)
!=
0
))
completed
=
write_fifo
(
ep
,
req
);
}
else
{
/* irq from RPC (or for ISO, ROF) */
if
(
likely
(
ep
->
bmAttributes
==
USB_ENDPOINT_XFER_BULK
))
tmp
=
UDCCS_BO_SST
|
UDCCS_BO_DME
;
else
tmp
=
UDCCS_IO_ROF
|
UDCCS_IO_DME
;
tmp
&=
udccs
;
if
(
likely
(
tmp
))
*
ep
->
reg_udccs
=
tmp
;
/* fifos can hold packets, ready for reading... */
if
(
likely
(
req
))
{
#ifdef USE_OUT_DMA
// TODO didn't yet debug out-dma. this approach assumes
// the worst about short packets and RPC; it might be better.
if
(
likely
(
ep
->
dma
>=
0
))
{
if
(
!
(
udccs
&
UDCCS_BO_RSP
))
{
*
ep
->
reg_udccs
=
UDCCS_BO_RPC
;
ep
->
dma_irqs
++
;
return
;
}
}
#endif
completed
=
read_fifo
(
ep
,
req
);
}
else
pio_irq_disable
(
ep
->
bEndpointAddress
);
}
ep
->
pio_irqs
++
;
}
while
(
completed
);
}
/*
* pxa2xx_udc_irq - interrupt handler
*
* avoid delays in ep0 processing. the control handshaking isn't always
* under software control (pxa250c0 and the pxa255 are better), and delays
* could cause usb protocol errors.
*/
static
irqreturn_t
pxa2xx_udc_irq
(
int
irq
,
void
*
_dev
,
struct
pt_regs
*
r
)
{
struct
pxa2xx_udc
*
dev
=
_dev
;
int
handled
;
dev
->
stats
.
irqs
++
;
HEX_DISPLAY
(
dev
->
stats
.
irqs
);
do
{
u32
udccr
=
UDCCR
;
handled
=
0
;
/* SUSpend Interrupt Request */
if
(
unlikely
(
udccr
&
UDCCR_SUSIR
))
{
udc_ack_int_UDCCR
(
UDCCR_SUSIR
);
handled
=
1
;
DBG
(
DBG_VERBOSE
,
"USB suspend%s
\n
"
,
is_usb_connected
()
?
""
:
"+disconnect"
);
if
(
!
is_usb_connected
())
stop_activity
(
dev
,
dev
->
driver
);
else
if
(
dev
->
gadget
.
speed
!=
USB_SPEED_UNKNOWN
&&
dev
->
driver
&&
dev
->
driver
->
suspend
)
dev
->
driver
->
suspend
(
&
dev
->
gadget
);
ep0_idle
(
dev
);
}
/* RESume Interrupt Request */
if
(
unlikely
(
udccr
&
UDCCR_RESIR
))
{
udc_ack_int_UDCCR
(
UDCCR_RESIR
);
handled
=
1
;
DBG
(
DBG_VERBOSE
,
"USB resume
\n
"
);
if
(
dev
->
gadget
.
speed
!=
USB_SPEED_UNKNOWN
&&
dev
->
driver
&&
dev
->
driver
->
resume
&&
is_usb_connected
())
dev
->
driver
->
resume
(
&
dev
->
gadget
);
}
/* ReSeT Interrupt Request - USB reset */
if
(
unlikely
(
udccr
&
UDCCR_RSTIR
))
{
udc_ack_int_UDCCR
(
UDCCR_RSTIR
);
handled
=
1
;
if
((
UDCCR
&
UDCCR_UDA
)
==
0
)
{
DBG
(
DBG_VERBOSE
,
"USB reset start
\n
"
);
if
(
dev
->
gadget
.
speed
!=
USB_SPEED_UNKNOWN
)
disable_disconnect_irq
();
/* reset driver and endpoints,
* in case that's not yet done
*/
stop_activity
(
dev
,
dev
->
driver
);
}
else
{
dev_info
(
&
dev
->
gadget
.
dev
,
"USB reset
\n
"
);
dev
->
gadget
.
speed
=
USB_SPEED_FULL
;
LED_CONNECTED_ON
;
memset
(
&
dev
->
stats
,
0
,
sizeof
dev
->
stats
);
/* driver and endpoints are still reset */
enable_disconnect_irq
();
}
}
else
{
u32
usir0
=
USIR0
&
~
UICR0
;
u32
usir1
=
USIR1
&
~
UICR1
;
int
i
;
if
(
unlikely
(
!
usir0
&&
!
usir1
))
continue
;
DBG
(
DBG_VERY_NOISY
,
"irq %02x.%02x
\n
"
,
usir1
,
usir0
);
/* control traffic */
if
(
usir0
&
USIR0_IR0
)
{
dev
->
ep
[
0
].
pio_irqs
++
;
handle_ep0
(
dev
);
handled
=
1
;
}
/* endpoint data transfers */
for
(
i
=
0
;
i
<
8
;
i
++
)
{
u32
tmp
=
1
<<
i
;
if
(
i
&&
(
usir0
&
tmp
))
{
handle_ep
(
&
dev
->
ep
[
i
]);
USIR0
|=
tmp
;
handled
=
1
;
}
if
(
usir1
&
tmp
)
{
handle_ep
(
&
dev
->
ep
[
i
+
8
]);
USIR1
|=
tmp
;
handled
=
1
;
}
}
}
/* we could also ask for 1 msec SOF (SIR) interrupts */
}
while
(
handled
);
return
IRQ_HANDLED
;
}
/*-------------------------------------------------------------------------*/
static
void
nop_release
(
struct
device
*
dev
)
{
DMSG
(
"%s %s
\n
"
,
__FUNCTION__
,
dev
->
bus_id
);
}
/* this uses load-time allocation and initialization (instead of
* doing it at run-time) to save code, eliminate fault paths, and
* be more obviously correct.
*/
static
struct
pxa2xx_udc
memory
=
{
.
gadget
=
{
.
ops
=
&
pxa2xx_udc_ops
,
.
ep0
=
&
memory
.
ep
[
0
].
ep
,
.
name
=
driver_name
,
.
dev
=
{
.
bus_id
=
"gadget"
,
.
release
=
nop_release
,
},
},
/* control endpoint */
.
ep
[
0
]
=
{
.
ep
=
{
.
name
=
ep0name
,
.
ops
=
&
pxa2xx_ep_ops
,
.
maxpacket
=
EP0_FIFO_SIZE
,
},
.
dev
=
&
memory
,
.
reg_udccs
=
&
UDCCS0
,
.
reg_uddr
=
&
UDDR0
,
},
/* first group of endpoints */
.
ep
[
1
]
=
{
.
ep
=
{
.
name
=
"ep1in-bulk"
,
.
ops
=
&
pxa2xx_ep_ops
,
.
maxpacket
=
BULK_FIFO_SIZE
,
},
.
dev
=
&
memory
,
.
bEndpointAddress
=
USB_DIR_IN
|
1
,
.
bmAttributes
=
USB_ENDPOINT_XFER_BULK
,
.
reg_udccs
=
&
UDCCS1
,
.
reg_uddr
=
&
UDDR1
,
.
reg_drcmr
=
&
DRCMR25
,
},
.
ep
[
2
]
=
{
.
ep
=
{
.
name
=
"ep2out-bulk"
,
.
ops
=
&
pxa2xx_ep_ops
,
.
maxpacket
=
BULK_FIFO_SIZE
,
},
.
dev
=
&
memory
,
.
bEndpointAddress
=
2
,
.
bmAttributes
=
USB_ENDPOINT_XFER_BULK
,
.
reg_udccs
=
&
UDCCS2
,
.
reg_ubcr
=
&
UBCR2
,
.
reg_uddr
=
&
UDDR2
,
.
reg_drcmr
=
&
DRCMR26
,
},
#ifndef CONFIG_USB_PXA2XX_SMALL
.
ep
[
3
]
=
{
.
ep
=
{
.
name
=
"ep3in-iso"
,
.
ops
=
&
pxa2xx_ep_ops
,
.
maxpacket
=
ISO_FIFO_SIZE
,
},
.
dev
=
&
memory
,
.
bEndpointAddress
=
USB_DIR_IN
|
3
,
.
bmAttributes
=
USB_ENDPOINT_XFER_ISOC
,
.
reg_udccs
=
&
UDCCS3
,
.
reg_uddr
=
&
UDDR3
,
.
reg_drcmr
=
&
DRCMR27
,
},
.
ep
[
4
]
=
{
.
ep
=
{
.
name
=
"ep4out-iso"
,
.
ops
=
&
pxa2xx_ep_ops
,
.
maxpacket
=
ISO_FIFO_SIZE
,
},
.
dev
=
&
memory
,
.
bEndpointAddress
=
4
,
.
bmAttributes
=
USB_ENDPOINT_XFER_ISOC
,
.
reg_udccs
=
&
UDCCS4
,
.
reg_ubcr
=
&
UBCR4
,
.
reg_uddr
=
&
UDDR4
,
.
reg_drcmr
=
&
DRCMR28
,
},
.
ep
[
5
]
=
{
.
ep
=
{
.
name
=
"ep5in-int"
,
.
ops
=
&
pxa2xx_ep_ops
,
.
maxpacket
=
INT_FIFO_SIZE
,
},
.
dev
=
&
memory
,
.
bEndpointAddress
=
USB_DIR_IN
|
5
,
.
bmAttributes
=
USB_ENDPOINT_XFER_INT
,
.
reg_udccs
=
&
UDCCS5
,
.
reg_uddr
=
&
UDDR5
,
},
/* second group of endpoints */
.
ep
[
6
]
=
{
.
ep
=
{
.
name
=
"ep6in-bulk"
,
.
ops
=
&
pxa2xx_ep_ops
,
.
maxpacket
=
BULK_FIFO_SIZE
,
},
.
dev
=
&
memory
,
.
bEndpointAddress
=
USB_DIR_IN
|
6
,
.
bmAttributes
=
USB_ENDPOINT_XFER_BULK
,
.
reg_udccs
=
&
UDCCS6
,
.
reg_uddr
=
&
UDDR6
,
.
reg_drcmr
=
&
DRCMR30
,
},
.
ep
[
7
]
=
{
.
ep
=
{
.
name
=
"ep7out-bulk"
,
.
ops
=
&
pxa2xx_ep_ops
,
.
maxpacket
=
BULK_FIFO_SIZE
,
},
.
dev
=
&
memory
,
.
bEndpointAddress
=
7
,
.
bmAttributes
=
USB_ENDPOINT_XFER_BULK
,
.
reg_udccs
=
&
UDCCS7
,
.
reg_ubcr
=
&
UBCR7
,
.
reg_uddr
=
&
UDDR7
,
.
reg_drcmr
=
&
DRCMR31
,
},
.
ep
[
8
]
=
{
.
ep
=
{
.
name
=
"ep8in-iso"
,
.
ops
=
&
pxa2xx_ep_ops
,
.
maxpacket
=
ISO_FIFO_SIZE
,
},
.
dev
=
&
memory
,
.
bEndpointAddress
=
USB_DIR_IN
|
8
,
.
bmAttributes
=
USB_ENDPOINT_XFER_ISOC
,
.
reg_udccs
=
&
UDCCS8
,
.
reg_uddr
=
&
UDDR8
,
.
reg_drcmr
=
&
DRCMR32
,
},
.
ep
[
9
]
=
{
.
ep
=
{
.
name
=
"ep9out-iso"
,
.
ops
=
&
pxa2xx_ep_ops
,
.
maxpacket
=
ISO_FIFO_SIZE
,
},
.
dev
=
&
memory
,
.
bEndpointAddress
=
9
,
.
bmAttributes
=
USB_ENDPOINT_XFER_ISOC
,
.
reg_udccs
=
&
UDCCS9
,
.
reg_ubcr
=
&
UBCR9
,
.
reg_uddr
=
&
UDDR9
,
.
reg_drcmr
=
&
DRCMR33
,
},
.
ep
[
10
]
=
{
.
ep
=
{
.
name
=
"ep10in-int"
,
.
ops
=
&
pxa2xx_ep_ops
,
.
maxpacket
=
INT_FIFO_SIZE
,
},
.
dev
=
&
memory
,
.
bEndpointAddress
=
USB_DIR_IN
|
10
,
.
bmAttributes
=
USB_ENDPOINT_XFER_INT
,
.
reg_udccs
=
&
UDCCS10
,
.
reg_uddr
=
&
UDDR10
,
},
/* third group of endpoints */
.
ep
[
11
]
=
{
.
ep
=
{
.
name
=
"ep11in-bulk"
,
.
ops
=
&
pxa2xx_ep_ops
,
.
maxpacket
=
BULK_FIFO_SIZE
,
},
.
dev
=
&
memory
,
.
bEndpointAddress
=
USB_DIR_IN
|
11
,
.
bmAttributes
=
USB_ENDPOINT_XFER_BULK
,
.
reg_udccs
=
&
UDCCS11
,
.
reg_uddr
=
&
UDDR11
,
.
reg_drcmr
=
&
DRCMR35
,
},
.
ep
[
12
]
=
{
.
ep
=
{
.
name
=
"ep12out-bulk"
,
.
ops
=
&
pxa2xx_ep_ops
,
.
maxpacket
=
BULK_FIFO_SIZE
,
},
.
dev
=
&
memory
,
.
bEndpointAddress
=
12
,
.
bmAttributes
=
USB_ENDPOINT_XFER_BULK
,
.
reg_udccs
=
&
UDCCS12
,
.
reg_ubcr
=
&
UBCR12
,
.
reg_uddr
=
&
UDDR12
,
.
reg_drcmr
=
&
DRCMR36
,
},
.
ep
[
13
]
=
{
.
ep
=
{
.
name
=
"ep13in-iso"
,
.
ops
=
&
pxa2xx_ep_ops
,
.
maxpacket
=
ISO_FIFO_SIZE
,
},
.
dev
=
&
memory
,
.
bEndpointAddress
=
USB_DIR_IN
|
13
,
.
bmAttributes
=
USB_ENDPOINT_XFER_ISOC
,
.
reg_udccs
=
&
UDCCS13
,
.
reg_uddr
=
&
UDDR13
,
.
reg_drcmr
=
&
DRCMR37
,
},
.
ep
[
14
]
=
{
.
ep
=
{
.
name
=
"ep14out-iso"
,
.
ops
=
&
pxa2xx_ep_ops
,
.
maxpacket
=
ISO_FIFO_SIZE
,
},
.
dev
=
&
memory
,
.
bEndpointAddress
=
14
,
.
bmAttributes
=
USB_ENDPOINT_XFER_ISOC
,
.
reg_udccs
=
&
UDCCS14
,
.
reg_ubcr
=
&
UBCR14
,
.
reg_uddr
=
&
UDDR14
,
.
reg_drcmr
=
&
DRCMR38
,
},
.
ep
[
15
]
=
{
.
ep
=
{
.
name
=
"ep15in-int"
,
.
ops
=
&
pxa2xx_ep_ops
,
.
maxpacket
=
INT_FIFO_SIZE
,
},
.
dev
=
&
memory
,
.
bEndpointAddress
=
USB_DIR_IN
|
15
,
.
bmAttributes
=
USB_ENDPOINT_XFER_INT
,
.
reg_udccs
=
&
UDCCS15
,
.
reg_uddr
=
&
UDDR15
,
},
#endif
/* !CONFIG_USB_PXA2XX_SMALL */
};
#define CP15R0_VENDOR_MASK 0xffffe000
#define CP15R0_XSCALE_VALUE 0x69052000
/* intel/arm/xscale */
#define CP15R0_PROD_MASK 0x000003f0
#define PXA25x 0x00000100
/* and PXA26x */
#define PXA210 0x00000120
#define CP15R0_REV_MASK 0x0000000f
#define CP15R0_PRODREV_MASK (CP15R0_PROD_MASK | CP15R0_REV_MASK)
#define PXA255_A0 0x00000106
/* or PXA260_B1 */
#define PXA250_C0 0x00000105
/* or PXA26x_B0 */
#define PXA250_B2 0x00000104
#define PXA250_B1 0x00000103
/* or PXA260_A0 */
#define PXA250_B0 0x00000102
#define PXA250_A1 0x00000101
#define PXA250_A0 0x00000100
#define PXA210_C0 0x00000125
#define PXA210_B2 0x00000124
#define PXA210_B1 0x00000123
#define PXA210_B0 0x00000122
/*
* probe - binds to the platform device
*/
static
int
__init
pxa2xx_udc_probe
(
struct
device
*
_dev
)
{
struct
pxa2xx_udc
*
dev
=
&
memory
;
int
retval
,
out_dma
=
1
;
u32
chiprev
;
/* insist on Intel/ARM/XScale */
asm
(
"mrc%? p15, 0, %0, c0, c0"
:
"=r"
(
chiprev
));
if
((
chiprev
&
CP15R0_VENDOR_MASK
)
!=
CP15R0_XSCALE_VALUE
)
{
printk
(
KERN_ERR
"%s: not XScale!
\n
"
,
driver_name
);
return
-
ENODEV
;
}
/* trigger chiprev-specific logic */
switch
(
chiprev
&
CP15R0_PRODREV_MASK
)
{
case
PXA255_A0
:
dev
->
has_cfr
=
1
;
break
;
case
PXA250_A0
:
case
PXA250_A1
:
/* A0/A1 "not released"; ep 13, 15 unusable */
/* fall through */
case
PXA250_B2
:
case
PXA210_B2
:
case
PXA250_B1
:
case
PXA210_B1
:
case
PXA250_B0
:
case
PXA210_B0
:
out_dma
=
0
;
/* fall through */
case
PXA250_C0
:
case
PXA210_C0
:
break
;
default:
out_dma
=
0
;
printk
(
KERN_ERR
"%s: unrecognized processor: %08x
\n
"
,
driver_name
,
chiprev
);
/* iop3xx, ixp4xx, ... */
return
-
ENODEV
;
}
pr_debug
(
"%s: IRQ %d%s%s%s
\n
"
,
driver_name
,
IRQ_USB
,
dev
->
has_cfr
?
""
:
" (!cfr)"
,
out_dma
?
""
:
" (broken dma-out)"
,
SIZE_STR
DMASTR
);
#ifdef USE_DMA
#ifndef USE_OUT_DMA
out_dma
=
0
;
#endif
/* pxa 250 erratum 130 prevents using OUT dma (fixed C0) */
if
(
!
out_dma
)
{
DMSG
(
"disabled OUT dma
\n
"
);
dev
->
ep
[
2
].
reg_drcmr
=
dev
->
ep
[
4
].
reg_drcmr
=
0
;
dev
->
ep
[
7
].
reg_drcmr
=
dev
->
ep
[
9
].
reg_drcmr
=
0
;
dev
->
ep
[
12
].
reg_drcmr
=
dev
->
ep
[
14
].
reg_drcmr
=
0
;
}
#endif
/* other non-static parts of init */
dev
->
dev
=
_dev
;
dev
->
mach
=
_dev
->
platform_data
;
init_timer
(
&
dev
->
timer
);
dev
->
timer
.
function
=
udc_watchdog
;
dev
->
timer
.
data
=
(
unsigned
long
)
dev
;
device_initialize
(
&
dev
->
gadget
.
dev
);
dev
->
gadget
.
dev
.
parent
=
_dev
;
dev
->
gadget
.
dev
.
dma_mask
=
_dev
->
dma_mask
;
the_controller
=
dev
;
dev_set_drvdata
(
_dev
,
dev
);
udc_disable
(
dev
);
udc_reinit
(
dev
);
/* irq setup after old hardware state is cleaned up */
retval
=
request_irq
(
IRQ_USB
,
pxa2xx_udc_irq
,
SA_INTERRUPT
,
driver_name
,
dev
);
if
(
retval
!=
0
)
{
printk
(
KERN_ERR
"%s: can't get irq %i, err %d
\n
"
,
driver_name
,
IRQ_USB
,
retval
);
return
-
EBUSY
;
}
dev
->
got_irq
=
1
;
if
(
machine_is_lubbock
())
{
disable_irq
(
LUBBOCK_USB_DISC_IRQ
);
retval
=
request_irq
(
LUBBOCK_USB_DISC_IRQ
,
usb_connection_irq
,
SA_INTERRUPT
/* OOPSING | SA_SAMPLE_RANDOM */
,
driver_name
,
dev
);
if
(
retval
!=
0
)
{
enable_irq
(
LUBBOCK_USB_DISC_IRQ
);
printk
(
KERN_ERR
"%s: can't get irq %i, err %d
\n
"
,
driver_name
,
LUBBOCK_USB_DISC_IRQ
,
retval
);
return
-
EBUSY
;
}
dev
->
got_disc
=
1
;
}
create_proc_files
();
return
0
;
}
static
int
__exit
pxa2xx_udc_remove
(
struct
device
*
_dev
)
{
struct
pxa2xx_udc
*
dev
=
_dev
->
driver_data
;
udc_disable
(
dev
);
remove_proc_files
();
usb_gadget_unregister_driver
(
dev
->
driver
);
if
(
dev
->
got_irq
)
{
free_irq
(
IRQ_USB
,
dev
);
dev
->
got_irq
=
0
;
}
if
(
machine_is_lubbock
()
&&
dev
->
got_disc
)
{
free_irq
(
LUBBOCK_USB_DISC_IRQ
,
dev
);
dev
->
got_disc
=
0
;
}
dev_set_drvdata
(
_dev
,
0
);
the_controller
=
0
;
return
0
;
}
/*-------------------------------------------------------------------------*/
static
struct
device_driver
udc_driver
=
{
.
name
=
(
char
*
)
driver_name
,
.
bus
=
&
platform_bus_type
,
.
probe
=
pxa2xx_udc_probe
,
.
remove
=
__exit_p
(
pxa2xx_udc_remove
),
// FIXME power management support
// .suspend = ... disable UDC
// .resume = ... re-enable UDC
};
static
int
__init
udc_init
(
void
)
{
printk
(
KERN_INFO
"%s: version %s
\n
"
,
driver_name
,
DRIVER_VERSION
);
return
driver_register
(
&
udc_driver
);
}
module_init
(
udc_init
);
static
void
__exit
udc_exit
(
void
)
{
driver_unregister
(
&
udc_driver
);
}
module_exit
(
udc_exit
);
MODULE_DESCRIPTION
(
DRIVER_DESC
);
MODULE_AUTHOR
(
"Frank Becker, Robert Schwebel, David Brownell"
);
MODULE_LICENSE
(
"GPL"
);
drivers/usb/gadget/pxa2xx_udc.h
0 → 100644
View file @
1c23361e
/*
* linux/drivers/usb/gadget/pxa2xx_udc.h
* Intel PXA2xx on-chip full speed USB device controller
*
* Copyright (C) 2003 Robert Schwebel <r.schwebel@pengutronix.de>, Pengutronix
* Copyright (C) 2003 David Brownell
*
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef __LINUX_USB_GADGET_PXA2XX_H
#define __LINUX_USB_GADGET_PXA2XX_H
#include <linux/types.h>
/*-------------------------------------------------------------------------*/
/* pxa2xx has this (move to include/asm-arm/arch-pxa/pxa-regs.h) */
#define UFNRH_SIR (1 << 7)
/* SOF interrupt request */
#define UFNRH_SIM (1 << 6)
/* SOF interrupt mask */
#define UFNRH_IPE14 (1 << 5)
/* ISO packet error, ep14 */
#define UFNRH_IPE9 (1 << 4)
/* ISO packet error, ep9 */
#define UFNRH_IPE4 (1 << 3)
/* ISO packet error, ep4 */
/* pxa255 has this (move to include/asm-arm/arch-pxa/pxa-regs.h) */
#define UDCCFR UDC_RES2
/* UDC Control Function Register */
#define UDCCFR_AREN (1 << 7)
/* ACK response enable (now) */
#define UDCCFR_ACM (1 << 2)
/* ACK control mode (wait for AREN) */
/*-------------------------------------------------------------------------*/
struct
pxa2xx_udc
;
struct
pxa2xx_ep
{
struct
usb_ep
ep
;
struct
pxa2xx_udc
*
dev
;
const
struct
usb_endpoint_descriptor
*
desc
;
struct
list_head
queue
;
unsigned
long
pio_irqs
;
unsigned
long
dma_irqs
;
int
dma
;
u8
bEndpointAddress
;
u8
bmAttributes
;
unsigned
stopped
:
1
;
unsigned
dma_fixup
:
1
;
/* UDCCS = UDC Control/Status for this EP
* UBCR = UDC Byte Count Remaining (contents of OUT fifo)
* UDDR = UDC Endpoint Data Register (the fifo)
* DRCM = DMA Request Channel Map
*/
volatile
u32
*
reg_udccs
;
volatile
u32
*
reg_ubcr
;
volatile
u32
*
reg_uddr
;
volatile
u32
*
reg_drcmr
;
};
struct
pxa2xx_request
{
struct
usb_request
req
;
struct
list_head
queue
;
};
enum
ep0_state
{
EP0_IDLE
,
EP0_IN_DATA_PHASE
,
EP0_OUT_DATA_PHASE
,
EP0_END_XFER
,
EP0_STALL
,
};
#define EP0_FIFO_SIZE ((unsigned)16)
#define BULK_FIFO_SIZE ((unsigned)64)
#define ISO_FIFO_SIZE ((unsigned)256)
#define INT_FIFO_SIZE ((unsigned)8)
struct
udc_stats
{
struct
ep0stats
{
unsigned
long
ops
;
unsigned
long
bytes
;
}
read
,
write
;
unsigned
long
irqs
;
};
#ifdef CONFIG_USB_PXA2XX_SMALL
/* when memory's tight, SMALL config saves code+data. */
#undef USE_DMA
#define PXA_UDC_NUM_ENDPOINTS 3
#endif
#ifndef PXA_UDC_NUM_ENDPOINTS
#define PXA_UDC_NUM_ENDPOINTS 16
#endif
struct
pxa2xx_udc
{
struct
usb_gadget
gadget
;
struct
usb_gadget_driver
*
driver
;
enum
ep0_state
ep0state
;
struct
udc_stats
stats
;
unsigned
got_irq
:
1
,
got_disc
:
1
,
has_cfr
:
1
,
req_pending
:
1
,
req_std
:
1
,
req_config
:
1
;
#define start_watchdog(dev) mod_timer(&dev->timer, jiffies + (HZ/200))
struct
timer_list
timer
;
struct
device
*
dev
;
struct
pxa2xx_udc_mach_info
*
mach
;
u64
dma_mask
;
struct
pxa2xx_ep
ep
[
PXA_UDC_NUM_ENDPOINTS
];
};
/*-------------------------------------------------------------------------*/
#ifdef CONFIG_ARCH_LUBBOCK
#include <asm/arch/lubbock.h>
/* lubbock can also report usb connect/disconnect irqs */
#ifdef DEBUG
#define HEX_DISPLAY(n) if (machine_is_lubbock()) { LUB_HEXLED = (n); }
#define LED_CONNECTED_ON if (machine_is_lubbock()) { \
DISCRETE_LED_ON(D26); }
#define LED_CONNECTED_OFF if(machine_is_lubbock()) { \
DISCRETE_LED_OFF(D26); LUB_HEXLED = 0; }
#define LED_EP0_ON if (machine_is_lubbock()) { DISCRETE_LED_ON(D25); }
#define LED_EP0_OFF if (machine_is_lubbock()) { DISCRETE_LED_OFF(D25); }
#endif
/* DEBUG */
#endif
/*-------------------------------------------------------------------------*/
/* LEDs are only for debug */
#ifndef HEX_DISPLAY
#define HEX_DISPLAY(n) do {} while(0)
#endif
#ifndef LED_CONNECTED_ON
#define LED_CONNECTED_ON do {} while(0)
#define LED_CONNECTED_OFF do {} while(0)
#endif
#ifndef LED_EP0_ON
#define LED_EP0_ON do {} while (0)
#define LED_EP0_OFF do {} while (0)
#endif
/*-------------------------------------------------------------------------*/
static
struct
pxa2xx_udc
*
the_controller
;
/* one GPIO should be used to detect host disconnect */
static
inline
int
is_usb_connected
(
void
)
{
if
(
!
the_controller
->
mach
->
udc_is_connected
)
return
1
;
return
the_controller
->
mach
->
udc_is_connected
();
}
/* one GPIO should force the host to see this device (or not) */
static
inline
void
make_usb_disappear
(
void
)
{
if
(
!
the_controller
->
mach
->
udc_command
)
return
;
the_controller
->
mach
->
udc_command
(
PXA2XX_UDC_CMD_CONNECT
);
}
static
inline
void
let_usb_appear
(
void
)
{
if
(
!
the_controller
->
mach
->
udc_command
)
return
;
the_controller
->
mach
->
udc_command
(
PXA2XX_UDC_CMD_DISCONNECT
);
}
/*-------------------------------------------------------------------------*/
/*
* Debugging support vanishes in non-debug builds. DBG_NORMAL should be
* mostly silent during normal use/testing, with no timing side-effects.
*/
#define DBG_NORMAL 1
/* error paths, device state transitions */
#define DBG_VERBOSE 2
/* add some success path trace info */
#define DBG_NOISY 3
/* ... even more: request level */
#define DBG_VERY_NOISY 4
/* ... even more: packet level */
#ifdef DEBUG
static
const
char
*
state_name
[]
=
{
"EP0_IDLE"
,
"EP0_IN_DATA_PHASE"
,
"EP0_OUT_DATA_PHASE"
,
"EP0_END_XFER"
,
"EP0_STALL"
};
#define DMSG(stuff...) printk(KERN_DEBUG "udc: " stuff)
#ifdef VERBOSE
# define UDC_DEBUG DBG_VERBOSE
#else
# define UDC_DEBUG DBG_NORMAL
#endif
static
void
__attribute__
((
__unused__
))
dump_udccr
(
const
char
*
label
)
{
u32
udccr
=
UDCCR
;
DMSG
(
"%s %02X =%s%s%s%s%s%s%s%s
\n
"
,
label
,
udccr
,
(
udccr
&
UDCCR_REM
)
?
" rem"
:
""
,
(
udccr
&
UDCCR_RSTIR
)
?
" rstir"
:
""
,
(
udccr
&
UDCCR_SRM
)
?
" srm"
:
""
,
(
udccr
&
UDCCR_SUSIR
)
?
" susir"
:
""
,
(
udccr
&
UDCCR_RESIR
)
?
" resir"
:
""
,
(
udccr
&
UDCCR_RSM
)
?
" rsm"
:
""
,
(
udccr
&
UDCCR_UDA
)
?
" uda"
:
""
,
(
udccr
&
UDCCR_UDE
)
?
" ude"
:
""
);
}
static
void
__attribute__
((
__unused__
))
dump_udccs0
(
const
char
*
label
)
{
u32
udccs0
=
UDCCS0
;
DMSG
(
"%s %s %02X =%s%s%s%s%s%s%s%s
\n
"
,
label
,
state_name
[
the_controller
->
ep0state
],
udccs0
,
(
udccs0
&
UDCCS0_SA
)
?
" sa"
:
""
,
(
udccs0
&
UDCCS0_RNE
)
?
" rne"
:
""
,
(
udccs0
&
UDCCS0_FST
)
?
" fst"
:
""
,
(
udccs0
&
UDCCS0_SST
)
?
" sst"
:
""
,
(
udccs0
&
UDCCS0_DRWF
)
?
" dwrf"
:
""
,
(
udccs0
&
UDCCS0_FTF
)
?
" ftf"
:
""
,
(
udccs0
&
UDCCS0_IPR
)
?
" ipr"
:
""
,
(
udccs0
&
UDCCS0_OPR
)
?
" opr"
:
""
);
}
static
void
__attribute__
((
__unused__
))
dump_state
(
struct
pxa2xx_udc
*
dev
)
{
u32
tmp
;
unsigned
i
;
DMSG
(
"%s %s, uicr %02X.%02X, usir %02X.%02x, ufnr %02X.%02X
\n
"
,
is_usb_connected
()
?
"host "
:
"disconnected"
,
state_name
[
dev
->
ep0state
],
UICR1
,
UICR0
,
USIR1
,
USIR0
,
UFNRH
,
UFNRL
);
dump_udccr
(
"udccr"
);
if
(
dev
->
has_cfr
)
{
tmp
=
UDCCFR
;
DMSG
(
"udccfr %02X =%s%s
\n
"
,
tmp
,
(
tmp
&
UDCCFR_AREN
)
?
" aren"
:
""
,
(
tmp
&
UDCCFR_ACM
)
?
" acm"
:
""
);
}
if
(
!
dev
->
driver
)
{
DMSG
(
"no gadget driver bound
\n
"
);
return
;
}
else
DMSG
(
"ep0 driver '%s'
\n
"
,
dev
->
driver
->
driver
.
name
);
if
(
!
is_usb_connected
())
return
;
dump_udccs0
(
"udccs0"
);
DMSG
(
"ep0 IN %lu/%lu, OUT %lu/%lu
\n
"
,
dev
->
stats
.
write
.
bytes
,
dev
->
stats
.
write
.
ops
,
dev
->
stats
.
read
.
bytes
,
dev
->
stats
.
read
.
ops
);
for
(
i
=
1
;
i
<
PXA_UDC_NUM_ENDPOINTS
;
i
++
)
{
if
(
dev
->
ep
[
i
].
desc
==
0
)
continue
;
DMSG
(
"udccs%d = %02x
\n
"
,
i
,
*
dev
->
ep
->
reg_udccs
);
}
}
#else
#define DMSG(stuff...) do{}while(0)
#define dump_udccr(x) do{}while(0)
#define dump_udccs0(x) do{}while(0)
#define dump_state(x) do{}while(0)
#define UDC_DEBUG ((unsigned)0)
#endif
#define DBG(lvl, stuff...) do{if ((lvl) <= UDC_DEBUG) DMSG(stuff);}while(0)
#define WARN(stuff...) printk(KERN_WARNING "udc: " stuff)
#endif
/* __LINUX_USB_GADGET_PXA2XX_H */
drivers/video/Kconfig
View file @
1c23361e
...
...
@@ -109,29 +109,6 @@ config FB_SA1100
If you plan to use the LCD display with your SA-1100 system, say
Y here.
choice
prompt "CerfBoard LCD Display Size"
depends on FB_SA1100 && SA1100_CERF
default CERF_LCD_57_A
config CERF_LCD_38_A
bool "3.8_Color"
config CERF_LCD_38_B
bool "3.8_Mono"
config CERF_LCD_57_A
bool "5.7"
config CERF_LCD_72_A
bool "7.2"
endchoice
config SA1100_CERF_LCD_BACKLIGHT
bool "Cerfboard Backlight (CerfPDA)"
depends on FB_SA1100 && SA1100_CERF_CPLD
config FB_CYBER2000
tristate "CyberPro 2000/2010/5000 support"
depends on FB && PCI
...
...
drivers/video/console/font_acorn_8x8.c
View file @
1c23361e
...
...
@@ -10,33 +10,33 @@ static unsigned char acorndata_8x8[] = {
/* 03 */
0x6c
,
0xfe
,
0xfe
,
0xfe
,
0x7c
,
0x38
,
0x10
,
0x00
,
/* ^C */
/* 04 */
0x10
,
0x38
,
0x7c
,
0xfe
,
0x7c
,
0x38
,
0x10
,
0x00
,
/* ^D */
/* 05 */
0x00
,
0x18
,
0x3c
,
0xe7
,
0xe7
,
0x3c
,
0x18
,
0x00
,
/* ^E */
/* 06 */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 07 */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 08 */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 09 */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 0A */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 0B */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 0C */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 0D */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 0E */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 0F */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 06 */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* 07 */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* 08 */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* 09 */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* 0A */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* 0B */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* 0C */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* 0D */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* 0E */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* 0F */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* 10 */
0x00
,
0x60
,
0x78
,
0x7e
,
0x7e
,
0x78
,
0x60
,
0x00
,
/* |> */
/* 11 */
0x00
,
0x06
,
0x1e
,
0x7e
,
0x7e
,
0x1e
,
0x06
,
0x00
,
/* <| */
/* 12 */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 13 */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 14 */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 15 */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 16 */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 17 */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 18 */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 19 */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 1A */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 1B */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 1C */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 1D */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 12 */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* 13 */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* 14 */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* 15 */
0x
3c
,
0x60
,
0x3c
,
0x66
,
0x3c
,
0x06
,
0x3c
,
0x00
,
/* 16 */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* 17 */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* 18 */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* 19 */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* 1A */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* 1B */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* 1C */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* 1D */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* 1E */
0x00
,
0x18
,
0x18
,
0x3c
,
0x3c
,
0x7e
,
0x7e
,
0x00
,
/* /\ */
/* 1F */
0x00
,
0x7e
,
0x7e
,
0x3c
,
0x3c
,
0x18
,
0x18
,
0x00
,
/* \/ */
/* 20 */
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/*
*/
/* 20 */
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/*
*/
/* 21 */
0x18
,
0x3c
,
0x3c
,
0x18
,
0x18
,
0x00
,
0x18
,
0x00
,
/* ! */
/* 22 */
0x6C
,
0x6C
,
0x6C
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* " */
/* 23 */
0x36
,
0x36
,
0x7F
,
0x36
,
0x7F
,
0x36
,
0x36
,
0x00
,
/* # */
...
...
@@ -131,55 +131,55 @@ static unsigned char acorndata_8x8[] = {
/* 7C */
0x18
,
0x18
,
0x18
,
0x18
,
0x18
,
0x18
,
0x18
,
0x00
,
/* | */
/* 7D */
0x30
,
0x18
,
0x18
,
0x0E
,
0x18
,
0x18
,
0x30
,
0x00
,
/* } */
/* 7E */
0x31
,
0x6B
,
0x46
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* ~ */
/* 7F */
0xFF
,
0xFF
,
0xFF
,
0xFF
,
0xFF
,
0xFF
,
0xFF
,
0xFF
,
/* */
/* 80 */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x0
0
,
/* 81 */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 82 */
0x0
0
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 83 */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 84 */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 85 */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 86 */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 87 */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x0
0
,
/* 88 */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 89 */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 8A */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 8B */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 8C */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 8D */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 8E */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 8F */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 90 */
0x0
0
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 91 */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 92 */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 93 */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 94 */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 95 */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 96 */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 97 */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 98 */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 99 */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 9A */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 9B */
0x0
0
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 9C */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 9D */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 9E */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 9F */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* A0 */
0x0
0
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* A1 */
0x0
0
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* A2 */
0x0
0
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* A3 */
0x0
0
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* A4 */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* A5 */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* A6 */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* A7 */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* A8 */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* A9 */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* AA */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* AB */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* AC */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* AD */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* AE */
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* AF */
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 7F */
0xFF
,
0xFF
,
0xFF
,
0xFF
,
0xFF
,
0xFF
,
0xFF
,
0xFF
,
/* */
/* 80 */
0x
3c
,
0x66
,
0x60
,
0x60
,
0x66
,
0x3c
,
0x30
,
0x6
0
,
/* 81 */
0x
66
,
0x00
,
0x66
,
0x66
,
0x66
,
0x66
,
0x3e
,
0x00
,
/* 82 */
0x0
c
,
0x18
,
0x3c
,
0x66
,
0x7e
,
0x60
,
0x3c
,
0x00
,
/* 83 */
0x
18
,
0x66
,
0x3c
,
0x06
,
0x3e
,
0x66
,
0x3e
,
0x00
,
/* 84 */
0x
66
,
0x00
,
0x3c
,
0x06
,
0x3e
,
0x66
,
0x3e
,
0x00
,
/* 85 */
0x
30
,
0x18
,
0x3c
,
0x06
,
0x3e
,
0x66
,
0x3e
,
0x00
,
/* 86 */
0x
3c
,
0x66
,
0x3c
,
0x06
,
0x3e
,
0x66
,
0x3e
,
0x00
,
/* 87 */
0x00
,
0x00
,
0x
3c
,
0x66
,
0x60
,
0x66
,
0x3c
,
0x6
0
,
/* 88 */
0x
3c
,
0x66
,
0x3c
,
0x66
,
0x7e
,
0x60
,
0x3c
,
0x00
,
/* 89 */
0x
66
,
0x00
,
0x3c
,
0x66
,
0x7e
,
0x60
,
0x3c
,
0x00
,
/* 8A */
0x
30
,
0x18
,
0x3c
,
0x66
,
0x7e
,
0x60
,
0x3c
,
0x00
,
/* 8B */
0x
66
,
0x00
,
0x00
,
0x38
,
0x18
,
0x18
,
0x3c
,
0x00
,
/* 8C */
0x
3c
,
0x66
,
0x00
,
0x38
,
0x18
,
0x18
,
0x3c
,
0x00
,
/* 8D */
0x
30
,
0x18
,
0x00
,
0x38
,
0x18
,
0x18
,
0x3c
,
0x00
,
/* 8E */
0x
66
,
0x66
,
0x00
,
0x3c
,
0x66
,
0x7e
,
0x66
,
0x00
,
/* 8F */
0x
18
,
0x66
,
0x00
,
0x3c
,
0x66
,
0x7e
,
0x66
,
0x00
,
/* 90 */
0x0
c
,
0x18
,
0x7e
,
0x60
,
0x7c
,
0x60
,
0x7e
,
0x00
,
/* 91 */
0x00
,
0x00
,
0x
3f
,
0x0d
,
0x3f
,
0x6c
,
0x3f
,
0x00
,
/* 92 */
0x
3f
,
0x66
,
0x66
,
0x7f
,
0x66
,
0x66
,
0x67
,
0x00
,
/* 93 */
0x
3c
,
0x66
,
0x00
,
0x3c
,
0x66
,
0x66
,
0x3c
,
0x00
,
/* 94 */
0x
66
,
0x00
,
0x00
,
0x3c
,
0x66
,
0x66
,
0x3c
,
0x00
,
/* 95 */
0x
30
,
0x18
,
0x00
,
0x3c
,
0x66
,
0x66
,
0x3c
,
0x00
,
/* 96 */
0x
3c
,
0x66
,
0x00
,
0x66
,
0x66
,
0x66
,
0x3e
,
0x00
,
/* 97 */
0x
30
,
0x18
,
0x00
,
0x66
,
0x66
,
0x66
,
0x3e
,
0x00
,
/* 98 */
0x
66
,
0x00
,
0x66
,
0x66
,
0x66
,
0x3e
,
0x06
,
0x3c
,
/* 99 */
0x
66
,
0x00
,
0x3c
,
0x66
,
0x66
,
0x66
,
0x3c
,
0x00
,
/* 9A */
0x
66
,
0x00
,
0x66
,
0x66
,
0x66
,
0x66
,
0x3c
,
0x00
,
/* 9B */
0x0
8
,
0x3e
,
0x6b
,
0x68
,
0x6b
,
0x3e
,
0x08
,
0x00
,
/* 9C */
0x
1c
,
0x36
,
0x30
,
0x7c
,
0x30
,
0x30
,
0x7e
,
0x00
,
/* 9D */
0x
66
,
0x3c
,
0x18
,
0x18
,
0x7e
,
0x18
,
0x18
,
0x00
,
/* 9E */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* 9F */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* A0 */
0x0
c
,
0x18
,
0x3c
,
0x06
,
0x3e
,
0x66
,
0x3e
,
0x00
,
/* A1 */
0x0
c
,
0x18
,
0x00
,
0x38
,
0x18
,
0x18
,
0x3c
,
0x00
,
/* A2 */
0x0
c
,
0x18
,
0x00
,
0x3c
,
0x66
,
0x66
,
0x3c
,
0x00
,
/* A3 */
0x0
c
,
0x18
,
0x00
,
0x66
,
0x66
,
0x66
,
0x3e
,
0x00
,
/* A4 */
0x
36
,
0x6c
,
0x00
,
0x7c
,
0x66
,
0x66
,
0x66
,
0x00
,
/* A5 */
0x
36
,
0x6c
,
0x00
,
0x66
,
0x76
,
0x6e
,
0x66
,
0x00
,
/* A6 */
0x
1c
,
0x06
,
0x1e
,
0x36
,
0x1e
,
0x00
,
0x3e
,
0x00
,
/* A7 */
0x
1c
,
0x36
,
0x36
,
0x36
,
0x1c
,
0x00
,
0x3e
,
0x00
,
/* A8 */
0x
18
,
0x00
,
0x18
,
0x18
,
0x30
,
0x66
,
0x3c
,
0x00
,
/* A9 */
0x
7e
,
0x06
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* AA */
0x
7e
,
0x06
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* AB */
0x
40
,
0xc0
,
0x40
,
0x4f
,
0x41
,
0x0f
,
0x08
,
0x0f
,
/* AC */
0x
40
,
0xc0
,
0x40
,
0x48
,
0x48
,
0x0a
,
0x0f
,
0x02
,
/* AD */
0x
18
,
0x00
,
0x18
,
0x18
,
0x18
,
0x18
,
0x18
,
0x00
,
/* AE */
0x00
,
0x
33
,
0x66
,
0xcc
,
0xcc
,
0x66
,
0x33
,
0x00
,
/* AF */
0x00
,
0x
cc
,
0x66
,
0x33
,
0x33
,
0x66
,
0xcc
,
0x00
,
/* B0 */
0x22
,
0x88
,
0x22
,
0x88
,
0x22
,
0x88
,
0x22
,
0x88
,
/* B1 */
0x55
,
0xaa
,
0x55
,
0xaa
,
0x55
,
0xaa
,
0x55
,
0xaa
,
/* B2 */
0xdd
,
0x77
,
0xdd
,
0x77
,
0xdd
,
0x77
,
0xdd
,
0x77
,
...
...
@@ -228,37 +228,37 @@ static unsigned char acorndata_8x8[] = {
/* DD */
0xf0
,
0xf0
,
0xf0
,
0xf0
,
0xf0
,
0xf0
,
0xf0
,
0xf0
,
/* DE */
0x0f
,
0x0f
,
0x0f
,
0x0f
,
0x0f
,
0x0f
,
0x0f
,
0x0f
,
/* DF */
0xff
,
0xff
,
0xff
,
0xff
,
0x00
,
0x00
,
0x00
,
0x00
,
/* E0 */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* E1 */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x0
0
,
/* E2 */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* E3 */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* E4 */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* E5 */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* E6 */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x0
0
,
/* E7 */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* E8 */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* E9 */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* EA */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* EB */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* EC */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* ED */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* EE */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* EF */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* F0 */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* F1 */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* F2 */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* F3 */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* F4 */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* F5 */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* F6 */
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* F7 */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* F8 */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* F9 */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* FA */
0x00
,
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* FB */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* FC */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* FD */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* FE */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* E0 */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* E1 */
0x
3c
,
0x66
,
0x66
,
0x6c
,
0x66
,
0x66
,
0x6c
,
0xc
0
,
/* E2 */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* E3 */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* E4 */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* E5 */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* E6 */
0x00
,
0x00
,
0x
33
,
0x33
,
0x33
,
0x33
,
0x3e
,
0x6
0
,
/* E7 */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* E8 */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* E9 */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* EA */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* EB */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* EC */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* ED */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* EE */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* EF */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* F0 */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* F1 */
0x
18
,
0x18
,
0x7e
,
0x18
,
0x18
,
0x00
,
0x7e
,
0x00
,
/* F2 */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* F3 */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* F4 */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* F5 */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* F6 */
0x00
,
0x
18
,
0x00
,
0xff
,
0x00
,
0x18
,
0x00
,
0x00
,
/* F7 */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* F8 */
0x
3c
,
0x66
,
0x3c
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* F9 */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* FA */
0x00
,
0x00
,
0x00
,
0x
18
,
0x18
,
0x00
,
0x00
,
0x00
,
/* FB */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* FC */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* FD */
0x
38
,
0x04
,
0x18
,
0x20
,
0x3c
,
0x00
,
0x00
,
0x00
,
/* FE */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* FF */
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
};
...
...
drivers/video/sa1100fb.c
View file @
1c23361e
...
...
@@ -326,54 +326,6 @@ static struct sa1100fb_mach_info brutus_info __initdata = {
};
#endif
#ifdef CONFIG_SA1100_CERF
static
struct
sa1100fb_mach_info
cerf_info
__initdata
=
{
#if defined(CONFIG_CERF_LCD_72_A)
.
pixclock
=
171521
,
.
bpp
=
8
,
.
xres
=
640
,
.
yres
=
480
,
.
lccr0
=
LCCR0_Color
|
LCCR0_Dual
|
LCCR0_Pas
,
.
lccr3
=
LCCR3_OutEnH
|
LCCR3_PixRsEdg
|
LCCR3_ACBsDiv
(
2
)
|
LCCR3_PixClkDiv
(
38
),
#elif defined(CONFIG_CERF_LCD_57_A)
.
pixclock
=
171521
,
.
bpp
=
8
,
.
xres
=
320
,
.
yres
=
240
,
.
lccr0
=
LCCR0_Color
|
LCCR0_Sngl
|
LCCR0_Pas
,
.
lccr3
=
LCCR3_OutEnH
|
LCCR3_PixRsEdg
|
LCCR3_ACBsDiv
(
2
)
|
LCCR3_PixClkDiv
(
38
),
#elif defined(CONFIG_CERF_LCD_38_A)
.
pixclock
=
171521
,
.
bpp
=
8
,
.
xres
=
240
,
.
yres
=
320
,
.
lccr0
=
LCCR0_Color
|
LCCR0_Sngl
|
LCCR0_Pas
,
.
lccr3
=
LCCR3_OutEnH
|
LCCR3_PixRsEdg
|
LCCR3_ACBsDiv
(
56
)
|
LCCR3_PixClkDiv
(
38
),
#elif defined(CONFIG_CERF_LCD_38_B)
.
pixclock
=
171521
,
.
bpp
=
4
,
.
xres
=
320
,
.
yres
=
240
,
.
lccr0
=
LCCR0_Mono
|
LCCR0_4PixMono
|
LCCR0_Sngl
|
LCCR0_Pas
,
.
lccr3
=
LCCR3_OutEnH
|
LCCR3_PixRsEdg
|
LCCR3_ACBsDiv
(
56
)
|
LCCR3_PixClkDiv
(
38
),
#else
#error "Must have a CerfBoard LCD form factor selected"
#endif
.
hsync_len
=
5
,
.
vsync_len
=
1
,
.
left_margin
=
61
,
.
upper_margin
=
3
,
.
right_margin
=
9
,
.
lower_margin
=
0
,
.
sync
=
FB_SYNC_HOR_HIGH_ACT
|
FB_SYNC_VERT_HIGH_ACT
,
};
#if 0
static struct sa1100fb_rgb cerf_rgb_16 = {
.red = { .offset = 8, .length = 4, },
.green = { .offset = 4, .length = 4, },
.blue = { .offset = 0, .length = 4, },
.transp = { .offset = 0, .length = 0, },
};
#endif
#endif
#ifdef CONFIG_SA1100_FREEBIRD
#warning Please check this carefully
static
struct
sa1100fb_mach_info
freebird_info
__initdata
=
{
...
...
@@ -683,11 +635,6 @@ sa1100fb_get_machine_info(struct sa1100fb_info *fbi)
inf
=
&
brutus_info
;
}
#endif
#ifdef CONFIG_SA1100_CERF
if
(
machine_is_cerf
())
{
inf
=
&
cerf_info
;
}
#endif
#ifdef CONFIG_SA1100_FREEBIRD
if
(
machine_is_freebird
())
{
inf
=
&
freebird_info
;
...
...
@@ -1294,10 +1241,6 @@ static void sa1100fb_setup_gpio(struct sa1100fb_info *fbi)
}
/* GPIO15 is used as a bypass for 3.8" displays */
if
(
machine_is_cerf
())
mask
|=
GPIO_GPIO15
;
if
(
mask
)
{
GPDR
|=
mask
;
GAFR
|=
mask
;
...
...
include/asm-arm/arch-pxa/udc.h
0 → 100644
View file @
1c23361e
/*
* linux/include/asm-arm/arch-pxa/udc.h
*
* This supports machine-specific differences in how the PXA2xx
* USB Device Controller (UDC) is wired.
*
* It is set in linux/arch/arm/mach-pxa/<machine>.c and used in
* the probe routine of linux/drivers/usb/gadget/pxa2xx_udc.c
*/
struct
pxa2xx_udc_mach_info
{
int
(
*
udc_is_connected
)(
void
);
/* do we see host? */
void
(
*
udc_command
)(
int
cmd
);
#define PXA2XX_UDC_CMD_CONNECT 0
/* let host see us */
#define PXA2XX_UDC_CMD_DISCONNECT 1
/* so host won't see us */
};
extern
void
pxa_set_udc_info
(
struct
pxa2xx_udc_mach_info
*
info
);
include/asm-arm/arch-sa1100/keyboard.h
View file @
1c23361e
...
...
@@ -11,7 +11,6 @@
extern
void
gc_kbd_init_hw
(
void
);
extern
void
smartio_kbd_init_hw
(
void
);
extern
void
cerf_kbd_init_hw
(
void
);
static
inline
void
kbd_init_hw
(
void
)
{
...
...
@@ -19,10 +18,6 @@ static inline void kbd_init_hw(void)
gc_kbd_init_hw
();
if
(
machine_is_adsbitsy
())
smartio_kbd_init_hw
();
#ifdef CONFIG_SA1100_CERF_CPLD
if
(
machine_is_cerf
())
cerf_kbd_init_hw
();
#endif
}
#endif
/* _SA1100_KEYBOARD_H */
include/asm-arm/mach/arch.h
View file @
1c23361e
...
...
@@ -12,7 +12,7 @@
* The size of struct machine_desc
* (for assembler code)
*/
#define SIZEOF_MACHINE_DESC
48
#define SIZEOF_MACHINE_DESC
52
#ifndef __ASSEMBLY__
...
...
@@ -45,6 +45,7 @@ struct machine_desc {
struct
meminfo
*
);
void
(
*
map_io
)(
void
);
/* IO mapping function */
void
(
*
init_irq
)(
void
);
void
(
*
init_machine
)(
void
);
};
/*
...
...
@@ -86,6 +87,9 @@ const struct machine_desc __mach_desc_##_type \
#define INITIRQ(_func) \
.init_irq = _func,
#define INIT_MACHINE(_func) \
.init_machine = _func,
#define MACHINE_END \
};
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment