
Jetson Xavier NXã®GPIOã䜿ã£ããã«ã¹é床ã100åéã«ããŠã¿ã
IoTã§çšãããšããžã³ã³ãã¥ãŒã¿ãŒãšããŠã¯Raspberry Piãå®çªã§ãããç»ååŠçãåæãšããå Žåã¯NVIDIAã®Jetsonã·ãªãŒãºã®å©çšãå€ãã®ã§ã¯ãªãã§ããããã
ä»åã¯Jetsonã·ãªãŒãºã®ãªãã§ããäŸ¡æ Œæ§èœæ¯ã®é«ãJetson Xavier NXã§ã¢ãŒã¿ãŒãåããéã«èª¿ã¹ãGPIOã«ã€ããŠæžããŠãããããšæããŸãã
ã¢ãŒã¿ãŒ
ã¹ãããã³ã°ã¢ãŒã¿ãŒ
ãšããžã³ã³ãã¥ãŒã¿ãŒåŽã§ã»ã³ã·ã³ã°ããçµæãšããŠãç©ççãªåããããããå ŽåããããŸãããããªæããªãŒãã³ã«ãŒãå¶åŸ¡ã§äœ¿ããã¹ãããã³ã°ã¢ãŒã¿ãŒããšãŠã䟿å©ã§ãã
ã¹ãããã³ã°ã¢ãŒã¿èªäœã«ã€ããŠã¯ãæžç±ããŠã§ããµã€ãã«äžå¯§ãªè§£èª¬ããããŸãã®ã§ããã¡ããã芧ããã ããšããŠãããã§ã¯èãšãªããã«ã¹ã«ã€ããŠã
ãã«ã¹
黿°ä¿¡å·ã®ã¬ãã«ãH, Lãšç¹°ãè¿ããããã®ã§ãã
ãã®H, Lã®1ãµã€ã¯ã«ã1ãã«ã¹ãšæ°ããŸããã¹ãããã³ã°ã¢ãŒã¿ãŒã®å Žåã1ãã«ã¹å
¥åãããæ¯ã«1ã¹ãããåã®è§åºŠã ãã¢ãŒã¿ãŒãå転ããŸãã
ã€ãŸãããã®ãã«ã¹ã綺éºã«ãããŠèªç±ã«å¶åŸ¡ããããšããã¹ãããã³ã°ã¢ãŒã¿ãŒãå©çšããããã«ã¯éèŠãªããšã«ãªããŸãã
ãã€ã¯ãã¹ããã
ã¹ãããã³ã°ã¢ãŒã¿ãŒã¯1ãã«ã¹ã§ã¹ãããè§åºŠã ãå転ããã®ã§ãããã¢ãŒã¿ãŒã®ã³ã€ã«ã«æµã黿µãå¶åŸ¡ããããšã§ãã¹ãããè§åºŠã现ååããããšãã§ãããããã£ãå¶åŸ¡æ¹æ³ããã€ã¯ãã¹ãããå¶åŸ¡ãšãããŸãã
ãã€ã¯ãã¹ãããå¶åŸ¡ãè¡ããã¢ãŒã¿ãŒãã©ã€ãã䜿ãããã«ã¯ãããé«ãåšæ³¢æ°ã§ãã«ã¹ãçæã§ããããã«ããŠããå¿
èŠããããŸãã
GPIOã䜿ã£ãŠã¿ã
GPIO
æšä»ã®ãšããžã³ã³ãã¥ãŒã¿ãŒ(ãããã¯ãSingle Board Computer)ã®å€ãã¯ãRaspberry Piã®æåãåããŠã40ãã³ã®ãã³ããããèšãããããã³ã«ã¯SoC(System on Chip)ã®åçš®æ©èœãå²ãåœãŠãããŠããŸãããããŠãããã«ã¯ãGeneral Purpose Input/Output (GPIO)ããšããæ±çšå ¥åºåããŒããå¿ ããšèšã£ãŠããã»ã©å²ãåœãŠãããŠããŸãã
æ±çšãšè¬³ãããŠããéããèšå®æ¬¡ç¬¬ã§å ¥åã«ãåºåã«ãããã«ã¢ãã, ãã«ããŠã³, ã¹ãªãŒã¹ããŒãããšããžããªã¬ãŒ, ã¬ãã«ããªã¬ãŒãªã©ãå©çšç®çã«ãã£ãèšå®ãããããšãå¯èœã§ãã
ãã®GPIOãããã°ã©ã åŽã§é©åã«èšå®ãé§åããããšã§ãåè¿°ã®ãã«ã¹ãçºçãããããšãã§ããŸãã
Jetson.GPIO
Raspberry Piã®Pythonã©ã€ãã©ãªã§èåãªRPi.GPIOäºæã®Pythonã©ã€ãã©ãªããNVIDIAã«ãã£ãŠäœæããå ¬éãããŠããŸãã
ããã±ãŒãžã§ãååšããŠããŠã以äžã®ããã«ããŠã€ã³ã¹ããŒã«ããŸãã
$ sudo apt install python3-jetson-gpioã©ã®çšåºŠã®ãã«ã¹ãåºããããç°¡åãªã³ãŒãã§ç¢ºèªããŠã¿ãŸã(察象ã¯12çªãã³ãšããŠããŸã)ã
import RPi.GPIO as GPIO
pin = 12
def main():
GPIO.setmode(GPIO.BOARD)
GPIO.setup(pin, GPIO.OUT)
try:
while True:
GPIO.output(pin, GPIO.HIGH)
GPIO.output(pin, GPIO.LOW)
finally:
GPIO.cleanup()
if __name__ == '__main__':
main()ãŸãã¯ãPower modeã10w 2coreã«èšå®ããŠèšæž¬ãåšæ³¢æ°ã¯çŽ13.5kHzãšãã¿ããçµæã«ã

