Jump to content

Banana Pi M2: USB Peripheral Driver UDC


Recommended Posts

This isn't specific to armbian, I guess.

 

I am not sure if the mainline linux kernel supports USB peripheral/OTG on Banana Pi M2.

 

Armbian doesn't list anything in 

/sys/class/udc

, so I assume it isn't. 

 

In the v3.3 kernel released by Sinovoip, there is a dedicated option in the menuconfig for sunxi_usb. I am not sure where to look in the mainline kernel.

 

Anybody has a better idea about this? 

 

Thank you.

Link to comment
Share on other sites

OTG was just introduced to 4.4 RC5 ... I just read about and was doing some tests but in host mode and on A20. No idea if this is operational within A31s / M2 too and how is with OTG mode.

 

If you want to try it, check my last kernel build:

 

http://mirror.igorpecovnik.com/test/Armbian_5.00_Bananapi_Debian_jessie_4.4.0-rc5.zip [tested]

http://mirror.igorpecovnik.com/test/h3/ [not tested yet]

 

OTG mode is default, for host you need to alter DTB.

Link to comment
Share on other sites

Upps, I was too quick on posting this. :( That image is with a boot loader for normal Banana with A20 but the kernel which is inside is the correct one.

 

Use the image from download section (that one works!) and install a kernel and DTB pack from test/h3 directory. This is not from mainline but from other sources so I am not sure OTG is already in but worth trying.

 

I'll compile from mainline later when got back in office and put to /test dir.

 

In any case use image from download section and change kernel(s).

 

EDIT:

Use this kernel upgrade. You can install all debs since there is a u-boot for M2 too.

http://mirror.igorpecovnik.com/test/m2-debs.zip

Link to comment
Share on other sites

Thanks for the M2 debs!
 
It is failing to boot though, and gets stuck when "starting kernel" (screenshot)

 

There was one error when installing the new DTB

dpkg: error processing archive linux-dtb-dev-sunxi_5.00_armhf.deb (--install):
 trying to overwrite '/boot/dtb/sun8i-a33-et-q8-v1.6.dtb', which is also in package linux-dtb-next-sunxi 4.5

I'll try the H3 debs now

Link to comment
Share on other sites

OK, I'll try it.

 

EDIT: I found two problems

 

U-boot seeks for:
 

sun6i-a31s-bananapi-m2.dtb

 

but we have

 

sun6i-a31s-sinovoip-bpi-m2.dtb

 

Filesystem was corrupted for no reason. Have to check build process.

Link to comment
Share on other sites

I made just a quick look, perhaps the problem is only broken file system within image.

 

On a serial console where I also monitored a kernel output ... I am more or less out for today, so fixing probably comes tomorrow.

Link to comment
Share on other sites

Yup, dmesg says ttyS0 is the serial port.

 

I did some digging around to learn a little more about U-boot and DTBs

 

Here's the commit that adds sun6i-a31s-sinovoip-bpi-m2 to the Makefile, but I can't figure out why sun6i-a31s-bananapi-m2.dts is still in the tree and when/why it was removed from the Makefile.

 

While the BPI-Mainline-uboot Makefile contains only sun6i-a31s-bananapi-m2.dts

 

I tried rebuilding the debs after changing the defconfig in U-boot. But the kernel doesn't boot anyway.

 

How do I see the detailed logs? I did change the loglevel in boot.cmd to 8, but the verbosity remains the same.

Edited by deadmetaphor
Link to comment
Share on other sites

Yup, the BPI-M2 Android kernel is too "limiting" too. Because my final aim is to experiment with configfs gadgets (which seems more full-featured in the mainline kernel), but for some reason, Android refuses to boot if I do not enable android_usb.

 

I didn't try to load any modules manually. I'll try that now.

Link to comment
Share on other sites

Thanks!

 

I had CONFIG_USB_MUSB_DUAL_ROLE=y instead of CONFIG_USB_MUSB_HOST=y

 

Also, I had to enable usb_otg in the dtb for BPI M2

 

And, now musb is printing something to dmesg, although it's an error:

 

[   74.232805] musb-sunxi 1c19000.usb: Invalid or missing 'dr_mode' property
[   74.239659] musb-sunxi: probe of 1c19000.usb failed with error -22
Link to comment
Share on other sites

You need kernel 4.4+ and you might be missing this in device tree:

 

&usb_otg {
dr_mode = "otg";
status = "okay";
}; 

Change dr_mode to host 

 

... if OTG is not operational and you will have a normal USB port but you need a powered usb hub.

Link to comment
Share on other sites

I am using the 4.4-rc6 kernel.

 

You were exactly right about device tree config! 

 

Setting dr_mode to "otg" (and CONFIG_USB_MUSB_DUAL_ROLE=y) gets rid of the "Invalid or missing 'dr_mode' property" error, but then there nothing in dmesg about musb (and right now I don't have an OTG cable to test if the host mode is working)

 

Setting dr_mode to "host" (CONFIG_USB_MUSB_HOST=y) gave the following

# dmesg | grep musb
[  107.463859] musb-hdrc: ConfigData=0xde (UTMI-8, dyn FIFOs, bulk combine, bulk split, HB-ISO Rx, HB-ISO Tx, SoftConn)
[  107.463903] musb-hdrc: MHDRC RTL version 0.0 
[  107.463937] musb-hdrc: 11/11 max ep, 5184/8192 memory
[  107.464250] musb-hdrc musb-hdrc.1.auto: MUSB HDRC host driver
[  107.464299] musb-hdrc musb-hdrc.1.auto: new USB bus registered, assigned bus number 3
[  107.465117] usb usb3: Manufacturer: Linux 4.4.0-rc6-sunxi musb-hcd
[  107.465135] usb usb3: SerialNumber: musb-hdrc.1.auto

So, I assume it is working (again, unable to test it at the moment).

 

Setting dr_mode to "otg" (and CONFIG_USB_MUSB_GADGET=y) always gives an error

musb-sunxi 1c19000.usb: Invalid or missing 'dr_mode' property
musb-sunxi: probe of 1c19000.usb failed with error -22
Link to comment
Share on other sites

From drivers\usb\musb\sunxi.c

	switch (usb_get_dr_mode(&pdev->dev)) {
#if defined CONFIG_USB_MUSB_DUAL_ROLE || defined CONFIG_USB_MUSB_HOST
	case USB_DR_MODE_HOST:
		pdata.mode = MUSB_PORT_MODE_HOST;
		break;
#endif
#ifdef CONFIG_USB_MUSB_DUAL_ROLE
	case USB_DR_MODE_OTG:
		glue->extcon = extcon_get_edev_by_phandle(&pdev->dev, 0);
		if (IS_ERR(glue->extcon)) {
			if (PTR_ERR(glue->extcon) == -EPROBE_DEFER)
				return -EPROBE_DEFER;
			dev_err(&pdev->dev, "Invalid or missing extcon\n");
			return PTR_ERR(glue->extcon);
		}
		pdata.mode = MUSB_PORT_MODE_DUAL_ROLE;
		break;
#endif
	default:
		dev_err(&pdev->dev, "Invalid or missing 'dr_mode' property\n");
		return -EINVAL;
	}

TL;DR:

  • OTG mode will work only if CONFIG_USB_MUSB_DUAL_ROLE is set
  • Host mode will work if either of CONFIG_USB_MUSB_DUAL_ROLE and CONFIG_USB_MUSB_HOST are set
Link to comment
Share on other sites

Aha! No wonder CONFIG_USB_MUSB_GADGET=y always had that error...it's decided at compile time. Thanks!

 

I did find a lot of "gadget" related handling in musb, now I have to figure out if MUSB_PORT_MODE_DUAL_ROLE supports gadget mode. And, if I have the right .config to make it work (assuming it's expected to work on A31 based boards).

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
×
×
  • Create New...

Important Information

Terms of Use - Privacy Policy - Guidelines