diff options
author | DanTheMan827 <790119+DanTheMan827@users.noreply.github.com> | 2017-12-20 01:07:20 +0300 |
---|---|---|
committer | madmonkey1907 <madfkingmonkey@gmail.com> | 2017-12-20 01:07:20 +0300 |
commit | f82225622fef037edef3f0ea18799b920219f3bd (patch) | |
tree | b0bd126b5036e24d77c12f56d00ced0a55e20383 | |
parent | 113b9526b01efd295e30c18efc051c10a95679ed (diff) |
sunxi_usb (#1)
* Modify sunxi_usb to allow switching between host and device mode through with /sys/devices/sunxi_usb/usb_role
-rw-r--r-- | drivers/usb/sunxi_usb/manager/usb_manager.c | 59 | ||||
-rw-r--r-- | drivers/usb/sunxi_usb/manager/usb_msg_center.c | 5 | ||||
-rw-r--r-- | drivers/usb/sunxi_usb/manager/usb_msg_center.h | 1 |
3 files changed, 63 insertions, 2 deletions
diff --git a/drivers/usb/sunxi_usb/manager/usb_manager.c b/drivers/usb/sunxi_usb/manager/usb_manager.c index dee4504e..a44b485d 100644 --- a/drivers/usb/sunxi_usb/manager/usb_manager.c +++ b/drivers/usb/sunxi_usb/manager/usb_manager.c @@ -40,12 +40,20 @@ #include <mach/platform.h> #include <linux/gpio.h> +#include <linux/device.h> +#include <linux/sysfs.h> +#include <linux/kobject.h> + #include "../include/sunxi_usb_config.h" #include "usb_manager.h" #include "usbc_platform.h" #include "usb_hw_scan.h" #include "usb_msg_center.h" +static struct device *dev_attr_sunxi_usb; +static struct kobject kobj_sunxi_usb; +static struct usb_scan_info g_usb_scan_info; + static struct usb_cfg g_usb_cfg; #ifdef CONFIG_USB_SUNXI_USB0_OTG @@ -395,7 +403,7 @@ static __s32 usb_script_parse(struct usb_cfg *cfg) memset(&cfg->port[i],0,sizeof(cfg->port[0])); } cfg->port[0].enable = 1; - cfg->port[0].port_type = USB_PORT_TYPE_HOST; + cfg->port[0].port_type = USB_PORT_TYPE_OTG; cfg->port[0].detect_type = USB_DETECT_TYPE_DP_DM; return 0; @@ -552,6 +560,47 @@ static __s32 get_usb_cfg(struct usb_cfg *cfg) return 0; } +static ssize_t show_usb_role(struct device *dev, struct device_attribute *attr, char *buf) +{ + enum usb_role role = USB_ROLE_NULL; + + role = get_usb_role(); + return sprintf(buf, "%u\n", role); +} + +static ssize_t store_usb_role(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + enum usb_role role = USB_ROLE_NULL; + enum usb_role target_role = USB_ROLE_NULL; + role = get_usb_role(); + + if(!strncmp(buf, "0", 1)){ + target_role = USB_ROLE_NULL; + }else if(!strncmp(buf, "1", 1)){ + target_role = USB_ROLE_HOST; + }else if(!strncmp(buf, "2", 1)){ + target_role = USB_ROLE_DEVICE; + } + + if(role == USB_ROLE_DEVICE) + hw_rmmod_usb_device(); + + if(role == USB_ROLE_HOST) + hw_rmmod_usb_host(); + + if(target_role == USB_ROLE_DEVICE) + hw_insmod_usb_device(); + + if(target_role == USB_ROLE_HOST) + hw_insmod_usb_host(); + + usb_msg_center(&g_usb_cfg); + + return count; +} + +static DEVICE_ATTR(usb_role, 0644, show_usb_role, store_usb_role); + static int __init usb_manager_init(void) { __s32 ret = 0; @@ -614,6 +663,10 @@ static int __init usb_manager_init(void) #endif DMSG_MANAGER_DEBUG("[sw usb]: usb_manager_init end\n"); + // Create /sys/devices/sunxi_usb + dev_attr_sunxi_usb = root_device_register("sunxi_usb"); + kobj_sunxi_usb = dev_attr_sunxi_usb->kobj; + sysfs_create_file(&kobj_sunxi_usb, &dev_attr_usb_role.attr); return 0; } @@ -653,7 +706,9 @@ static void __exit usb_manager_exit(void) usb_hw_scan_exit(&g_usb_cfg); } #endif - + + sysfs_remove_file(&kobj_sunxi_usb, &dev_attr_usb_role.attr); + root_device_unregister(dev_attr_sunxi_usb); usbc0_platform_device_exit(&g_usb_cfg.port[0]); return; } diff --git a/drivers/usb/sunxi_usb/manager/usb_msg_center.c b/drivers/usb/sunxi_usb/manager/usb_msg_center.c index 0739b257..d850b9f2 100644 --- a/drivers/usb/sunxi_usb/manager/usb_msg_center.c +++ b/drivers/usb/sunxi_usb/manager/usb_msg_center.c @@ -57,6 +57,11 @@ static void set_usb_role(struct usb_msg_center_info *center_info, enum usb_role return; } +void _set_usb_role(enum usb_role role) +{ + set_usb_role(&g_center_info, role); +} + /* void app_insmod_usb_host(void) { diff --git a/drivers/usb/sunxi_usb/manager/usb_msg_center.h b/drivers/usb/sunxi_usb/manager/usb_msg_center.h index 7a0e6780..70fc048e 100644 --- a/drivers/usb/sunxi_usb/manager/usb_msg_center.h +++ b/drivers/usb/sunxi_usb/manager/usb_msg_center.h @@ -52,6 +52,7 @@ void hw_insmod_usb_device(void); void hw_rmmod_usb_device(void); enum usb_role get_usb_role(void); +void _set_usb_role(enum usb_role role); void usb_msg_center(struct usb_cfg *cfg); s32 usb_msg_center_init(struct usb_cfg *cfg); |