Power modeãCPUã®é§ååšæ³¢æ°ãäžçªé«ããªã20w 2coreã«ããŠãçŽ16.8kHzãš2å²çšåºŠã®æ¹åã«ãšã©ãŸããŸããã

C++ã§ããã€ã¹ãã¡ã€ã«ãçŽæ¥I/O
ç°¡åã«ãã«ã¹ãçæãããããšãã§ããPythonã§ãããåšæ³¢æ°ã¯ããªãäœãã§ãããããã§ãC++ã§GPIOã®ããã€ã¹ãã¡ã€ã«ãçŽæ¥å©çšããŠã¿ãŸãã
èªåã§ããå Žåã¯ã12çªãã³ã«å¯Ÿå¿ããsysfsã«ãããçªå·ãç¥ãå¿ èŠããããŸãããã¡ããšèª¿ã¹ãã¹ãã§ãããæãæããŠåè¿°ã®Pythonã³ãŒããå®è¡ããŠèª¿ã¹ãŸãã
$ strace python3 gpio.py äžèšã®ããã«å®è¡ãã/sys/class/gpio/export ãã¡ã€ã«ã«ã©ããªå€ãæžã蟌ãã§ãããã確èªããŸãã
openat(AT_FDCWD, "/sys/class/gpio/export", O_WRONLY|O_CREAT|O_TRUNC|O_CLOEXEC, 0666) = 3
fstat(3, {st_mode=S_IFREG|0220, st_size=4096, ...}) = 0
ioctl(3, TCGETS, 0x7fcfb2ee50) = -1 ENOTTY (Inappropriate ioctl for device)
lseek(3, 0, SEEK_CUR) = 0
ioctl(3, TCGETS, 0x7fcfb2ee50) = -1 ENOTTY (Inappropriate ioctl for device)
lseek(3, 0, SEEK_CUR) = 0
lseek(3, 0, SEEK_CUR) = 0
write(3, "445", 3) = 3
ã445ããæžãåºããŠããã®ã§ã12çªãã³ã«å¯Ÿå¿ããããã€ã¹ãã¡ã€ã«ã¯ã/sys/class/gpio/gpio445ãé
äžã®ãã¡ã€ã«ãšãªããŸãã
ãã®æ
å ±ãããšã«ããã«ã¹ãçæããã³ãŒãã§ãã
#include <cstdint>
#include <cstring>
#include <fcntl.h>
#include <iostream>
#include <signal.h>
#include <stdexcept>
#include <sys/param.h>
#include <unistd.h>
class GPIOPin {
public:
GPIOPin(int pin) : pin_(pin), value_fd_(0), direction_fd_(0) {
try {
export_pin(pin_);
} catch (std::exception& e) {
throw;
}
char value_path[MAXPATHLEN];
char direction_path[MAXPATHLEN];
snprintf(value_path, sizeof(value_path), "/sys/class/gpio/gpio%d/value", pin_);
snprintf(direction_path, sizeof(direction_path), "/sys/class/gpio/gpio%d/direction", pin_);
value_fd_ = open(value_path, O_RDWR);
direction_fd_ = open(direction_path, O_RDWR);
}
~GPIOPin() {
try {
unexport_pin(pin_);
} catch (std::exception& e) {
std::cerr << e.what() << std::endl;
}
}
void setup(bool output) {
if (output) {
write(direction_fd_, "out\n", 4);
} else {
write(direction_fd_, "in\n", 3);
}
}
void high() { write(value_fd_, "1\n", 2); }
void low() { write(value_fd_, "0\n", 2); }
private:
void export_pin(int pin) {
const char *kEXPORT_PATH = "/sys/class/gpio/export";
int fd = open(kEXPORT_PATH, O_WRONLY);
char msgbuf[32];
snprintf(msgbuf, sizeof(msgbuf), "%d\n", pin);
write(fd, msgbuf, strlen(msgbuf));
close(fd);
}
void unexport_pin(int pin) {
const char *kUNEXPORT_PATH = "/sys/class/gpio/unexport";
int fd = open(kUNEXPORT_PATH, O_WRONLY);
char msgbuf[32];
snprintf(msgbuf, sizeof(msgbuf), "%d\n", pin);
write(fd, msgbuf, strlen(msgbuf));
close(fd);
}
private:
int pin_;
int value_fd_;
int direction_fd_;
};
volatile int interrupted = 0;
void signal_handler(int signo) {
interrupted = 1;
}
int main(int argc, char** argv) {
try {
signal(SIGINT, signal_handler);
GPIOPin pin(445);
pin.setup(true);
while (!interrupted) {
pin.high();
pin.low();
}
} catch (std::exception& e) {
std::cout << e.what() << std::endl;
}
}Power modeã10w 2coreãš20w 2coreã§è¡ã£ããšãããããããçŽ287kHz, çŽ326kHzãš20åãããæ¹åããŸããã


