Exemple #1
0
static int __init mstar_gpio_drv_init_module(void)
{
    int retval=0;
    GPIO_PRINT("%s is invoked\n", __FUNCTION__);
    retval = platform_driver_register(&Mstar_gpio_driver);
    return retval;
}
Exemple #2
0
static void mod_gpio_exit(void)
{
    GPIO_PRINT("%s is invoked\n", __FUNCTION__);

    cdev_del(&GPIODev.cDevice);
    unregister_chrdev_region(MKDEV(GPIODev.s32MajorGPIO, GPIODev.s32MinorGPIO), MOD_GPIO_DEVICE_COUNT);
}
Exemple #3
0
// Close SPI Channel
void Beagle_GPIO::closeSPI()
{
	if ( m_spi_fd >= 0)
	{
		GPIO_PRINT( "Closing SPI Device" );
		close( m_spi_fd );
		delete [] m_spi_buffer_rx;
	}
}
Exemple #4
0
static int _MDrv_GPIO_Open (struct inode *inode, struct file *filp)
{
	GPIO_ModHandle_t *dev;

    GPIO_PRINT("%s is invoked\n", __FUNCTION__);

    dev = container_of(inode->i_cdev, GPIO_ModHandle_t, cDevice);
	filp->private_data = dev;

    return 0;
}
Exemple #5
0
Beagle_GPIO::Beagle_GPIO()
{
	GPIO_PRINT( "Beagle_GPIO::Beagle_GPIO()" );
	
	// Not initialized by default
	m_active = false;
	
	// Opening /dev/mem first
	GPIO_PRINT( "Opening /dev/mem" );
	m_gpio_fd = open( "/dev/mem", O_RDWR | O_SYNC );
	if ( m_gpio_fd < 0 )
	{
		GPIO_ERROR( "Cannot open /dev/mem" );
		return;
	}

	// Map Control Module 
	m_controlModule = (unsigned long *)mmap( NULL, 0x1FFF, PROT_READ | PROT_WRITE, MAP_SHARED, m_gpio_fd, GPIO_Control_Module_Registers );
	if ( m_controlModule == MAP_FAILED )
	{
		GPIO_ERROR( "Control Module Mapping failed" );
		return;
	}

	// Now mapping the GPIO registers
	for ( int i=0; i<4; ++i)
	{
		// Map a GPIO bank
		m_gpio[i] = (unsigned long *)mmap( NULL, 0xFFF, PROT_READ | PROT_WRITE, MAP_SHARED, m_gpio_fd, GPIO_Base[i] );
		if ( m_gpio[i] == MAP_FAILED )
		{
			GPIO_ERROR( "GPIO Mapping failed for GPIO Module " << i );
			return;
		}
	}
	
	// Init complete and successfull
	m_active = true;

	GPIO_PRINT( "Beagle GPIO Initialized" );
}
Exemple #6
0
static int mod_gpio_init(void)
{
    S32         s32Ret;
    dev_t       dev;

    GPIO_PRINT("%s is invoked\n", __FUNCTION__);

    if (GPIODev.s32MajorGPIO)
    {
        dev = MKDEV(GPIODev.s32MajorGPIO, GPIODev.s32MinorGPIO);
        s32Ret = register_chrdev_region(dev, MOD_GPIO_DEVICE_COUNT, MOD_GPIO_NAME);
    }
    else
    {
        s32Ret = alloc_chrdev_region(&dev, GPIODev.s32MinorGPIO, MOD_GPIO_DEVICE_COUNT, MOD_GPIO_NAME);
        GPIODev.s32MajorGPIO = MAJOR(dev);
    }

    if ( 0 > s32Ret)
    {
        GPIO_PRINT("Unable to get major %d\n", GPIODev.s32MajorGPIO);
        return s32Ret;
    }

    cdev_init(&GPIODev.cDevice, &GPIODev.GPIOFop);
    if (0!= (s32Ret= cdev_add(&GPIODev.cDevice, dev, MOD_GPIO_DEVICE_COUNT)))
    {
        GPIO_PRINT("Unable add a character device\n");
        unregister_chrdev_region(dev, MOD_GPIO_DEVICE_COUNT);
        return s32Ret;
    }

	__mod_gpio_init();

	return 0;


}
Exemple #7
0
static int mstar_gpio_drv_resume(struct platform_device *dev)
{
    GPIO_PRINT("%s is invoked\n", __FUNCTION__);
    __mod_gpio_init();
    return 0;
}
Exemple #8
0
static int mstar_gpio_drv_suspend(struct platform_device *dev, pm_message_t state)
{
    GPIO_PRINT("%s is invoked\n", __FUNCTION__);
    return 0;
}
Exemple #9
0
static int _MDrv_GPIO_Ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg)
#endif
{
    S32 s32Err= 0;
  	U8 u8Temp;
	GPIO_Reg_t GPIO_reg;

    GPIO_PRINT("%s is invoked\n", __FUNCTION__);

    /*
     * extract the type and number bitfields, and don't decode
     * wrong cmds: return ENOTTY (inappropriate ioctl) before access_ok()
     */
    if ((GPIO_IOC_MAGIC!= _IOC_TYPE(cmd)) || (_IOC_NR(cmd)> GPIO_IOC_MAXNR))
    {
        return -ENOTTY;
    }

    /*
     * the direction is a bitmask, and VERIFY_WRITE catches R/W
     * transfers. `Type' is user-oriented, while
     * access_ok is kernel-oriented, so the concept of "read" and
     * "write" is reversed
     */
    if ((cmd != KERN_GPIO_OEN) && (cmd != KERN_GPIO_PULL_HIGH) && (cmd != KERN_GPIO_PULL_LOW))
    {
    if (_IOC_DIR(cmd) & _IOC_READ)
    {
        s32Err = !access_ok(VERIFY_WRITE, (void __user *)arg, _IOC_SIZE(cmd));
    }
    else if (_IOC_DIR(cmd) & _IOC_WRITE)
    {
        s32Err =  !access_ok(VERIFY_READ, (void __user *)arg, _IOC_SIZE(cmd));
    }
    if (s32Err)
    {
        return -EFAULT;
    }
    }


    //PROBE_IO_ENTRY(MDRV_MAJOR_GPIO, _IOC_NR(cmd));

    switch(cmd)
    {
        //the cases of this section set to initialize
        case MDRV_GPIO_INIT:
            GPIO_PRINT("ioctl: MDRV_GPIO_INIT\n");
            MDrv_GPIO_Init();
            break;
        case MDRV_GPIO_SET:
            GPIO_PRINT("ioctl: MDRV_GPIO_SET\n");
            if (copy_from_user(&u8Temp, (U8 *) arg, sizeof(U8)))
            {
                //PROBE_IO_EXIT(MDRV_MAJOR_GPIO, _IOC_NR(cmd));
 	            return -EFAULT;
            }
            MDrv_GPIO_Pad_Set(u8Temp);
            break;
        case MDRV_GPIO_OEN:
            GPIO_PRINT("ioctl: MDRV_GPIO_OEN\n");
            if (copy_from_user(&u8Temp, (U8 *) arg, sizeof(U8)))
            {
                //PROBE_IO_EXIT(MDRV_MAJOR_GPIO, _IOC_NR(cmd));
 	            return -EFAULT;
            }
            MDrv_GPIO_Pad_Oen(u8Temp);
            break;
	case KERN_GPIO_OEN:
            GPIO_PRINT("ioctl: KERN_GPIO_OEN\n");
	    u8Temp = *((U8 *) arg);
            MDrv_GPIO_Pad_Oen(u8Temp);
            break;
        case MDRV_GPIO_ODN:
            GPIO_PRINT("ioctl: MDRV_GPIO_ODN\n");
            if (copy_from_user(&u8Temp, (U8 *) arg, sizeof(U8)))
            {
                //PROBE_IO_EXIT(MDRV_MAJOR_GPIO, _IOC_NR(cmd));
 	            return -EFAULT;
            }
            MDrv_GPIO_Pad_Odn(u8Temp);
            break;
        case MDRV_GPIO_READ:
            GPIO_PRINT("ioctl: MDRV_GPIO_READ\n");
            if (copy_from_user(&u8Temp, (U8 *) arg, sizeof(U8)))
            {
                //PROBE_IO_EXIT(MDRV_MAJOR_GPIO, _IOC_NR(cmd));
 	            return -EFAULT;
            }
            u8Temp=MDrv_GPIO_Pad_Read(u8Temp);
            if (copy_to_user((U8 *) arg, &u8Temp, sizeof(U8)))
            {
                //PROBE_IO_EXIT(MDRV_MAJOR_GPIO, _IOC_NR(cmd));
                return -EFAULT;
            }
            break;
        case MDRV_GPIO_PULL_HIGH:
            GPIO_PRINT("ioctl: MDRV_GPIO_PULL_HIGH\n");
            if (copy_from_user(&u8Temp, (U8 *) arg, sizeof(U8)))
            {
                //PROBE_IO_EXIT(MDRV_MAJOR_GPIO, _IOC_NR(cmd));
 	            return -EFAULT;
            }
            MDrv_GPIO_Pull_High(u8Temp);
            break;
	case KERN_GPIO_PULL_HIGH:
            GPIO_PRINT("ioctl: KERN_GPIO_PULL_HIGH\n");
	    u8Temp = *((U8 *) arg);
            MDrv_GPIO_Pull_High(u8Temp);
            break;
        case MDRV_GPIO_PULL_LOW:
            GPIO_PRINT("ioctl: MDRV_GPIO_PULL_LOW\n");
            if (copy_from_user(&u8Temp, (U8 *) arg, sizeof(U8)))
            {
                //PROBE_IO_EXIT(MDRV_MAJOR_GPIO, _IOC_NR(cmd));
 	            return -EFAULT;
            }
            MDrv_GPIO_Pull_Low(u8Temp);
            break;
        case KERN_GPIO_PULL_LOW:
            GPIO_PRINT("ioctl: KERN_GPIO_PULL_LOW\n");
            u8Temp = *((U8 *) arg);
            MDrv_GPIO_Pull_Low(u8Temp);
            break;
        case MDRV_GPIO_INOUT:
            GPIO_PRINT("ioctl: MDRV_GPIO_INOUT\n");
            if (copy_from_user(&u8Temp, (U8 *) arg, sizeof(U8)))
            {
                //PROBE_IO_EXIT(MDRV_MAJOR_GPIO, _IOC_NR(cmd));
 	            return -EFAULT;
            }
            u8Temp=MDrv_GPIO_Pad_InOut(u8Temp);
            if (copy_to_user((U8 *) arg, &u8Temp, sizeof(U8)))
            {
                //PROBE_IO_EXIT(MDRV_MAJOR_GPIO, _IOC_NR(cmd));
                return -EFAULT;
            }
            break;
        case MDRV_GPIO_WREGB:
            GPIO_PRINT("ioctl: MDRV_GPIO_WREGB\n");
            if (copy_from_user(&GPIO_reg, (GPIO_Reg_t __user *) arg, sizeof(GPIO_Reg_t)))
            {
                //PROBE_IO_EXIT(MDRV_MAJOR_GPIO, _IOC_NR(cmd));
 	            return -EFAULT;
            }
            MDrv_GPIO_WriteRegBit(GPIO_reg.u32Reg, GPIO_reg.u8Enable, GPIO_reg.u8BitMsk);
            break;
        default:
            GPIO_PRINT("ioctl: unknown command\n");
            //PROBE_IO_EXIT(MDRV_MAJOR_GPIO, _IOC_NR(cmd));
            return -ENOTTY;
    }

    //PROBE_IO_EXIT(MDRV_MAJOR_GPIO, _IOC_NR(cmd));
    return 0;
}
Exemple #10
0
static int _MDrv_GPIO_Fasync(int fd, struct file *filp, int mode)
{
    GPIO_PRINT("%s is invoked\n", __FUNCTION__);

	return 0;//fasync_helper(fd, filp, mode, &IICDev.async_queue);
}
Exemple #11
0
static unsigned int _MDrv_GPIO_Poll(struct file *filp, poll_table *wait)
{
    GPIO_PRINT("%s is invoked\n", __FUNCTION__);
    return 0;
}
Exemple #12
0
static ssize_t _MDrv_GPIO_Write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos)
{
    GPIO_PRINT("%s is invoked\n", __FUNCTION__);
    return 0;
}
Exemple #13
0
static int _MDrv_GPIO_Release(struct inode *inode, struct file *filp)
{
    GPIO_PRINT("%s is invoked\n", __FUNCTION__);
    return 0;
}
Exemple #14
0
// Open SPI Channel
void Beagle_GPIO::openSPI( unsigned char _mode,
			   unsigned char _bits,
			   unsigned long _speed,
	       		   unsigned short _delay )
{
	GPIO_PRINT( "Opening SPI Device" );
	m_spi_fd = open( spi_device, O_RDWR );
	if ( m_spi_fd < 0 )
	{
		GPIO_ERROR( "Error opening SPI Device" );
		return;
	}

	int ret = 0;

	// Save settings
	m_spi_mode = _mode;
	m_spi_bits = _bits;
	m_spi_speed = _speed;
	m_spi_delay = _delay;

	m_spi_buffer_rx = new unsigned char[65536];

	// SPI Mode
	ret = ioctl(m_spi_fd, SPI_IOC_WR_MODE, &m_spi_mode);
	if (ret == -1)
	{
		GPIO_ERROR( "Error setting SPI Mode");
		return;
	}

	ret = ioctl(m_spi_fd, SPI_IOC_RD_MODE, &m_spi_mode);
	if (ret == -1)
	{
		GPIO_ERROR( "Error getting SPI Mode");
		return;
	}

	// SPI Bits Per Word
	ret = ioctl(m_spi_fd, SPI_IOC_WR_BITS_PER_WORD, &m_spi_bits);
	if (ret == -1)
	{
		GPIO_ERROR( "Error setting SPI Bits Per Word");
		return;
	}

	ret = ioctl(m_spi_fd, SPI_IOC_RD_BITS_PER_WORD, &m_spi_bits);
	if (ret == -1)
	{
		GPIO_ERROR( "Error getting SPI Bits Per Word");
		return;
	}

	// SPI Max Speed
	ret = ioctl(m_spi_fd, SPI_IOC_WR_MAX_SPEED_HZ, &m_spi_speed);
	if (ret == -1)
	{
		GPIO_ERROR( "Error setting SPI Max Speed");
		return;
	}

	ret = ioctl(m_spi_fd, SPI_IOC_RD_MAX_SPEED_HZ, &m_spi_speed);
	if (ret == -1)
	{
		GPIO_ERROR( "Error getting SPI Max Speed");
		return;
	}

	GPIO_PRINT( "SPI Mode : " << std::hex << (int)(m_spi_mode) );
	GPIO_PRINT( "SPI Bits Per Word : " << std::dec << (int)(m_spi_bits) );
	GPIO_PRINT( "SPI Max Speed : " << std::dec << m_spi_speed );
	GPIO_PRINT( "SPI Delay : " << std::dec << m_spi_delay );
	GPIO_PRINT( "SPI Opened" );
}