検索条件
全2件
(1/1ページ)
+----------+
| PC |
| Windows |
+-----+----+
USB |
| +-------------+
+------------------+Ras Pi Zero W|
OTG Port| |
+-------------+
$ sudo echo 0xa0 > /sys/kernel/config/usb_gadget/isticktoit/configs/c.1/bmAttributesとする(初期値は0x80)。
$ sudo apt-get install git bcディレクトリ作って
$ cd ~ $ mkdir kernel $ cd kernelカーネル落とした。
$ git clone --depth=1 https://github.com/raspberrypi/linux最初に、config作ってやる。Pi Zero Wなので、bcmrpi_defconfigの方。
cd linux KERNEL=kernel make bcmrpi_defconfig
$ lsmod ~~ udc_core 38945 3 dwc2,libcomposite,usb_f_hid ~~ソースを読むと、hidg0に値を書き込んだときの動きは、HIDドライバ->gadget共通ドライバ->dwc2(DesignWaveのUSB2かな)ドライバだと思う。
--- ~/kernel/linux/drivers/usb/gadget/function/f_hid.c.orig 2019-02-17 13:21:42.845143807 +0000
+++ ~/kernel/linux/drivers/usb/gadget/function/f_hid.c 2019-02-17 13:26:25.554009039 +0000
@@ -339,10 +339,14 @@
size_t count, loff_t *offp)
{
struct f_hidg *hidg = file->private_data;
+ struct usb_composite_dev *cdev = hidg->func.config->cdev;
struct usb_request *req;
unsigned long flags;
ssize_t status = -ENOMEM;
+ usb_gadget_wakeup(cdev->gadget);
+ pr_info("Wakeup!\n");
+
if (!access_ok(VERIFY_READ, buffer, count))
return -EFAULT;
--- /home/pi/kernel/linux/drivers/usb/dwc2/gadget.c.orig 2019-02-09 06:00:07.027365942 +0000
+++ /home/pi/kernel/linux/drivers/usb/dwc2/gadget.c 2019-02-17 13:37:07.611431738 +0000
@@ -4445,6 +4445,30 @@
return usb_phy_set_power(hsotg->uphy, mA);
}
+static int dwc2_hsotg_wakeup(struct usb_gadget *gadget)
+{
+ u32 dctl;
+ struct dwc2_dregs_backup *dr;
+ struct dwc2_hsotg *dev;
+ unsigned long flags;
+ dev = container_of(gadget, struct dwc2_hsotg, gadget);
+ dr = &dev->dr_backup;
+
+ spin_lock_irqsave(&dev->lock, flags);
+ udelay(10);
+
+ /* Start Remote Wakeup Signaling */
+ dwc2_writel(dr->dctl | DCTL_RMTWKUPSIG, dev->regs + DCTL);
+ mdelay(12);
+ dctl = dwc2_readl(dev->regs + DCTL);
+ dctl &= ~DCTL_RMTWKUPSIG;
+ dwc2_writel(dctl, dev->regs + DCTL);
+
+ spin_unlock_irqrestore(&dev->lock, flags);
+
+ return 0;
+}
+
static const struct usb_gadget_ops dwc2_hsotg_gadget_ops = {
.get_frame = dwc2_hsotg_gadget_getframe,
.udc_start = dwc2_hsotg_udc_start,
@@ -4452,6 +4476,7 @@
.pullup = dwc2_hsotg_pullup,
.vbus_session = dwc2_hsotg_vbus_session,
.vbus_draw = dwc2_hsotg_vbus_draw,
+ .wakeup = dwc2_hsotg_wakeup,
};
/**
多少ソースが変わっても再パッチは簡単そう。$ make -j4 zImage modules dtbs $ sudo make modules_install $ sudo cp arch/arm/boot/dts/*.dtb /boot/ $ sudo cp arch/arm/boot/dts/overlays/*.dtb* /boot/overlays/ $ sudo cp arch/arm/boot/dts/overlays/README /boot/overlays/ $ sudo cp arch/arm/boot/zImage /boot/$KERNEL.img最後にリブート
$ sudo reboot
$ cd ~/kernel/linux $ make drivers/usb/gadget/function/usb_f_hid.ko $ make drivers/usb/dwc2/dwc2.koでパッチ対象モジュールを作れる。
$ echo -ne "\0\0\0\0\0\0\0\0" > /dev/hidg0でwakeupがホストに行くようになる(hidg0の権限次第でsudoが必要)。
+----------+
| PC |有線LAN
| Windows +--------------------+
+-----+----+ |OTG Port
USB | |(USB-有線LAN変換アダプタ)
| +-------------+
+------------------+Ras Pi Zero W|
Power Port| |
+-------------+
+----------+
| PC |有線LAN
| Windows +--------------------+
+----------+ |OTG Port
|(USB-有線LAN変換アダプタ)
+-------------+
+-------------+Ras Pi Zero W|
| Power Port| |
| +-------------+
|
+-----+-----+
|AC-MicroUSB|
+-----+-----+
|
+-------+
|AC100V |
+-------+
$ passwd
$ sudo apt-get update $ sudo apt-get upgrade $ sudo apt-get dist-upgradeここまではやったほうが良い。
$ sudo rebootする。
brcmfmac: brcmf_sdio_hostmail : Unknown mailbox data content: 0x40012今の所安定しているが、場合によってはパワーマネジメントを切る方法も試みる。
interface eth0 metric 50 static ip_address=192.168.2.2/24 interface wlan0 metric 100 static ip_address=192.168.1.99/24 static routers=192.168.1.1 static domain_name_servers=8.8.4.4 8.8.8.8
$ sudo apt-get install wakeonlan
ssh-rsa XXXXXXXXXXX work_user command="/usr/bin/wakeonlan -i 192.168.2.255 MM:MM:MM:MM:MM:MM" ssh-rsa YYYYYYYYY wol_userMM:MM:MM:MM:MM:MMはwakeup対象PCのNICのMACアドレス。
PermitRootLogin no PasswordAuthentication no
$ sudo rebootより気にするならpiユーザ以外にしたほうがいいかも。
> ssh.exe -i pi_wol_key(wolコマンド発行用の秘密鍵) -o StrictHostKeyChecking=no pi@192.168.1.99とかで、RasPiが有線側から192.168.2.0/24にブロードキャストして対象PCがwakeupする。