ãã£ãšé«éã«
GPIOã¯OS(ä»åã¯Linux)ã管çããŠããè³æºã§ãOSãçµç±ããŠGPIOãå©çšããéãã¯ãã以äžã®é床æ¹åãèŠèŸŒããŸããã
ãŠãŒã¶ãŒç©ºéã®ããã°ã©ã ã§ãããªãæ¹åãç®æãå Žåã®ææ³ãšããŠãGPIOé¢é£ã®å¶åŸ¡ã¬ãžã¹ã¿ãmmap(2)ã§ãŠãŒã¶ãŒç©ºéã«ããããããã®ã¬ãžã¹ã¿ãçŽæ¥æäœãããšãããã®ããããŸãã
Raspberry PiãJetson Nanoã¯å©çšãŠãŒã¶ãŒãå€ããããã¬ãžã¹ã¿ã®ã¢ãã¬ã¹ãèšå®ãªã©ã®æ å ±ã¯ç°¡åã«ã¿ã€ãããŸãããJetson Xavier NXã¯ãŠãŒã¶ãŒãå°ãªãããã§æ å ±ãèŠã€ãããŸããã§ããã
ããã§ã¯ãé¢é£ããå¶åŸ¡ã¬ãžã¹ã¿ãªã©ã®æ¢ãæ¹ãæžããŠãããããšæããŸãã
èª¿æ»æ¹æ³
å¿ èŠãªæ å ±ã®åé
Jetson Download Centerã«è¡ããããã€ãã®è³æãå ¥æããŸãã
Xavier Series SoC Technical Reference Manual (Xavier_TRM_DP09253002_v1.4p.pdf)
Jetson Xavier NX Developer Kit Carrier Board Specification(Jetson_Xavier_NX_DevKit_Carrier_Board_Specification_v1.0.pdf)
Jetson Xavier NX Pinmux Table(Jetson_Xavier_NX_Pinmux_Configuration_Template_v1.06.xlsm)
è³æã®ã»ãã«ãœãŒã¹ã³ãŒãçãå ¥æããŠãããŸãã
Driver Package (Jetson_Linux_R35.2.1_aarch64.tbz2)
Driver Package (BSP) Sources (public_sources.tbz2)
12çªãã³
ä»åã¯12çªãã³ã䜿ããŸãã®ã§ããŸãã¯äœãå²ãåœãŠãããŠããããJetson_Xavier_NX_DevKit_Carrier_Board_Specification_v1.0.pdfã®ã3.3 40-Pin Expansion Headerãã«ããå³ãšè¡šãã確èªããŸãã
ãFigure 3-1. Expansion Header Connectionsã
ãTable 3-3. Expansion Header Pin Description â J12ã
12çªãã³ã¯ãI2S0_SCLKããšããååã§ãããSoCãšããŠã¯ãDAP5_SCLKããšãããã³ã«ãªã£ãŠãããæšæºã§ã¯ãè€æ°æ©èœã®ãã¡GPIOãå²ãåœãŠãããŠããŠããPT.05ããšããGPIOã察å¿ããŠããããšãããããŸãã
è€æ°æ©èœããGPIOãéžæããããã®ã¬ãžã¹ã¿ã®ã¢ãã¬ã¹ãGPIOã§åºåãã§ããããã«ããããã®ã¬ãžã¹ã¿ã®ã¢ãã¬ã¹ããããŠãé©åãªåäœããããããã®èšå®æ¹æ³ã調ã¹ãããšã«ãªããŸãã
ã¬ãžã¹ã¿ã®ã¢ãã¬ã¹
æ£ããæé ã¯Xavier_TRM_DP09253002_v1.4p.pdfã®ä»¥äžã®ç« ãèªãã§ãªã®ã§ãããããã§ã¯æãæããæ¹æ³ãèšèŒããŸãã
3.1.2 System Address Map
8.5.3 Programming Guidelines
æé ãšããŠã¯ä»¥äžã®ããã«ãªããŸãã
Jetson_Xavier_NX_Pinmux_Configuration_Template_v1.06.xlsmã§Device Treeçšã®æ å ±ãçæ
Driver Packageã«å«ãŸããŠããã¹ã¯ãªããã§æ©èœå²ãåœãŠ(PinMux)ã®ã¬ãžã¹ã¿ã®ã¢ãã¬ã¹ãšGPIOã®ã¬ãžã¹ã¿ã®ã¢ãã¬ã¹ãçæ
Jetson_Xavier_NX_Pinmux_Configuration_Template_v1.06.xlsmã®ã·ãŒããJetson_Xavier_NX_ModuleããéããŸãã12çªãã³ã®ååãI2S0_SCLKãã®è¡ãèŠããšãCarrier Boardã®PDFãã¡ã€ã«ã«èšèŒãããŠããããã«ãGPIOãšããŠãGPIO3_PT.05ããå²ãåœãããšãªã£ãŠããŸãã
PinMuxçšæ
å ±ã®çæã¯ãAVåä»è¿ã«ãããGenerate DT FileããæŒäžããŸãããããã¢ãããŠã€ã³ããŠãåºãŠãWould you like to generate device tree file for pinmux table?ããšèãããŸãã®ã§ãã¯ãããæŒäžããŸãã
ãã®åŸãBoard NameããäºåèãããŸãã®ã§ãé©åœãªåãååãäºåå
¥åãããšã以äžã®3ãã¡ã€ã«ãçæãããŸãã
tegra19x-ããŒãå-gpio-default.dtsi
tegra19x-ããŒãå-padvoltage-default.dtsi
tegra19x-ããŒãå-pinmux.dtsi
次ã¯ãDriver Packageã®Jetson_Linux_R35.2.1_aarch64.tbz2ãå±éãããLinux_for_Tegra/kernel/pinmux/t19xãã«ãã倿ã¹ã¯ãªããpinmux-dts2cfg.pyãå ã»ã©çæãããŠããã¡ã€ã«ãæå®ããŠå®è¡ããŸããã¹ã¯ãªããã®äœ¿ãæ¹ã¯ãåããã£ã¬ã¯ããªãŒå ã®README.txt ã«æžãããŠããŸãã
$ bzip2 -cd Jetson_Linux_R35.2.1_aarch64.tbz2 | tar xf -
$ cd Linux_for_Tegra/kernel/pinmux/t19x
$ python pinmux-dts2cfg.py --pinmux addr_info.txt gpio_addr_info.txt por_val.txt --mandatory_pinmux_file mandatory_pinmux.txt tegra19x-XXXX-pinmux.dtsi tegra19x-XXXX-gpio-default.dtsi 1.0 > pinmux.cfgã¹ã¯ãªããã幟ã€ãã®ãšã©ãŒãå ±åããŸãããæ°ã«ãããªãã€ã¬ã¯ããããã¡ã€ã«ãéãããGPIO3_PT.05ãã«å¯Ÿå¿ããéšåãåç §ããŸãã
pinmux.0x022138a0 = 0x00000001; # CONFIG T5
pinmux.0x02431080 = 0x00000000; # GPIO dap5_sclk_pt5äžèšã®ããã«åºåãããŠãããšæããŸãã
ã³ã¡ã³ããšããŠãCONFIT T5ããã€ããŠããæ¹ãGPIOãå¶åŸ¡ããããã®ã¬ãžã¹ã¿ã®ã¢ãã¬ã¹ããGPIO dap5_sclk_pt5ãã®ã³ã¡ã³ããã€ããŠããæ¹ãPinMuxã®ã¬ãžã¹ã¿ã®ã¢ãã¬ã¹ãšãªããŸãã
ã¬ãžã¹ã¿ãžã®èšå®å€
ã¬ãžã¹ã¿ã®ã¢ãã¬ã¹ã¯ããããŸããããææã®åäœããããããã«äœãæžã蟌ãã°è¯ããã§ãã
PinMuxã®æ¹ã¯ã説æãçããŸããXavier_TRM_DP09253002_v1.4p.pdfã®ã8.5.4.2 Audio PAD Control Registersãã«ãããPADCTL_AUDIO_DAP5_SCLK_0ããããã«åœãããåºåçšã®GPIOãšããŠæ©èœãããããã«ã¯åãããã以äžã®ããã«ããŸãã
ã·ã¥ãããããªã¬ãŒ: DISABLE
GPIOãšSFIOã®éžæ: GPIO
å ¥å: DISABLE
ãã©ã€ã¹ããŒã: PASSTHROUGH
ãã«ã¢ãã,ãã«ããŠã³æå®: NONE
PMæå®: ããã©ã«ãã®I2S5
çµå±ã0x00000000(0bxxxx,xxxx,xxxx,xxxx,xxx0,x0x0,x0x0,0000)ãšãªããŸãã
GPIOã®æ¹ã¯ãDriver Package (BSP) Sourcesãå±éãããã®äžã®gpio-tegra186.cãåç
§ããŸãã
åé¡ã®gpio-tegra186.cã¯ãLinux_for_Tegra/source/public/kernel/kernel-5.10/drivers/gpioå
ã«ãããŸãã
$ bzip2 -cd public_sources.tbz2 | tar xf -
$ cd Linux_for_Tegra/source/public/kernel/kernel-5.10/drivers/gpio
$ ls gpio-tegra186.c颿°tegra186_gpio_direction_outputãèªããšãåºåã§ããããã«ããã«ã¯
ã¢ãã¬ã¹ïŒTEGRA186_GPIO_OUTPUT_CONTROL(0x0C)ã®
ãããTEGRA186_GPIO_OUTPUT_CONTROL_FLOATED(0x00)ã0ã«ããŠ
ã¢ãã¬ã¹+TEGRA186_GPIO_ENABLE_CONFIG(0x00)ã®
ãããTEGRA186_GPIO_ENABLE_CONFIG_ENABLE(0x0)ãš
ãããTEGRA186_GPIO_ENABLE_CONFIG_OUT(0x1)ã®äºã€ã1ã«ããã°ãããšåãããŸãã
颿°tegra186_gpio_setãèªããš
ã¢ãã¬ã¹+TEGRA186_GPIO_OUTPUT_VALUE(0x10)ã®
ãããTEGRA186_GPIO_OUTPUT_VALUE_HIGH(0x0)ã1ãšãããšHã
ãããTEGRA186_GPIO_OUTPUT_VALUE_HIGH(0x0)ã0ãšãããšLãåºåããããšåãããŸãã
å®è¡çµæ
å®è£
ã³ãŒãã¯é·ããªãã®ã§å²æããŸãããã¬ãžã¹ã¿ãé©å®ãããããã¬ãžã¹ã¿ã«å¯ŸããŠæå®ã®å€ãæžã蟌ãããã«ããŠå®è¡ããŸããã
çŽ1.37MHzãšãªããPythonã©ã€ãã©ãªã«å¯ŸããŠçŽ100åãŸã§æ¹åããŸãããã¡ãªã¿ã«ãPower mode 10w 2core ãš20w 2coreã§å·®ã¯ãªããããã«ããã¯ãCPUã§ã¯ãªããªã£ãŠããŸãã

