検索条件
全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する。