Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5e1ce3988d | ||
|
|
dd05007f3b |
No files matched your search
@@ -159,7 +159,6 @@ ifeq ($(strip $(RGBLIGHT_ENABLE)), yes)
|
|||||||
SRC += $(QUANTUM_DIR)/color.c
|
SRC += $(QUANTUM_DIR)/color.c
|
||||||
SRC += $(QUANTUM_DIR)/rgblight.c
|
SRC += $(QUANTUM_DIR)/rgblight.c
|
||||||
CIE1931_CURVE := yes
|
CIE1931_CURVE := yes
|
||||||
LED_BREATHING_TABLE := yes
|
|
||||||
RGB_KEYCODES_ENABLE := yes
|
RGB_KEYCODES_ENABLE := yes
|
||||||
ifeq ($(strip $(RGBLIGHT_CUSTOM_DRIVER)), yes)
|
ifeq ($(strip $(RGBLIGHT_CUSTOM_DRIVER)), yes)
|
||||||
OPT_DEFS += -DRGBLIGHT_CUSTOM_DRIVER
|
OPT_DEFS += -DRGBLIGHT_CUSTOM_DRIVER
|
||||||
@@ -351,11 +350,6 @@ ifeq ($(strip $(CIE1931_CURVE)), yes)
|
|||||||
LED_TABLES := yes
|
LED_TABLES := yes
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(strip $(LED_BREATHING_TABLE)), yes)
|
|
||||||
OPT_DEFS += -DUSE_LED_BREATHING_TABLE
|
|
||||||
LED_TABLES := yes
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(strip $(LED_TABLES)), yes)
|
ifeq ($(strip $(LED_TABLES)), yes)
|
||||||
SRC += $(QUANTUM_DIR)/led_tables.c
|
SRC += $(QUANTUM_DIR)/led_tables.c
|
||||||
endif
|
endif
|
||||||
|
|||||||
@@ -0,0 +1,128 @@
|
|||||||
|
# I2C マスタドライバ
|
||||||
|
|
||||||
|
<!---
|
||||||
|
grep --no-filename "^[ ]*git diff" docs/ja/*.md | sh
|
||||||
|
original document: 85041ff05:docs/i2c_driver.md
|
||||||
|
git diff 85041ff05 HEAD -- docs/i2c_driver.md | cat
|
||||||
|
-->
|
||||||
|
|
||||||
|
QMK で使われる I2C マスタドライバには、MCU 間のポータビリティを提供するための一連の関数が用意されています。
|
||||||
|
|
||||||
|
## 使用できる関数
|
||||||
|
|
||||||
|
| 関数 | 説明 |
|
||||||
|
|-------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
|
| `void i2c_init(void);` | I2C ドライバを初期化します。他のあらゆるトランザクションを開始する前に、この関数を一度だけ呼ぶ必要があります。 |
|
||||||
|
| `uint8_t i2c_start(uint8_t address, uint16_t timeout);` | I2C トランザクションを開始します。アドレスは方向ビットのない7ビットスレーブアドレスです。 |
|
||||||
|
| `uint8_t i2c_transmit(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout);` | I2C 経由でデータを送信します。アドレスは方向ビットのない7ビットスレーブアドレスです。トランザクションのステータスを返します。 |
|
||||||
|
| `uint8_t i2c_receive(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout);` | I2C 経由でデータを受信します。アドレスは方向ビットのない7ビットスレーブアドレスです。 `length` で指定した長さのバイト列を `data` に保存し、トランザクションのステータスを返します。 |
|
||||||
|
| `uint8_t i2c_writeReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout);` | `i2c_transmit` と同様ですが、 `regaddr` でスレーブのデータ書き込み先のレジスタを指定します。 |
|
||||||
|
| `uint8_t i2c_readReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout);` | `i2c_receive` と同様ですが、 `regaddr` でスレーブのデータ読み込み先のレジスタを指定します。 |
|
||||||
|
| `uint8_t i2c_stop(void);` | I2C トランザクションを終了します。 |
|
||||||
|
|
||||||
|
### 関数の戻り値
|
||||||
|
|
||||||
|
`void i2c_init(void)` を除く上にあるすべての関数は、次の真理値表にある値を返します。
|
||||||
|
|
||||||
|
| 戻り値 | 説明 |
|
||||||
|
|--------|------------------------------|
|
||||||
|
| 0 | 処理が正常に実行されました。 |
|
||||||
|
| -1 | 処理に失敗しました。 |
|
||||||
|
| -2 | 処理がタイムアウトしました。 |
|
||||||
|
|
||||||
|
## AVR
|
||||||
|
|
||||||
|
### 設定
|
||||||
|
|
||||||
|
I2Cマスタドライバを設定するために、次の定義が使えます。
|
||||||
|
|
||||||
|
| 変数 | 説明 | 既定値 |
|
||||||
|
|---------|---------------------|--------|
|
||||||
|
| `F_SCL` | クロック周波数 (Hz) | 400KHz |
|
||||||
|
|
||||||
|
|
||||||
|
AVR は通常 I2C ピンとして使う GPIO が設定されているので、これ以上の設定は必要ありません。
|
||||||
|
|
||||||
|
## ARM
|
||||||
|
|
||||||
|
ARM の場合は、内部に ChibiOS I2C HAL ドライバがあります。この節では STM32 MCU を使用していると仮定します。
|
||||||
|
|
||||||
|
### 設定
|
||||||
|
|
||||||
|
ARM MCU 用の設定はしばしば非常に複雑です。これは、多くの場合複数の I2C ドライバをさまざまなポートに対して割り当てられるためです。
|
||||||
|
|
||||||
|
最初に、必要なハードウェアドライバを有効にするために `mcuconf.h` ファイルをセットアップします。
|
||||||
|
|
||||||
|
| 変数 | 説明 | 既定値 |
|
||||||
|
|-------------------------------|------------------------------------------------------------------------------------------------|--------|
|
||||||
|
| `#STM32_I2C_USE_XXX` | ハードウェアドライバ XXX の有効化/無効化(すべてのドライバを明示的にリストアップする必要あり) | FALSE |
|
||||||
|
| `#STM32_I2C_BUSY_TIMEOUT` | レスポンスの受信がない場合に I2C コマンドを中断するまでの時間 (ms) | 50 |
|
||||||
|
| `#STM32_I2C_XXX_IRQ_PRIORITY` | ハードウェアドライバ XXX の割り込み優先度(上級者向けの設定) | 10 |
|
||||||
|
| `#STM32_I2C_USE_DMA` | MCU がデータ送信を DMA ユニットにオフロードする機能の有効化/無効化 | TRUE |
|
||||||
|
| `#STM32_I2C_XXX_DMA_PRIORITY` | ハードウェアドライバ XXX に使用する DMA ユニットの優先度(上級者向けの設定) | 1 |
|
||||||
|
|
||||||
|
次に `halconf.h` ファイル内で `#define HAL_USE_I2C` を `TRUE` にします。これにより ChibiOS が I2C ドライバを読み込みます。
|
||||||
|
|
||||||
|
最後に、使用したい I2C ハードウェアドライバに応じて正しい GPIO ピンを割り当てます。
|
||||||
|
|
||||||
|
標準では I2C1 ハードウェアドライバが使われます。もし他のハードウェアドライバを使う場合、 `config.h` ファイルに `#define I2C_DRIVER I2CDX` を追加します( X は使用するハードウェアドライバの番号です)。例えば I2C3 を有効化する場合、`config.h` ファイルに `#define I2C_DRIVER I2CD3` と定義します。これにより QMK I2C ドライバと ChibiOS I2C driver が同期されます。
|
||||||
|
|
||||||
|
STM32 MCU では、使用するハードウェアドライバにより、さまざまなピンを I2C ピンとして設定できます。標準では `B6`, `B7` ピンが I2C 用のピンです。 I2C 用のピンを設定するために次の定義が使えます:
|
||||||
|
|
||||||
|
| 変数 | 説明 | 既定値 |
|
||||||
|
|-----------------------|--------------------------------------------------------------------------------------------------|---------|
|
||||||
|
| `I2C1_SCL_BANK` | SCL に使うピンのバンク (`GPIOA`, `GPIOB`, `GPIOC`) | `GPIOB` |
|
||||||
|
| `I2C1_SDA_BANK` | SDA に使うピンのバンク (`GPIOA`, `GPIOB`, `GPIOC`) | `GPIOB` |
|
||||||
|
| `I2C1_SCL` | SCL のピン番号 (0-9) | `6` |
|
||||||
|
| `I2C1_SDA` | SDA のピン番号 (0-9) | `7` |
|
||||||
|
| `I2C1_BANK`(非推奨) | 使用するピンのバンク (`GPIOA`, `GPIOB`, `GPIOC`)。後継は `I2C1_SCL_BANK`, `I2C1_SDA_BANK` です。 | `GPIOB` |
|
||||||
|
|
||||||
|
ChibiOS I2C ドライバの設定項目は STM32 MCU の種類に依存します。
|
||||||
|
|
||||||
|
STM32F1xx, STM32F2xx, STM32F4xx, STM32L0xx, STM32L1xx では I2Cv1 が使われます。
|
||||||
|
STM32F0xx, STM32F3xx, STM32F7xx, STM32L4xx では I2Cv2 が使われます。
|
||||||
|
|
||||||
|
#### I2Cv1
|
||||||
|
|
||||||
|
STM32 MCU の I2Cv1 では、クロック周波数とデューティ比を次の変数で変更できます。詳しくは <https://www.playembedded.org/blog/stm32-i2c-chibios/#I2Cv1_configuration_structure> を参照してください。
|
||||||
|
|
||||||
|
| 変数 | 既定値 |
|
||||||
|
|--------------------|------------------|
|
||||||
|
| `I2C1_OPMODE` | `OPMODE_I2C` |
|
||||||
|
| `I2C1_CLOCK_SPEED` | `100000` |
|
||||||
|
| `I2C1_DUTY_CYCLE` | `STD_DUTY_CYCLE` |
|
||||||
|
|
||||||
|
#### I2Cv2
|
||||||
|
|
||||||
|
STM32 MCU の I2Cv2 では、信号のタイミングパラメータを次の変数で変更できます。詳しくは <https://www.st.com/en/embedded-software/stsw-stm32126.html> を参照してください。
|
||||||
|
|
||||||
|
| 変数 | 既定値 |
|
||||||
|
|-----------------------|--------|
|
||||||
|
| `I2C1_TIMINGR_PRESC` | `15U` |
|
||||||
|
| `I2C1_TIMINGR_SCLDEL` | `4U` |
|
||||||
|
| `I2C1_TIMINGR_SDADEL` | `2U` |
|
||||||
|
| `I2C1_TIMINGR_SCLH` | `15U` |
|
||||||
|
| `I2C1_TIMINGR_SCLL` | `21U` |
|
||||||
|
|
||||||
|
STM32 MCU では GPIO ピンを設定するとき、別の「代替機能」モードを使うことができます。これは I2Cv2 モードで使われるピンを変更するために必要です。適切な設定値は、使用している MCU のデータシートを参照してください。
|
||||||
|
|
||||||
|
| 変数 | 既定値 |
|
||||||
|
|---------------------|--------|
|
||||||
|
| `I2C1_SCL_PAL_MODE` | `4` |
|
||||||
|
| `I2C1_SDA_PAL_MODE` | `4` |
|
||||||
|
|
||||||
|
#### その他
|
||||||
|
|
||||||
|
`void i2c_init(void)` 関数は `weak` 属性が付いており、オーバーロードすることができます。この場合、上記で設定した変数は使用されません。可能な GPIO の設定については、 MCU のデータシートを参照してください。次に示すのは初期化関数の例です:
|
||||||
|
|
||||||
|
```C
|
||||||
|
void i2c_init(void)
|
||||||
|
{
|
||||||
|
setPinInput(B6); // Try releasing special pins for a short time
|
||||||
|
setPinInput(B7);
|
||||||
|
wait_ms(10); // Wait for the release to happen
|
||||||
|
|
||||||
|
palSetPadMode(GPIOB, 6, PAL_MODE_ALTERNATE(4) | PAL_STM32_OTYPE_OPENDRAIN | PAL_STM32_PUPDR_PULLUP); // Set B6 to I2C function
|
||||||
|
palSetPadMode(GPIOB, 7, PAL_MODE_ALTERNATE(4) | PAL_STM32_OTYPE_OPENDRAIN | PAL_STM32_PUPDR_PULLUP); // Set B7 to I2C function
|
||||||
|
}
|
||||||
|
```
|
||||||
@@ -40,25 +40,4 @@ const uint8_t CIE1931_CURVE[256] PROGMEM = {
|
|||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef USE_LED_BREATHING_TABLE
|
|
||||||
const uint8_t LED_BREATHING_TABLE[256] PROGMEM = {
|
|
||||||
0, 0, 0, 0, 1, 1, 1, 2, 2, 3, 4, 5, 5, 6, 7, 9,
|
|
||||||
10, 11, 12, 14, 15, 17, 18, 20, 21, 23, 25, 27, 29, 31, 33, 35,
|
|
||||||
37, 40, 42, 44, 47, 49, 52, 54, 57, 59, 62, 65, 67, 70, 73, 76,
|
|
||||||
79, 82, 85, 88, 90, 93, 97, 100, 103, 106, 109, 112, 115, 118, 121, 124,
|
|
||||||
127, 131, 134, 137, 140, 143, 146, 149, 152, 155, 158, 162, 165, 167, 170, 173,
|
|
||||||
176, 179, 182, 185, 188, 190, 193, 196, 198, 201, 203, 206, 208, 211, 213, 215,
|
|
||||||
218, 220, 222, 224, 226, 228, 230, 232, 234, 235, 237, 238, 240, 241, 243, 244,
|
|
||||||
245, 246, 248, 249, 250, 250, 251, 252, 253, 253, 254, 254, 254, 255, 255, 255,
|
|
||||||
255, 255, 255, 255, 254, 254, 254, 253, 253, 252, 251, 250, 250, 249, 248, 246,
|
|
||||||
245, 244, 243, 241, 240, 238, 237, 235, 234, 232, 230, 228, 226, 224, 222, 220,
|
|
||||||
218, 215, 213, 211, 208, 206, 203, 201, 198, 196, 193, 190, 188, 185, 182, 179,
|
|
||||||
176, 173, 170, 167, 165, 162, 158, 155, 152, 149, 146, 143, 140, 137, 134, 131,
|
|
||||||
128, 124, 121, 118, 115, 112, 109, 106, 103, 100, 97, 93, 90, 88, 85, 82,
|
|
||||||
79, 76, 73, 70, 67, 65, 62, 59, 57, 54, 52, 49, 47, 44, 42, 40,
|
|
||||||
37, 35, 33, 31, 29, 27, 25, 23, 21, 20, 18, 17, 15, 14, 12, 11,
|
|
||||||
10, 9, 7, 6, 5, 5, 4, 3, 2, 2, 1, 1, 1, 0, 0, 0
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// clang-format on
|
// clang-format on
|
||||||
@@ -23,8 +23,4 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
extern const uint8_t CIE1931_CURVE[] PROGMEM;
|
extern const uint8_t CIE1931_CURVE[] PROGMEM;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef USE_LED_BREATHING_TABLE
|
|
||||||
extern const uint8_t LED_BREATHING_TABLE[] PROGMEM;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -29,7 +29,6 @@ HARDWARE_OPTION_NAMES = \
|
|||||||
HD44780_ENABLE \
|
HD44780_ENABLE \
|
||||||
ENCODER_ENABLE \
|
ENCODER_ENABLE \
|
||||||
LCD_ENABLE \
|
LCD_ENABLE \
|
||||||
LED_BREATHING_TABLE \
|
|
||||||
LED_TABLES \
|
LED_TABLES \
|
||||||
POINTING_DEVICE_ENABLE \
|
POINTING_DEVICE_ENABLE \
|
||||||
VISUALIZER_ENABLE \
|
VISUALIZER_ENABLE \
|
||||||
|
|||||||
Reference in new issue
Block a user