insmod 실행 시 unknown symbol 에러
가끔 모듈을 컴파일 하여 insmod로 추가할 때 unknown symbol 에러로 추가가 안 될 경우가 있다. xpad.c를 따라할 때 해당 함수를 찾아 지우고 했지만, 이번 sensehat을 사용하려는 기본 함수는 지울 수 없어 이유를 찾아야 했다.
[ 8890.395611] sensehat_core: loading out-of-tree module taints kernel. [ 8890.395805] sensehat_core: Unknown symbol __devm_regmap_init_i2c (err -2) [ 8903.630685] sensehat_core: Unknown symbol __devm_regmap_init_i2c (err -2) [ 9094.432329] sensehat_core: Unknown symbol __devm_regmap_init_i2c (err -2) [ 9232.390045] sensehat_core: Unknown symbol __devm_regmap_init_i2c (err -2)
결과적으로 devm_regmap_init_i2c를 사용하려면 먼저 regmap_i2c를 로딩해야 하는데, 이 작업을 하지 않아 그렇다. 부팅한 버전과 일치하는regmap-i2c.ko를 찾아 insmod regmap-i2c.ko로 먼저 로딩해야 한다.
어떤 모듈이 미리 필요한지 알기 위해서는 해당 모듈을 lib/modules/”부팅버전”에 복사하고 depmod -a로 의존성 확인을 먼저 해야 한다. modprobe로 내가 원하는 모듈을 로딩하면 의존성을 확인하여 같이 로딩한다.
매번 수정되는 드라이버를 modprobe로 로딩하기 귀찮으니, 해당 파일이 부팅 때 자동으로 로딩 되도록 수정한다.
pi@raspberrypi:/etc/modules-load.d $ pwd /etc/modules-load.d pi@raspberrypi:/etc/modules-load.d $ cat modules.conf # /etc/modules: kernel modules to load at boot time. # # This file contains the names of kernel modules that should be loaded # at boot time, one per line. Lines beginning with "#" are ignored. i2c-dev #sensehat_core를 사용하기 위한 모듈 선 로딩 regmap_i2c
이제 sensehat을 가지고 놀 준비가 되었다.