diff options
Diffstat (limited to 'packages/robostix-module/files')
-rw-r--r-- | packages/robostix-module/files/Makefile | 19 | ||||
-rw-r--r-- | packages/robostix-module/files/robostix.c | 1011 | ||||
-rw-r--r-- | packages/robostix-module/files/robostix.h | 114 | ||||
-rwxr-xr-x | packages/robostix-module/files/robostix.init | 53 |
4 files changed, 0 insertions, 1197 deletions
diff --git a/packages/robostix-module/files/Makefile b/packages/robostix-module/files/Makefile deleted file mode 100644 index e242da4feb..0000000000 --- a/packages/robostix-module/files/Makefile +++ /dev/null @@ -1,19 +0,0 @@ -############################################################################# -# -# Makefile for building the robostix module -# -############################################################################# - -obj-m = robostix.o - -PWD = $(shell pwd) -KBUILD_FLAGS = -C $(KERNEL_PATH) M=$(PWD) KERNELRELEASE=$(KERNELRELEASE) - -default: modules - -modules: - $(MAKE) $(KBUILD_FLAGS) modules - -clean: - rm -rf *.o *~ *.ko *.mod.c - diff --git a/packages/robostix-module/files/robostix.c b/packages/robostix-module/files/robostix.c deleted file mode 100644 index 1b3adac577..0000000000 --- a/packages/robostix-module/files/robostix.c +++ /dev/null @@ -1,1011 +0,0 @@ -/**************************************************************************** -* -* Copyright (c) 2006 Dave Hylands <dhylands@gmail.com> -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License version 2 as -* published by the Free Software Foundation. -* -* Alternatively, this software may be distributed under the terms of BSD -* license. -* -* See README and COPYING for more details. -* -****************************************************************************/ -/** -* -* robostix.c -* -* PURPOSE: -* -* This implements a driver for using the robostix from the gumstix -* -* Initially, this contains the required support to emulate enough of the -* parallel port interface to allow avrdude to program the ATMega128. -* -*****************************************************************************/ - -/* ---- Include Files ---------------------------------------------------- */ - -#include <linux/module.h> -#include <linux/init.h> -#include <linux/fs.h> - -#include <linux/parport.h> -#include <linux/ppdev.h> -#include <linux/sysctl.h> -#include <linux/cdev.h> -#include <linux/device.h> -#include <linux/version.h> - -#include <asm/delay.h> -#include <asm/uaccess.h> - -#include <asm/arch/hardware.h> -#include <asm/arch/pxa-regs.h> - -#include "robostix.h" - -/**************************************************************************** -* -* This driver assumes that the robostix uses the following GPIO pins: -* -* Robostix gumstix ATmega -* Symbol GPIO Dir Symbol Description -* ---------- ---- --- -------------- ------------------------------------- -* IR_RXD 46 in ATM_TX0 PE1 Acts as PDO or MISO for programming -* IR_TXD 47 out ATM_RX0 PE0 Acts as PDI or MOSI for programming -* -* L_DD11 69 in ATM_IRQ PE2 IRQ from ATmega128 to gumstix -* L_DD12 70 out Enable for Vcc5 and AVCC for the ATMega -* L_DD14 72 out Active low enable for the 245's -* L_DD15 73 out ATM_RESET Resets the processor -* -* The following shows the mapping of the SPI port for the gumstix: -* -* NSSPCLK 81 out ATM_SCK Acts as SCK for SPI use -* NSSPFRAME 82 out ATM_SS Acts as SS for SPI use -* X_MOSI 83 out ATM_MOSI Acts as MOSI for SPI use -* X_MISO 84 in ATM_MISO Acts as MISO for SPI use -* -* On the verdex, the mapping for the SPI port is slightly different: -* -* SSPCLK2 19 out ATM_SCK Acts as SCK for SPI use -* SSPSFRM2 14 out ATM_SS Acts as SS for SPI use -* SSPTXD2 13 out ATM_MOSI Acts as MOSI for SPI use -* SSPRXD2 11 in ATM_MISO Acts as MISO for SPI use -* -* X_SCL - i/o ATM_SCL i2c clock -* X_SDA - i/o ATM_SDA i2c data -* -*****************************************************************************/ - -//--------------------------------------------------------------------------- -// -// This was extracted from avrdude, and it gives the pin configuration for -// AVR Dude's default programmer. UISP calls it "BSD" -// This is what I've chosen for this driver to implement. - -#if 0 -programmer - id = "bsd"; - desc = "Brian Dean's Programmer, http://www.bsdhome.com/avrdude/"; - type = par; - vcc = 2, 3, 4, 5; - reset = 7; - sck = 8; - mosi = 9; - miso = 10; -; -#endif -//--------------------------------------------------------------------------- -// -// The following was extracted from avrdude. It basically gives the pin -// number to register mapping that is in effect for the parallel port. -// -// I added the comments on the right which shows pin usage for the default -// programmer. -// -// From this, we can glean that the Control register is never used, and none -// of the signals which are used are inverted. -// -// Furthermore, all of the Data accesses are writes and all of the Status -// accesses are reads. - -#if 0 -struct ppipins_t { - int pin; - int reg; - int bit; - int inverted; -}; - -static struct ppipins_t pins[] = { - { 1, PPICTRL, 0x01, 1 }, - { 2, PPIDATA, 0x01, 0 }, // Vcc - { 3, PPIDATA, 0x02, 0 }, // Vcc - { 4, PPIDATA, 0x04, 0 }, // Vcc - { 5, PPIDATA, 0x08, 0 }, // Vcc - { 6, PPIDATA, 0x10, 0 }, - { 7, PPIDATA, 0x20, 0 }, // Reset - { 8, PPIDATA, 0x40, 0 }, // SCK - { 9, PPIDATA, 0x80, 0 }, // MOSI - { 10, PPISTATUS, 0x40, 0 }, // MISO - { 11, PPISTATUS, 0x80, 1 }, - { 12, PPISTATUS, 0x20, 0 }, - { 13, PPISTATUS, 0x10, 0 }, - { 14, PPICTRL, 0x02, 1 }, - { 15, PPISTATUS, 0x08, 0 }, - { 16, PPICTRL, 0x04, 0 }, - { 17, PPICTRL, 0x08, 1 } -}; - -#endif - -#define PPI_DATA_VCC_MASK ( 0x01 | 0x02 | 0x04 | 0x08 ) -#define PPI_DATA_RESET_MASK ( 0x20 ) -#define PPI_DATA_SCK_MASK ( 0x40 ) -#define PPI_DATA_MOSI_MASK ( 0x80 ) - -#define PPI_STATUS_MISO_MASK ( 0x40 ) - -/* ---- Public Variables ------------------------------------------------- */ -/* ---- Private Constants and Types -------------------------------------- */ - -#define USE_SYSCTL 1 - -#if 1 -# if USE_SYSCTL -# define ROBO_DEBUG( flag, fmt, args... ) do { if ( gDebug ## flag ) printk( "%s: " fmt, __FUNCTION__ , ## args ); } while (0) -# else -# define ROBO_DEBUG( flag, fmt, args... ) printk( "%s: " fmt, __FUNCTION__ , ## args ) -# endif -#else -# define ROBO_DEBUG( flag, fmt, args... ) -#endif - -#define SET_GPIO( pin, val ) do { if ( val ) { GPSR( pin ) = GPIO_bit( pin ); } else { GPCR( pin ) = GPIO_bit( pin ); }} while(0) -#define GET_GPIO( pin ) (( GPLR( pin ) & GPIO_bit( pin )) != 0 ) - -// The Alternate function register is 2 bits per pin, so we can't use the -// GPIO_bit macro. - -#define GPIO_AF_shift(x) (((x) & 0x0F ) << 1 ) -#define GPIO_AF_mask(x) ( 3 << GPIO_AF_shift( x )) - -/* - * Define the mappings between various GPIO pins and functions on the robostix - * board. - */ - -#define ROBOSTIX_GPIO_ATM_IRQ GPIO69_LDD_11 -#define ROBOSTIX_GPIO_VCC5_ENABLE GPIO70_LDD_12 -#define ROBOSTIX_GPIO_245_ENABLE GPIO72_LDD_14 -#define ROBOSTIX_GPIO_ATM_RESET GPIO73_LDD_15 - -#ifdef CONFIG_PXA27x -# define ROBOSTIX_GPIO_ATM_SCK ( 19 | GPIO_ALT_FN_1_OUT ) -# define ROBOSTIX_GPIO_ATM_SS ( 14 | GPIO_ALT_FN_2_OUT ) -# define ROBOSTIX_GPIO_ATM_MOSI ( 13 | GPIO_ALT_FN_1_OUT ) -# define ROBOSTIX_GPIO_ATM_MISO ( 11 | GPIO_ALT_FN_2_IN ) -#else -# define ROBOSTIX_GPIO_ATM_SCK GPIO81_NSCLK -# define ROBOSTIX_GPIO_ATM_SS GPIO82_NSFRM -# define ROBOSTIX_GPIO_ATM_MOSI GPIO83_NSTXD -# define ROBOSTIX_GPIO_ATM_MISO GPIO84_NSRXD -#endif - -#define ROBOSTIX_GPIO_IR_RXD_5V GPIO46_STRXD -#define ROBOSTIX_GPIO_IR_TXD_5V GPIO47_STTXD - -// Since IR TxD/RxD behave like MOSI/MISO during programming, we define a -// couple of aliases - -#define ROBOSTIX_GPIO_ATM_PGM_MOSI ROBOSTIX_GPIO_IR_TXD_5V -#define ROBOSTIX_GPIO_ATM_PGM_MISO ROBOSTIX_GPIO_IR_RXD_5V - - -typedef enum -{ - RoboStixGpioIn, - RoboStixGpioOut, -} PinMode_e; - -typedef struct -{ - unsigned grer; - unsigned gfer; - unsigned gafr; - unsigned gpdr; - unsigned gplr; - -} PinConfig_t; - -/* ---- Private Variables ------------------------------------------------ */ - -#define ROBOSTIX_DEV_NAME "robostix" - -static char gBanner[] __initdata = KERN_INFO "Robostix Driver Compiled: " __DATE__ " at " __TIME__ "\n"; - -static PinConfig_t gIrTxdConfig; -static PinConfig_t gIrRxdConfig; - -dev_t gRobostixDevNum; -struct cdev gRobostixCDev; -struct class *gRobostixClass; - -#if USE_SYSCTL - -static int gDebugTrace = 0; -static int gDebugIoctl = 0; -static int gDebugError = 1; - -static struct ctl_table_header *gSysCtlHeader; - -static struct ctl_table gSysCtlRobostix[] = -{ - { - .ctl_name = CTL_ROBOSTIX_DEBUG_TRACE, - .procname = "debug-trace", - .data = &gDebugTrace, - .maxlen = sizeof( int ), - .mode = 0644, - .proc_handler = &proc_dointvec - }, - { - .ctl_name = CTL_ROBOSTIX_DEBUG_IOCTL, - .procname = "debug-ioctl", - .data = &gDebugIoctl, - .maxlen = sizeof( int ), - .mode = 0644, - .proc_handler = &proc_dointvec - }, - { - .ctl_name = CTL_ROBOSTIX_DEBUG_ERROR, - .procname = "debug-error", - .data = &gDebugError, - .maxlen = sizeof( int ), - .mode = 0644, - .proc_handler = &proc_dointvec - }, - { 0 } -}; - -static struct ctl_table gSysCtl[] = -{ - { - .ctl_name = CTL_ROBOSTIX, - .procname = "robostix", - .mode = 0555, - .child = gSysCtlRobostix - }, - { 0 } -}; - -#endif // USE_SYSCTL - -/* ---- Private Function Prototypes -------------------------------------- */ - -static void robostix_configure_pin( int pin, PinMode_e pinMode ); -static void robostix_get_pin_config( int pin, PinConfig_t *pinConfig ); -static void robostix_set_pin_config( int pin, const PinConfig_t *pinConfig ); - -static void robostix_exit( void ); -static int robostix_init( void ); -static int robostix_ioctl( struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg ); -static int robostix_open( struct inode *inode, struct file *file ); -static int robostix_release( struct inode *inode, struct file *file ); - -/**************************************************************************** -* -* File Operations (these are the device driver entry points) -* -*****************************************************************************/ - -static struct file_operations robostix_fops = -{ - owner: THIS_MODULE, - ioctl: robostix_ioctl, - open: robostix_open, - release: robostix_release, -}; - -/* ---- Functions -------------------------------------------------------- */ - -/**************************************************************************** -* -* robostix_configure_pin -* -* Configures a GPIO pin for use with the RoboStix. -* -*****************************************************************************/ - -void robostix_configure_pin( int pin, PinMode_e pinMode ) -{ - // Make sure that interrupts on rising/falling edges are turned off. This - // is a bit paranoid, but might as well be sure. - - GRER( pin ) &= ~GPIO_bit( pin ); - GFER( pin ) &= ~GPIO_bit( pin ); - - // Set the pin to be a GPIO pin - - GAFR( pin ) &= ~GPIO_AF_mask( pin ); // AF = 0 is GPIO - - // Reprogram the direction of the pin. - - if ( pinMode == RoboStixGpioIn ) - { - GPDR( pin ) &= ~GPIO_bit( pin ); // in - } - else - { - GPDR( pin ) |= GPIO_bit( pin ); // out - } - -} // robostix_configure_pin - -/**************************************************************************** -* -* robostix_get_pin_config -* -* Retrieves the current pin configuration and stores it in @a pinConfig. -* -*****************************************************************************/ - -void robostix_get_pin_config( int pin, PinConfig_t *pinConfig ) -{ - pinConfig->grer = GRER( pin ) & GPIO_bit( pin ); - pinConfig->gfer = GFER( pin ) & GPIO_bit( pin ); - pinConfig->gafr = GAFR( pin ) & GPIO_AF_mask( pin ); - pinConfig->gpdr = GPDR( pin ) & GPIO_bit( pin ); - pinConfig->gplr = GPLR( pin ) & GPIO_bit( pin ); - -} // robostix_get_pin_config - -/**************************************************************************** -* -* robostix_set_pin_config -* -* Restores the pin configuration to a previously saved comfiguration. -* -*****************************************************************************/ - -void robostix_set_pin_config( int pin, const PinConfig_t *pinConfig ) -{ - GRER( pin ) = ( GRER( pin ) & ~GPIO_bit( pin )) | ( pinConfig->grer & GPIO_bit( pin )); - GFER( pin ) = ( GFER( pin ) & ~GPIO_bit( pin )) | ( pinConfig->gfer & GPIO_bit( pin )); - GPDR( pin ) = ( GPDR( pin ) & ~GPIO_bit( pin )) | ( pinConfig->gpdr & GPIO_bit( pin )); - GAFR( pin ) = ( GAFR( pin ) & ~GPIO_AF_mask( pin )) | ( pinConfig->gafr & GPIO_AF_mask( pin )); - - if (( pinConfig->gplr & GPIO_bit( pin )) == 0 ) - { - GPSR( pin ) |= GPIO_bit( pin ); - } - else - { - GPCR( pin ) |= GPIO_bit( pin ); - } - -} // robostix_set_pin_config - -/**************************************************************************** -* -* robostix_exit -* -* Called to perform module cleanup when the module is unloaded. -* -*****************************************************************************/ - -void robostix_exit( void ) -{ - ROBO_DEBUG( Trace, "called\n" ); - - class_device_destroy( gRobostixClass, gRobostixDevNum ); - class_destroy( gRobostixClass ); - - cdev_del( &gRobostixCDev ); - -#if USE_SYSCTL - if ( gSysCtlHeader != NULL ) - { - unregister_sysctl_table( gSysCtlHeader ); - } -#endif - - unregister_chrdev_region( gRobostixDevNum, 1 ); - -#if 0 - unregister_chrdev( ROBOSTIX_MAJOR, ROBOSTIX_DEV_NAME ); -#endif - -} // robostix_exit - -/**************************************************************************** -* -* robostix_init -* -* Called to perform module initialization when the module is loaded. -* -*****************************************************************************/ - -int __init robostix_init( void ) -{ - int rc; - - ROBO_DEBUG( Trace, "called\n" ); - - printk( gBanner); - -#if 0 - // Register our device with Linux - - if (( rc = register_chrdev( ROBOSTIX_MAJOR, ROBOSTIX_DEV_NAME, &robostix_fops )) < 0 ) - { - printk( KERN_WARNING "robostix: register_chrdev failed for major %d\n", ROBOSTIX_MAJOR ); - return rc; - } -#endif - - if (( rc = alloc_chrdev_region( &gRobostixDevNum, 0, 1, ROBOSTIX_DEV_NAME )) < 0 ) - { - printk( KERN_WARNING "robostix: Unable to allocate major, err: %d\n", rc ); - return rc; - } - -#if USE_SYSCTL - #if ( LINUX_VERSION_CODE <= KERNEL_VERSION( 2, 6, 20 )) - gSysCtlHeader = register_sysctl_table( gSysCtl, 0 ); - if ( gSysCtlHeader != NULL ) - { - gSysCtlHeader->ctl_table->child->de->owner = THIS_MODULE; - } - #else - gSysCtlHeader = register_sysctl_table( gSysCtl ); - #endif -#endif - - // Initialize the various GPIO pins that control the Robostix. - // - // IR_RXD 46 in ATM_TX0 PE1 Acts as PDO or MISO for programming - // IR_TXD 47 out ATM_RX0 PE0 Acts as PDI or MOSI for programming - // - // L_DD11 69 in ATM_IRQ PE2 IRQ from ATmega128 to gumstix - // L_DD12 70 out Enable for Vcc5 and AVCC for the ATMega - // L_DD14 72 out Active low enable for the 245's - // L_DD15 73 out ATM_RESET Resets the processor - // - // NSSPCLK 81 out ATM_SCK Acts as SCK for SPI use - // NSSPFRAME 82 out ATM_SS Acts as SS for SPI use - // X_MOSI 83 out ATM_MOSI Acts as MOSI for SPI use - // X_MISO 84 in ATM_MISO Acts as MISO for SPI use - // - // For now, we initialize things so that they continue on the way that - // they were when the gumstix boots: - // - // 245 is enabled - // voltage regulators are enabled - // Robostix is held in Reset - // - // I'd like to either see the voltage regulators in a disabled state - // or see the robostix not be held in reset so that we don't have sensors - // and motors and stuff going wild while the gumstix boots. - // - // The gumstix console runs through the '245 so we make sure to leave - // it enabled. - - // The first thing to do is configure the input pins. - - robostix_configure_pin( ROBOSTIX_GPIO_ATM_MISO, RoboStixGpioIn ); - - // TODO: Set ATM_IRQ line to generate an interrupt - -// printk( "IRQ\n" ); -// robostix_configure_pin( ROBOSTIX_GPIO_ATM_IRQ, RoboStixGpioIn ); - - // Configure the output pins. We set the GPIO value register before - // setting configuring it as a GPIO so that we don't create a glitch. - - SET_GPIO( ROBOSTIX_GPIO_VCC5_ENABLE, 1 ); // Voltage regulator on (active high) - robostix_configure_pin( ROBOSTIX_GPIO_VCC5_ENABLE, RoboStixGpioOut ); - - SET_GPIO( ROBOSTIX_GPIO_ATM_RESET, 0 ); // AVR held in Reset (active low) - robostix_configure_pin( ROBOSTIX_GPIO_ATM_RESET, RoboStixGpioOut ); - - // The values of these pins don't really matter. - - robostix_configure_pin( ROBOSTIX_GPIO_ATM_SCK, RoboStixGpioOut ); - robostix_configure_pin( ROBOSTIX_GPIO_ATM_SS, RoboStixGpioOut ); - robostix_configure_pin( ROBOSTIX_GPIO_ATM_MOSI, RoboStixGpioOut ); - - // Finally enable the '245 - - SET_GPIO( ROBOSTIX_GPIO_245_ENABLE, 0 ); // '245 enabled (active low) - robostix_configure_pin( ROBOSTIX_GPIO_245_ENABLE, RoboStixGpioOut ); - - // Don't change the configuration of the IR TxD/RxD here. Instead we - // save/restore using the PPCLAIM/PPRELEASE which brackets when avrdude - // is doing the actual programming. - - // TODO: Probably configure IR TxD as UART - - // Register our device. The device becomes "active" as soon as cdev_add - // is called. - - cdev_init( &gRobostixCDev, &robostix_fops ); - gRobostixCDev.owner = THIS_MODULE; - - if (( rc = cdev_add( &gRobostixCDev, gRobostixDevNum, 1 )) != 0 ) - { - printk( KERN_WARNING "robostix: cdev_add failed: %d\n", rc ); - return rc; - } - - gRobostixClass = class_create( THIS_MODULE, ROBOSTIX_DEV_NAME ); - if ( IS_ERR( gRobostixClass )) - { - printk( KERN_WARNING "robostix: Unable to create class\n" ); - return -1; - } - - class_device_create( gRobostixClass, NULL, gRobostixDevNum, NULL, ROBOSTIX_DEV_NAME ); - - return 0; - -} // robostix_init - -/**************************************************************************** -* -* robostix_ioctl -* -* Called to process ioctl requests -* -*****************************************************************************/ - -int robostix_ioctl( struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg ) -{ - int err; - int userVal; - - ROBO_DEBUG( Trace, "type: '%c' cmd: 0x%x\n", _IOC_TYPE( cmd ), _IOC_NR( cmd )); - - if (( _IOC_TYPE( cmd ) != ROBOSTIX_IOCTL_MAGIC ) - || ( _IOC_NR( cmd ) < ROBOSTIX_CMD_FIRST ) - || ( _IOC_NR( cmd ) >= ROBOSTIX_CMD_LAST )) - { - // Since we emulate some of the parallel port commands, we need to allow - // those as well. - - if (( _IOC_TYPE( cmd ) != PP_IOCTL ) - || ( _IOC_NR( cmd ) < 0x80 ) - || ( _IOC_NR( cmd ) >= 0x9b )) - { - return -ENOTTY; - } - } - - // Note that _IOC_DIR Read/Write is from the perspective of userland. access_ok - // is from the perspective of kernelland. - - err = 0; - if (( _IOC_DIR( cmd ) & _IOC_READ ) != 0 ) - { - err |= !access_ok( VERIFY_WRITE, (void *)arg, _IOC_SIZE( cmd )); - } - if (( _IOC_DIR( cmd ) & _IOC_WRITE ) != 0 ) - { - err |= !access_ok( VERIFY_READ, (void *)arg, _IOC_SIZE( cmd )); - } - if ( err ) - { - ROBO_DEBUG( Error, "arg pointer is invalid\n" ); - return -EFAULT; - } - - switch ( cmd ) - { - case ROBOSTIX_IOCTL_POWER_VCC5: - { - ROBO_DEBUG( Ioctl, "Power: %ld\n", arg ); - -#if 1 - // Until I figure something else out, the only way I can get the - // power to really go off is to also turn off the '245. This means - // that we'll lose the console, so you better be turning things - // back on real soon now - - SET_GPIO( ROBOSTIX_GPIO_245_ENABLE, !arg ); // '245 is active low - - // Also - I noticed that the Console connector on the Robostix has - // Vcc5 going to it, which means that if a TTL <=> RS232 converter - // is being powered off the robostix, we'll lose our console as - // soon as the voltage regulator (which generates Vcc5) gets - // turned off. - -#else - // In order to truly power off the robostix, we need to turn off - // the voltage regulator. We assume that the '245 stays on so we - // continue to get our console. This also means that we need to - // take all of the GPIO lines low to eliminate any leak-thru - // current. - - if ( arg ) - { - // Powering on - Configure I/O pins in "typical" manner. - - // TODO: Probably set MOSI/SCK/SS back to NSSP - // TODO: Probably set IR TxD back to UART - } - else - { - // Powering off. Make them all GPIO's so that we can force - // them low. - - SET_GPIO( ROBOSTIX_GPIO_ATM_RESET, 0 ); - SET_GPIO( ROBOSTIX_GPIO_ATM_MOSI, 0 ); - SET_GPIO( ROBOSTIX_GPIO_ATM_SCK, 0 ); - SET_GPIO( ROBOSTIX_GPIO_ATM_SS, 0 ); - SET_GPIO( ROBOSTIX_GPIO_IR_TXD_5V, 0 ); - - robostix_configure_pin( ROBOSTIX_GPIO_ATM_RESET, RoboStixGpioOut ); - robostix_configure_pin( ROBOSTIX_GPIO_ATM_MOSI, RoboStixGpioOut ); - robostix_configure_pin( ROBOSTIX_GPIO_ATM_SCK, RoboStixGpioOut ); - robostix_configure_pin( ROBOSTIX_GPIO_ATM_SS, RoboStixGpioOut ); - robostix_configure_pin( ROBOSTIX_GPIO_IR_TXD_5V, RoboStixGpioOut ); - - // Grr - ATM_SCL and ATM_SDA are both pulled up to V_BATT, - // so we probably need to make these go low too, which effectively - // means that we lose the i2c bus. - } -#endif - - SET_GPIO( ROBOSTIX_GPIO_VCC5_ENABLE, arg ); // Voltage regulator is active high - break; - } - - case ROBOSTIX_IOCTL_RESET: - { - if ( arg == ROBOSTIX_PIN_PULSE ) - { - // The ATMega128 datasheet says that the reset pulse needs - // to have a minimum pulse width of 1.5 usec. - - ROBO_DEBUG( Ioctl, "Reset: %ld (pulse)\n", arg ); - - SET_GPIO( ROBOSTIX_GPIO_ATM_RESET, 0 ); // Reset is active low - udelay( 3 ); - SET_GPIO( ROBOSTIX_GPIO_ATM_RESET, 1 ); - } - else - { - // Reset is active low, so "on" means low - - ROBO_DEBUG( Ioctl, "Reset: %ld\n", arg ); - - SET_GPIO( ROBOSTIX_GPIO_ATM_RESET, !arg ); - } - break; - } - - case ROBOSTIX_IOCTL_245_ENABLE: - { - // The 245 is active low, so we invert the sense of on/off - - ROBO_DEBUG( Ioctl, "245 Enable: %ld\n", arg ); - - if ( arg != 0 ) - { - printk( KERN_WARNING "Robostix: Warning turning '245 off - console may become inactive\n" ); - - // Allow some time for the above warning to get printed on the - // console before we turn it off. - - set_current_state( TASK_INTERRUPTIBLE ); - schedule_timeout( 2 ); - } - - SET_GPIO( ROBOSTIX_GPIO_245_ENABLE, !arg ); - break; - } - - case ROBOSTIX_IOCTL_SET_SCK: // out - { - ROBO_DEBUG( Ioctl, "Set SCK: %ld\n", arg ); - - SET_GPIO( ROBOSTIX_GPIO_ATM_SCK, arg ); - break; - } - - case ROBOSTIX_IOCTL_SET_SS: // out - { - ROBO_DEBUG( Ioctl, "Set SS: %ld\n", arg ); - - SET_GPIO( ROBOSTIX_GPIO_ATM_SS, arg ); - break; - } - - case ROBOSTIX_IOCTL_SET_IR_TXD: // out - { - // This particular ioctl should only ever be called as part of - // somebody testing something. We assume that they'll be smart - // enough to reconfigure when they're done. - - ROBO_DEBUG( Ioctl, "Set IR TxD: %ld\n", arg ); - - robostix_configure_pin( ROBOSTIX_GPIO_IR_TXD_5V, RoboStixGpioOut ); - - SET_GPIO( ROBOSTIX_GPIO_IR_TXD_5V, arg ); - break; - } - - case ROBOSTIX_IOCTL_GET_IR_RXD: // in - { - // This particular ioctl should only ever be called as part of - // somebody testing something. We assume that they'll be smart - // enough to reconfigure when they're done. - - robostix_configure_pin( ROBOSTIX_GPIO_IR_RXD_5V, RoboStixGpioIn ); - - userVal = GET_GPIO( ROBOSTIX_GPIO_IR_RXD_5V ); - if ( copy_to_user( (int *)arg, &userVal, sizeof( userVal )) != 0 ) - { - return -EFAULT; - } - - ROBO_DEBUG( Ioctl, "Get IR RxD: %d\n", userVal ); - break; - } - - case ROBOSTIX_IOCTL_SET_MOSI: // out - { - ROBO_DEBUG( Ioctl, "Set MOSI: %ld\n", arg ); - - SET_GPIO( ROBOSTIX_GPIO_ATM_MOSI, arg ); - break; - } - - case ROBOSTIX_IOCTL_GET_MISO: // in - { - userVal = GET_GPIO( ROBOSTIX_GPIO_ATM_MISO ); - if ( copy_to_user( (int *)arg, &userVal, sizeof( userVal )) != 0 ) - { - return -EFAULT; - } - ROBO_DEBUG( Ioctl, "Get MISO: %d\n", userVal ); - break; - } - - case ROBOSTIX_IOCTL_GET_IRQ: // in - { - userVal = GET_GPIO( ROBOSTIX_GPIO_ATM_IRQ ); - if ( copy_to_user( (int *)arg, &userVal, sizeof( userVal )) != 0 ) - { - return -EFAULT; - } - ROBO_DEBUG( Ioctl, "Get IRQ: %d\n", userVal ); - break; - } - - case ROBOSTIX_IOCTL_DELAY_USEC: - { - ROBO_DEBUG( Ioctl, "Delay: %ld usecs\n", arg ); - - udelay( arg ); - break; - } - - //------------------------------------------------------------------- - // - // Parallel port interface. Some documentation on these ioctls can - // be found here: - // http://www.kernelnewbies.org/documents/kdoc/parportbook/x623.html - // - - case PPRSTATUS: // Read status register - { - unsigned char statusReg = 0; - int miso; - - // The only thing mapped into the status register, is MISO. - - miso = GET_GPIO( ROBOSTIX_GPIO_ATM_PGM_MISO ); - - - if ( miso ) - { - statusReg |= PPI_STATUS_MISO_MASK; - } - - ROBO_DEBUG( Ioctl, "PPRSTATUS: 0x%02x miso:%d\n", statusReg, miso ); - - if ( copy_to_user( (unsigned char *)arg, &statusReg, sizeof( statusReg )) != 0 ) - { - return -EFAULT; - } - break; - } - - case PPRCONTROL: // Read control register - { - // Called once to initialize avrdude's shadow registers - - unsigned char controlReg = 0; - - ROBO_DEBUG( Ioctl, "PPRCONTROL: 0x%02x\n", controlReg ); - - if ( copy_to_user( (unsigned char *)arg, &controlReg, sizeof( controlReg )) != 0 ) - { - return -EFAULT; - } - break; - } - - case PPWCONTROL: // Write control register - { - unsigned char controlReg = 0; - - if ( copy_from_user( &controlReg, (unsigned char *)arg, sizeof( controlReg )) != 0 ) - { - return -EFAULT; - } - - ROBO_DEBUG( Ioctl, "PPWCONTROL: 0x%02x\n", controlReg ); - break; - } - - case PPRDATA: // Read data register - { - // Called once to initialize avrdude's shadow registers - - unsigned char dataReg = 0; - int power, sck, reset, mosi; - - power = GET_GPIO( ROBOSTIX_GPIO_VCC5_ENABLE ); - sck = GET_GPIO( ROBOSTIX_GPIO_ATM_SCK ); - reset = GET_GPIO( ROBOSTIX_GPIO_ATM_RESET ); - mosi = GET_GPIO( ROBOSTIX_GPIO_ATM_PGM_MOSI ); - - if ( power ) - { - dataReg |= PPI_DATA_VCC_MASK; - } - if ( reset ) - { - dataReg |= PPI_DATA_RESET_MASK; - } - if ( sck ) - { - dataReg |= PPI_DATA_SCK_MASK; - } - if ( mosi ) - { - dataReg |= PPI_DATA_MOSI_MASK; - } - - ROBO_DEBUG( Ioctl, "PPRDATA: 0x%02x pow:%d reset:%d sck:%d mosi: %d\n", dataReg, power, reset, sck, mosi ); - - if ( copy_to_user( (unsigned char *)arg, &dataReg, sizeof( dataReg )) != 0 ) - { - return -EFAULT; - } - break; - } - - case PPWDATA: // Write data register - { - unsigned char dataReg = 0; - int power, sck, reset, mosi; - - if ( copy_from_user( &dataReg, (unsigned char *)arg, sizeof( dataReg )) != 0 ) - { - return -EFAULT; - } - - power = ( dataReg & PPI_DATA_VCC_MASK ) != 0; - sck = ( dataReg & PPI_DATA_SCK_MASK ) != 0; - reset = ( dataReg & PPI_DATA_RESET_MASK ) != 0; - mosi = ( dataReg & PPI_DATA_MOSI_MASK ) != 0; - - ROBO_DEBUG( Ioctl, "PPWDATA: 0x%02x pow:%d reset:%d sck:%d mosi: %d\n", dataReg, power, reset, sck, mosi ); - - SET_GPIO( ROBOSTIX_GPIO_VCC5_ENABLE, power ); - SET_GPIO( ROBOSTIX_GPIO_245_ENABLE, !power ); // 245 is active low - - SET_GPIO( ROBOSTIX_GPIO_ATM_SCK, sck ); - SET_GPIO( ROBOSTIX_GPIO_ATM_RESET, reset ); - SET_GPIO( ROBOSTIX_GPIO_ATM_PGM_MOSI, mosi ); - break; - } - - case PPCLAIM: // Claim the parallel port - { - ROBO_DEBUG( Ioctl, "PPCLAIM\n" ); - - // We use this opportunity to save away the state of the IR Txd/Rxd lines - // and convert them to GPIO. - - robostix_get_pin_config( ROBOSTIX_GPIO_IR_TXD_5V, &gIrTxdConfig ); - robostix_get_pin_config( ROBOSTIX_GPIO_IR_RXD_5V, &gIrRxdConfig ); - - robostix_configure_pin( ROBOSTIX_GPIO_IR_TXD_5V, RoboStixGpioOut ); - robostix_configure_pin( ROBOSTIX_GPIO_IR_RXD_5V, RoboStixGpioIn ); - break; - } - - case PPRELEASE: // Release the parallel port - { - ROBO_DEBUG( Ioctl, "PPRELEASE\n" ); - - // We use this opportunity to restore the state of the IR Txd/Rxd lines - // back to what they were. - - robostix_set_pin_config( ROBOSTIX_GPIO_IR_TXD_5V, &gIrTxdConfig ); - robostix_set_pin_config( ROBOSTIX_GPIO_IR_RXD_5V, &gIrRxdConfig ); - break; - } - - case PPDATADIR: - { - int dataDirReg; - - if ( copy_from_user( &dataDirReg, (int *)arg, sizeof( dataDirReg )) != 0 ) - { - return -EFAULT; - } - - ROBO_DEBUG( Ioctl, "PPDATADIR: 0x%02x\n", dataDirReg ); - break; - } - - default: - { - ROBO_DEBUG( Error, "Unrecognized ioctl: '0x%x'\n", cmd ); - return -ENOTTY; - } - } - - return 0; - -} // robostix_ioctl - -/**************************************************************************** -* -* robostix_open -* -* Called to process open requests -* -*****************************************************************************/ - -int robostix_open( struct inode *inode, struct file *file ) -{ - ROBO_DEBUG( Trace, "major = %d, minor = %d\n", MAJOR( inode->i_rdev ), MINOR( inode->i_rdev )); - - return 0; - -} // robostix_open - -/**************************************************************************** -* -* robostix_release -* -* Called when the last istance is closed. -* -*****************************************************************************/ - -int robostix_release( struct inode *inode, struct file *file ) -{ - ROBO_DEBUG( Trace, "called\n" ); - - return 0; - -} // robostix_release - -/****************************************************************************/ - -module_init(robostix_init); -module_exit(robostix_exit); - -MODULE_AUTHOR("Dave Hylands"); -MODULE_DESCRIPTION("gumstix/robostix driver"); -MODULE_LICENSE("Dual BSD/GPL"); - diff --git a/packages/robostix-module/files/robostix.h b/packages/robostix-module/files/robostix.h deleted file mode 100644 index 0d860bc7a4..0000000000 --- a/packages/robostix-module/files/robostix.h +++ /dev/null @@ -1,114 +0,0 @@ -/**************************************************************************** -* -* Copyright (c) 2006 Dave Hylands <dhylands@gmail.com> -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License version 2 as -* published by the Free Software Foundation. -* -* Alternatively, this software may be distributed under the terms of BSD -* license. -* -* See README and COPYING for more details. -* -****************************************************************************/ -/** -* -* robostix_drv.h -* -* PURPOSE: -* -* This implements a driver for using the robostix from the gumstix -* -* Initially, this contains the required support to emulate enough of the -* parallel port interface to allow avrdude to program the ATMega128. -* -*****************************************************************************/ - -#if !defined( LINUX_ROBOSTIX_H ) -#define LINUX_ROBOSTIX_H ) - -/* ---- Include Files ----------------------------------------------------- */ - -#include <linux/ioctl.h> - -/* ---- Constants and Types ----------------------------------------------- */ - -#define ROBOSTIX_MAJOR 240 - -#define ROBOSTIX_IOCTL_MAGIC 'R' - -/** - * Deefines for each of the commands. Note that since we want to reduce - * the possibility that a user mode program gets out of sync with a given - * driver, we explicitly assign a value to each enumeration. This makes - * it more difficult to stick new ioctl's in the middle of the list. - */ - -typedef enum -{ - ROBOSTIX_CMD_FIRST = 0x80, - - ROBOSTIX_CMD_POWER_VCC5 = 0x80, - ROBOSTIX_CMD_RESET = 0x81, - ROBOSTIX_CMD_245_ENABLE = 0x82, - ROBOSTIX_CMD_SET_SCK = 0x83, - ROBOSTIX_CMD_SET_SS = 0x84, - ROBOSTIX_CMD_SET_IR_TXD = 0x85, - ROBOSTIX_CMD_GET_IR_RXD = 0x86, - ROBOSTIX_CMD_SET_MOSI = 0x87, - ROBOSTIX_CMD_GET_MISO = 0x88, - ROBOSTIX_CMD_GET_IRQ = 0x89, - ROBOSTIX_CMD_DELAY_USEC = 0x8A, // value is hardocded in uisp DAPA.C - - /* Insert new ioctls here */ - - ROBOSTIX_CMD_LAST, - -} ROBOSTIX_CMD; - -/* - * The following are arguments to the various ioctl's - */ - -#define ROBOSTIX_PIN_OFF 0 -#define ROBOSTIX_PIN_ON 1 -#define ROBOSTIX_PIN_PULSE 2 // only used or Reset - -/* - * Definitions for the actual ioctl commands - */ - -#define ROBOSTIX_IOCTL_POWER_VCC5 _IO( ROBOSTIX_IOCTL_MAGIC, ROBOSTIX_CMD_POWER_VCC5 ) // arg is int -#define ROBOSTIX_IOCTL_RESET _IO( ROBOSTIX_IOCTL_MAGIC, ROBOSTIX_CMD_RESET ) // arg is int -#define ROBOSTIX_IOCTL_245_ENABLE _IO( ROBOSTIX_IOCTL_MAGIC, ROBOSTIX_CMD_245_ENABLE ) // arg is int -#define ROBOSTIX_IOCTL_SET_SCK _IO( ROBOSTIX_IOCTL_MAGIC, ROBOSTIX_CMD_SET_SCK ) // arg is int -#define ROBOSTIX_IOCTL_SET_SS _IO( ROBOSTIX_IOCTL_MAGIC, ROBOSTIX_CMD_SET_SS ) // arg is int -#define ROBOSTIX_IOCTL_SET_IR_TXD _IO( ROBOSTIX_IOCTL_MAGIC, ROBOSTIX_CMD_SET_IR_TXD ) // arg is int -#define ROBOSTIX_IOCTL_GET_IR_RXD _IOR( ROBOSTIX_IOCTL_MAGIC, ROBOSTIX_CMD_GET_IR_RXD, int ) // arg is int * -#define ROBOSTIX_IOCTL_SET_MOSI _IO( ROBOSTIX_IOCTL_MAGIC, ROBOSTIX_CMD_SET_MOSI ) // arg is int -#define ROBOSTIX_IOCTL_GET_MISO _IOR( ROBOSTIX_IOCTL_MAGIC, ROBOSTIX_CMD_GET_MISO, int ) // arg is int * -#define ROBOSTIX_IOCTL_GET_IRQ _IOR( ROBOSTIX_IOCTL_MAGIC, ROBOSTIX_CMD_GET_IRQ, int ) // arg is int * -#define ROBOSTIX_IOCTL_DELAY_USEC _IO( ROBOSTIX_IOCTL_MAGIC, ROBOSTIX_CMD_DELAY_USEC ) // arg is int - - -/* - * Definitions for sysctl. The top level define has to be unique system wide. - * The kernel defines values 1 thru about 10 (see include/linunx/sysctl.h) - */ - -#define CTL_ROBOSTIX 0x526F626F /* 'Robo' in hex form */ - -/* - * The following are for entries in /proc/sys/robostix - */ - -enum -{ - CTL_ROBOSTIX_DEBUG_TRACE = 101, - CTL_ROBOSTIX_DEBUG_IOCTL = 102, - CTL_ROBOSTIX_DEBUG_ERROR = 103 -}; - -#endif // LINUX_ROBOSTIX_H - diff --git a/packages/robostix-module/files/robostix.init b/packages/robostix-module/files/robostix.init deleted file mode 100755 index 9bbd1d9e7c..0000000000 --- a/packages/robostix-module/files/robostix.init +++ /dev/null @@ -1,53 +0,0 @@ -#!/bin/sh -# -# Start the robostix -# - -start() { - echo "Starting robostix..." - - # Make sure ttyS2 is setup - echo "AF2 in" > /proc/gpio/GPIO46 - echo "AF1 out" > /proc/gpio/GPIO47 - - # Turn on the robostix '245 - echo "GPIO out clear" > /proc/gpio/GPIO72 - - # Turn on the robostix Power - echo "GPIO out set" > /proc/gpio/GPIO70 - - # load driver - /sbin/modprobe robostix - - # Take the robostix out of reset - echo "GPIO out set" > /proc/gpio/GPIO73 - -} -stop() { - echo "Stopping robostix..." - - # Put the robostix into reset - echo "GPIO out clear" > /proc/gpio/GPIO73 -} -restart() { - stop - start -} - -case "$1" in - start) - start - ;; - stop) - stop - ;; - restart) - restart - ;; - *) - echo $"Usage: $0 {start|stop|restart}" - exit 1 -esac - -exit $? - |