在SC60上打算实现usb device和otg的软切换,即通过软件设置实现usb device和otg的切换。
原理图上可以设计一个GPIO来控制USB ID和数据线的切换。VBUS的供电方面,otg使用外供电,可以不用考虑;作device时vbus用来检测插入即可。
参考原理图如下:
图中使用GPIO_96作为控制切换的管脚,它输出0时,USB_ID脚为高,s脚为高,usb切换开关选择的是HSD1:USB_DP_EXT和USB_DM_EXT,此时模块作为device;
GPIO_96输出1时,USB_ID脚为低,usb切换开关选择的是HSD2:USB_DP_COM和USB_DM_COM,此时模块作为host,外部连接otg设备。
参考驱动:
#include <linux/device.h>
#include <asm/io.h>
#include <linux/init.h>
#include <linux/sched.h>
#include <linux/mm.h>
#include <linux/uaccess.h>
#include <linux/slab.h>
#include <linux/cdev.h>
#include <linux/types.h>
#include <linux/fs.h>
#include <linux/module.h>
#include <linux/semaphore.h>
#include <linux/of_device.h>
#include <linux/of_platform.h>
#include <linux/sched.h>
#include <linux/kthread.h>
#include <linux/delay.h>
#include <linux/gpio.h>
#define SC60_GPIO_SET_MAJOR 198
#define SC60_DO1 0x1
#define SC60_DO2 0x2
u32 gpio_num[]={
96,
};
struct SC60_gpio_dev{
struct cdev cdev;
};
struct SC60_gpio_dev *SC60_gpio_devp;
static int SC60_gpio_major = SC60_GPIO_SET_MAJOR;
int SC60_gpio_open(struct inode *inode, struct file *filp