æåŸã«
å®éã®äœ¿çšã«ããã£ãŠã¯ããœãããŠã§ã¢çã«ã¯ãšã©ãŒãã³ããªã³ã°ãåŸåŠçãå¿
èŠã§ãããŸããããŒããŠã§ã¢çã«ã¯ããããCarrier BoardããåºãŠãããã³ã¯ãã¢ãŒã¿ãŒãã©ã€ããŒãé§åããã ãã®é»æµãæµããŸããã®ã§ãã¢ãŒã¿ãŒãã©ã€ããŒã®ãã©ã€ããŒãªã©ãçšæããå¿
èŠããããŸãã
ããããªãããJetson_Xavier_NX_Pinmux_Configuration_Template_v1.06.xlsmã§ãã³ãžã®å²ãåœãŠãšããŠGPIOãéžæããŠãã¡ã€ã«ãçæããããšã§ãåæ§ã®æé ã§æ
å ±ãå
¥æãå©çšããããšãå¯èœãšãªããŸãã
説æã端æã£ãããæäŸãããŠãããã¯ããã¹ã¯ãªããã®å©çšãåæãšããŠãããããšçãããããŠããŸããŸããããJetson Xavier NXã®GPIOãå¶åŸ¡ããããã®æ å ±ãšãªãã°å¹žãã§ãã