I2Cアドレス0-7と120-127は予約されているため自作デバイスで使えるのは8-119

$ i2cdetect -l
$ sudo i2cdetect -F 13
$ sudo i2cdetect -y 13
$ picocom -b 115200 /dev/ttyUSB0
$ sudo sh -c 'echo pcf8574 0x1f > /sys/bus/i2c/devices/i2c-13/new_device'
$ sudo gpioinfo -c gpiochip1
$ sudo gpioset -c gpiochip1 -t 0 0=1
$ sudo gpioget -c gpiochip1 0
$ sudo sh -c 'echo ds3231 0x68 > /sys/bus/i2c/devices/i2c-13/new_device'
$ sudo hwclock -f /dev/rtc2
$ sudo dmesg | tail -n 20

$ sudo i2cget -y 13 0x10 0x00 w
この場合はアドレス指定で1byte writeが飛んでくる
$ sudo i2ctransfer -y 13 r2@0x10
この場合はいきなりリードしてくる

$ sudo sh -c 'echo mcp3221 0x10 > /sys/bus/i2c/devices/i2c-13/new_device'
$ cat /sys/class/i2c-dev/i2c-13/device/13-0010/hwmon/hwmon5/in0_input

$ sudo sh -c 'echo pca9685 0x1E > /sys/bus/i2c/devices/i2c-13/new_device'
$ sudo sh -c 'echo 0 > /sys/class/pwm/pwmchip0/export'
$ sudo sh -c 'echo 1000000 > /sys/class/pwm/pwmchip0/pwm0/period'
$ sudo sh -c 'echo 500000 > /sys/class/pwm/pwmchip0/pwm0/duty_cycle'
$ sudo sh -c 'echo 1 > /sys/class/pwm/pwmchip0/pwm0/enable'
$ sudo sh -c 'echo 0 > /sys/class/pwm/pwmchip0/pwm0/enable'

$ sudo sh -c 'echo pca9685 0x1E > /sys/bus/i2c/devices/i2c-13/new_device'
VPWM:B=0x01,A=0x00,W:L=0x0002,D=0x0104 MODE2=0x04
VPWM:B=0x01,A=0x02,W:L=0x0001,D=0x00
VPWM:B=0x00,A=0x00,R:L=0x0001
VPWM:B=0x01,A=0x01,W:L=0x0002,D=0x0020 MODE1=0x20
VPWM:B=0x01,A=0x01,W:L=0x0005,D=0xFA00100010 ALL_LED_ON_L=0x00,ALL_LED_ON_H=0x10,ALL_LED_OFF_L=0x00,ALL_LED_OFF_H=0x10
VPWM:B=0x01,A=0xFE,W:L=0x0001,D=0x00
VPWM:B=0x00,A=0x00,R:L=0x0001
VPWM:B=0x01,A=0x01,W:L=0x0002,D=0x0030 MODE1=0x30

$ sudo sh -c 'echo 0 > /sys/class/pwm/pwmchip0/export'
VPWM:B=0x01,A=0x01,W:L=0x0001,D=0x00
VPWM:B=0x00,A=0x00,R:L=0x0001
VPWM:B=0x01,A=0x01,W:L=0x0002,D=0x0020 MODE1=0x20
VPWM:B=0x01,A=0x01,W:L=0x0001,D=0x06
VPWM:B=0x00,A=0x06,R:L=0x0004
VPWM:B=0x01,A=0x0A,W:L=0x0001,D=0xFE
VPWM:B=0x00,A=0xFE,R:L=0x0001
この時点でenable=1になってる。普通は初期状態で0じゃないかと思うんだが。
exportした時点でenable=1になってるので、本物と動作が違うとしたらnew_deviceかexportの際に読み込んでる値の初期値が影響していると思われる。
new_device時に書き込み前に読み込まれてるのはMODE1で、exportの際にLED0_ON_Lから4byteとPRE_SCALEが読まれてる。

