Jelajahi Sumber

1.解决usb device模式bulk传输开启dma不能发送数据的问题;2.增加adb功能

huangliang 2 minggu lalu
induk
melakukan
900f12874d

+ 65 - 0
buildroot-external/board/arkmicro/ark1668ed_devb/rootfs_overlay/etc/build_adb.sh

@@ -0,0 +1,65 @@
+#!/bin/sh
+
+if [ $# -eq 0 ];
+then
+    usb_idx=0
+else
+	usb_idx=$1
+fi
+
+
+# config adb function
+KER_CONF="`grep '/sys/kernel/config' /proc/mounts`"
+if  [ -z "$KER_CONF" ];  then
+    mount -t configfs none /sys/kernel/config
+fi
+
+if  [ ! -d /sys/kernel/config/usb_gadget/g1 ];  then
+    mkdir /sys/kernel/config/usb_gadget/g1
+fi
+
+if  [ ! -d /sys/kernel/config/usb_gadget/g1/strings/0x409 ];  then
+    mkdir /sys/kernel/config/usb_gadget/g1/strings/0x409
+fi
+
+if  [ ! -d /sys/kernel/config/usb_gadget/g1/functions/adb.g1 ];  then
+    mkdir /sys/kernel/config/usb_gadget/g1/functions/adb.g1
+fi
+
+if  [ ! -d /sys/kernel/config/usb_gadget/g1/configs/c.1 ];  then
+    mkdir /sys/kernel/config/usb_gadget/g1/configs/c.1
+fi
+
+if  [ ! -d /sys/kernel/config/usb_gadget/g1/configs/c.1/strings/0x409 ];  then
+    mkdir /sys/kernel/config/usb_gadget/g1/configs/c.1/strings/0x409
+fi
+
+echo "0x18d1" > /sys/kernel/config/usb_gadget/g1/idVendor
+echo "0x0002" > /sys/kernel/config/usb_gadget/g1/idProduct
+
+echo "012345678adcdef" > /sys/kernel/config/usb_gadget/g1/strings/0x409/serialnumber
+echo "Arkmicro.Inc" > /sys/kernel/config/usb_gadget/g1/strings/0x409/manufacturer
+echo "ADB Device" > /sys/kernel/config/usb_gadget/g1/strings/0x409/product
+
+echo 0xc0 > /sys/kernel/config/usb_gadget/g1/configs/c.1/bmAttributes
+echo 500 > /sys/kernel/config/usb_gadget/g1/configs/c.1/MaxPower
+
+if  [ ! -L /sys/kernel/config/usb_gadget/g1/configs/c.1/adb.g1 ];  then
+    ln -s /sys/kernel/config/usb_gadget/g1/functions/adb.g1/ /sys/kernel/config/usb_gadget/g1/configs/c.1/adb.g1
+fi
+
+# start adbd daemon
+killall adbd
+adbd &
+
+if [ $usb_idx -eq 0 ];
+then
+        echo 40000000.usb > /sys/kernel/config/usb_gadget/g1/UDC
+        sleep 0.1
+        echo device > /sys/class/usb_role/40000000.usb-role-switch/role
+else
+        echo 40c00000.usb > /sys/kernel/config/usb_gadget/g1/UDC
+        sleep 0.1
+        echo device > /sys/class/usb_role/40c00000.usb-role-switch/role
+fi
+

+ 65 - 0
buildroot-external/board/arkmicro/ark1668ed_devb_emmc/rootfs_overlay/etc/build_adb.sh

@@ -0,0 +1,65 @@
+#!/bin/sh
+
+if [ $# -eq 0 ];
+then
+    usb_idx=0
+else
+	usb_idx=$1
+fi
+
+
+# config adb function
+KER_CONF="`grep '/sys/kernel/config' /proc/mounts`"
+if  [ -z "$KER_CONF" ];  then
+    mount -t configfs none /sys/kernel/config
+fi
+
+if  [ ! -d /sys/kernel/config/usb_gadget/g1 ];  then
+    mkdir /sys/kernel/config/usb_gadget/g1
+fi
+
+if  [ ! -d /sys/kernel/config/usb_gadget/g1/strings/0x409 ];  then
+    mkdir /sys/kernel/config/usb_gadget/g1/strings/0x409
+fi
+
+if  [ ! -d /sys/kernel/config/usb_gadget/g1/functions/adb.g1 ];  then
+    mkdir /sys/kernel/config/usb_gadget/g1/functions/adb.g1
+fi
+
+if  [ ! -d /sys/kernel/config/usb_gadget/g1/configs/c.1 ];  then
+    mkdir /sys/kernel/config/usb_gadget/g1/configs/c.1
+fi
+
+if  [ ! -d /sys/kernel/config/usb_gadget/g1/configs/c.1/strings/0x409 ];  then
+    mkdir /sys/kernel/config/usb_gadget/g1/configs/c.1/strings/0x409
+fi
+
+echo "0x18d1" > /sys/kernel/config/usb_gadget/g1/idVendor
+echo "0x0002" > /sys/kernel/config/usb_gadget/g1/idProduct
+
+echo "012345678adcdef" > /sys/kernel/config/usb_gadget/g1/strings/0x409/serialnumber
+echo "Arkmicro.Inc" > /sys/kernel/config/usb_gadget/g1/strings/0x409/manufacturer
+echo "ADB Device" > /sys/kernel/config/usb_gadget/g1/strings/0x409/product
+
+echo 0xc0 > /sys/kernel/config/usb_gadget/g1/configs/c.1/bmAttributes
+echo 500 > /sys/kernel/config/usb_gadget/g1/configs/c.1/MaxPower
+
+if  [ ! -L /sys/kernel/config/usb_gadget/g1/configs/c.1/adb.g1 ];  then
+    ln -s /sys/kernel/config/usb_gadget/g1/functions/adb.g1/ /sys/kernel/config/usb_gadget/g1/configs/c.1/adb.g1
+fi
+
+# start adbd daemon
+killall adbd
+adbd &
+
+if [ $usb_idx -eq 0 ];
+then
+        echo 40000000.usb > /sys/kernel/config/usb_gadget/g1/UDC
+        sleep 0.1
+        echo device > /sys/class/usb_role/40000000.usb-role-switch/role
+else
+        echo 40c00000.usb > /sys/kernel/config/usb_gadget/g1/UDC
+        sleep 0.1
+        echo device > /sys/class/usb_role/40c00000.usb-role-switch/role
+fi
+

+ 1 - 1
buildroot-external/configs/ark1668ed_devb_defconfig

@@ -48,7 +48,6 @@ BR2_PACKAGE_LIBMAD=y
 BR2_PACKAGE_LIBVORBIS=y
 BR2_PACKAGE_OPUS=y
 BR2_PACKAGE_TAGLIB=y
-BR2_PACKAGE_OPENSSL=y
 BR2_PACKAGE_BAYER2RGB_NEON=y
 BR2_PACKAGE_LIBDRM=y
 BR2_PACKAGE_LIBDRM_INSTALL_TESTS=y
@@ -75,6 +74,7 @@ BR2_PACKAGE_WPA_SUPPLICANT=y
 BR2_PACKAGE_WPA_SUPPLICANT_CLI=y
 BR2_PACKAGE_WPA_SUPPLICANT_WPA_CLIENT_SO=y
 BR2_PACKAGE_WPA_SUPPLICANT_PASSPHRASE=y
+BR2_PACKAGE_ANDROID_TOOLS=y
 BR2_TARGET_ROOTFS_UBI=y
 BR2_TARGET_ROOTFS_UBI_SUBSIZE=2048
 BR2_TARGET_ROOTFS_UBIFS_LEBSIZE=0x1f000

+ 1 - 1
buildroot-external/configs/ark1668ed_devb_emmc_defconfig

@@ -42,7 +42,6 @@ BR2_PACKAGE_LIBVORBIS=y
 BR2_PACKAGE_OPUS=y
 BR2_PACKAGE_TAGLIB=y
 BR2_PACKAGE_LZO=y
-BR2_PACKAGE_OPENSSL=y
 BR2_PACKAGE_BAYER2RGB_NEON=y
 BR2_PACKAGE_LIBDRM=y
 BR2_PACKAGE_LIBDRM_INSTALL_TESTS=y
@@ -68,6 +67,7 @@ BR2_PACKAGE_WPA_SUPPLICANT=y
 BR2_PACKAGE_WPA_SUPPLICANT_CLI=y
 BR2_PACKAGE_WPA_SUPPLICANT_WPA_CLIENT_SO=y
 BR2_PACKAGE_WPA_SUPPLICANT_PASSPHRASE=y
+BR2_PACKAGE_ANDROID_TOOLS=y
 BR2_TARGET_ROOTFS_EXT2=y
 BR2_TARGET_ROOTFS_EXT2_4=y
 BR2_TARGET_ROOTFS_EXT2_SIZE="500M"

+ 20 - 3
linux/drivers/usb/dwc2/gadget.c

@@ -1073,6 +1073,13 @@ static void dwc2_hsotg_start_req(struct dwc2_hsotg *hsotg,
 			WARN_ON(1);
 			return;
 		}
+	} else if (using_dma(hsotg) && hs_ep->dir_in) {
+		unsigned char  epnum;
+		for (epnum = 0; epnum < hsotg->num_of_eps; epnum++) {
+			u32 next = DXEPCTL_NEXTEP((epnum + 1) % 15);
+			u32 epinctl = dwc2_readl(hsotg, DIEPCTL(epnum));
+			dwc2_writel(hsotg, next | epinctl, DIEPCTL(epnum));
+		}
 	}
 
 	dma_reg = dir_in ? DIEPDMA(index) : DOEPDMA(index);
@@ -4178,7 +4185,8 @@ static int dwc2_hsotg_ep_enable(struct usb_ep *ep,
 	 * if the hardware has dedicated fifos, we must give each IN EP
 	 * a unique tx-fifo even if it is non-periodic.
 	 */
-	if (dir_in && (hsotg->dedicated_fifos || ((desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_INT))) {
+	if (dir_in && (hsotg->dedicated_fifos || (desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_INT
+		|| (desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_ISOC)) {
 		unsigned fifo_count = dwc2_hsotg_tx_fifo_count(hsotg);
 		u32 fifo_index = 0;
 		u32 fifo_size = UINT_MAX;
@@ -5089,7 +5097,7 @@ int dwc2_gadget_init(struct dwc2_hsotg *hsotg)
 		dev_err(dev, "failed to allocate ctrl req\n");
 		return -ENOMEM;
 	}
-
+#if 0
 	/* initialise the endpoints now the core has been initialised */
 	for (epnum = 0; epnum < hsotg->num_of_eps; epnum++) {
 		if (hsotg->eps_in[epnum] && (epnum % 2))
@@ -5104,7 +5112,16 @@ int dwc2_gadget_init(struct dwc2_hsotg *hsotg)
 		else if (epnum)
 			hsotg->eps_out[epnum] = NULL;
 	}
-
+#else
+	for (epnum = 0; epnum < hsotg->num_of_eps; epnum++) {
+		if (hsotg->eps_in[epnum])
+			dwc2_hsotg_initep(hsotg, hsotg->eps_in[epnum],
+					  epnum, 1);
+		if (hsotg->eps_out[epnum])
+			dwc2_hsotg_initep(hsotg, hsotg->eps_out[epnum],
+					  epnum, 0);
+	}
+#endif
 	dwc2_hsotg_dump(hsotg);
 
 	return 0;

+ 1 - 1
linux/drivers/usb/dwc2/params.c

@@ -507,7 +507,7 @@ static void dwc2_set_default_params(struct dwc2_hsotg *hsotg)
 {
 	struct dwc2_hw_params *hw = &hsotg->hw_params;
 	struct dwc2_core_params *p = &hsotg->params;
-	bool dma_capable = false;//!(hw->arch == GHWCFG2_SLAVE_ONLY_ARCH);
+	bool dma_capable = !(hw->arch == GHWCFG2_SLAVE_ONLY_ARCH);
 
 	dwc2_set_param_otg_cap(hsotg);
 	dwc2_set_param_phy_type(hsotg);