$ sudo sh -c 'echo 1000000 > /sys/class/pwm/pwmchip0/pwm0/period'
(1,000Hz)
VPWM:B=0x01,A=0xFF,W:L=0x0001,D=0x00
VPWM:B=0x00,A=0x00,R:L=0x0001
VPWM:B=0x01,A=0x01,W:L=0x0002,D=0x0030 MODE1=0x30
VPWM:B=0x01,A=0x01,W:L=0x0002,D=0xFE05 PRE_SCALE=0x05
VPWM:B=0x01,A=0xFF,W:L=0x0001,D=0x00
VPWM:B=0x00,A=0x00,R:L=0x0001
VPWM:B=0x01,A=0x01,W:L=0x0002,D=0x0020 MODE1=0x20
VPWM:B=0x01,A=0x01,W:L=0x0005,D=0x0600000000 LED0_ON_L=0x00,LED0_ON_H=0x00,LED0_OFF_L=0x00,LED0_OFF_H=0x00

PRE_SCALE=round(25,000,000/(4096*1000))-1=6-1=5
ps_mcu=((PRE_SCALE+1)*48)/ 25-1;(誤差を減らすため割り算は最後)
prescalerとperiodは一見同じだがカウンタのの最大値はperiodになるのでtimer_set_period(4095)で固定すればduty_cycleの計算が不要になる。

$ sudo sh -c 'echo 500000 > /sys/class/pwm/pwmchip0/pwm0/duty_cycle'
VPWM:B=0x01,A=0x0A,W:L=0x0005,D=0x0600002308 LED0_ON_L=0x00,LED0_ON_H=0x00,LED0_OFF_L=0x23,LED0_OFF_H=0x08

$ sudo sh -c 'echo 1 > /sys/class/pwm/pwmchip0/pwm0/enable'
$ sudo sh -c 'echo 0 > /sys/class/pwm/pwmchip0/pwm0/enable'
VPWM:B=0x01,A=0x0A,W:L=0x0005,D=0x0600000010 LED0_ON_L=0x00,LED0_ON_H=0x00,LED0_OFF_L=0x00,LED0_OFF_H=0x10
元々enable=1だからenableに1を送っても送信されない。
enable=0で送信されるLED0_OFF_H=0x10はfull OFFフラグ。

$ sudo sh -c 'echo 1 > /sys/class/pwm/pwmchip0/pwm0/enable'
VPWM:B=0x01,A=0x0A,W:L=0x0005,D=0x0600002308 LED0_ON_L=0x00,LED0_ON_H=0x00,LED0_OFF_L=0x23,LED0_OFF_H=0x08
disableした後にenableした場合はduty_cycleの計算値が飛んでくる。

LEDx_ON_H 0b00010000 1のところに0が書き込まれたらLEDx full ONになるがLEDx_ONはオール0以外の書き込みが来ないので見る必要はなさそう。
LEDx_OFF_H 0b00010000 1のところに1が書き込まれたらLEDx full OFFになる。enable=0の時にここに書き込まれてる。
LEDx_OFF_H full OFFを確認して1なら停止、それ以外の場合は下位12bitが0なら停止で0以外なら始動で良さげ？

MODE1 0b00100000 Register Auto-Increment enabled.(ドライバ有効化時にセットされるから常時AIでいい？)
MODE1 0b00010000 Register SLEEP(0=始動,1=停止)
MODE1への書き込みが確認できるのはこの2bit。
MODE2はドライバ有効化時のOUTDRV=1が書き込まれてる。

Auto Incrementは本来0-68と250-254以外で行われたら0に戻るらしいが対応させるのは面倒。
Auto IncrementのON/OFFの両方に対応させるのは面倒。
new_device登録時にONされてOFFにはされないみたいなんで常時ONで良さげ？
普通に使ってれば変なとこに書き込み要求は来ない。範囲がバッファから外れないようにだけすればいい？

PCF8574はどのピン読んでも1byteで全ピンのデータを返す。書き込みも1byte。
write:ホストから送信された1byteにデータが変更される。
read:現在の状態1byteを返す。
ドライバ有効化した際は2回readするぽい。
gpiogetする場合はreadする前にHでwriteするみたい。(仮想ピンに対してgpiogetしたら必ずHになる。実ピンなら回路次第)

MCP3221はreadにしか対応しないみたいだがi2cdetect -yで0byteのwriteがくるんで少なくとも0byteのwriteには応答するはず？
本物持ってないんで本物テストはできない。1chしかないのにマイコンより高級。

req->bmRequestType
0x41=0b01000001
0xc1=0b11000001
0x80=0b10000000(方向、1ならホストからデバイス)
0x01=0b01000000(ベンダリクエスト)
0x01=0b00000001(インターフェイス)
