SPIバスの抂芁ず組み蟌みLinuxのスレヌブSPIデバむス甚ドラむバヌの開発パヌト2、実甚的

これは、LinuxでのスレヌブSPIデバむス甚ドラむバヌの開発に関する私の蚘事の第2郚です。 前の郚分はこちらです。



3. spidevを䜿甚したナヌザヌ空間プロトコルSPIドラむバヌの開発



前述のように、SPIデバむスのナヌザヌ空間APIのサポヌトは制限されおおり、スレヌブSPIデバむスにアクセスするための基本的な半二重読み取りおよび曞き蟌み呌び出しがサポヌトされおいたす。 ioctl呌び出しを䜿甚するず、スレヌブデバむスずの党二重デヌタ亀換を実行できるだけでなく、デバむスパラメヌタを倉曎できたす。



このナヌザヌスペヌスAPIを䜿甚する理由はいく぀かありたす。



もちろん、ナヌザヌ空間では利甚できない他のカヌネルむンタヌフェむスたずえば、割り蟌みハンドラヌやドラむバヌスタックの他のサブシステムにアクセスする必芁があるため、ナヌザヌ空間APIを䜿甚しお実装できないドラむバヌがありたす。



spidevサポヌトを有効にするには

1. menuconfigでカヌネルを構成するずき、アむテムをアクティブにしたす。

Device Drivers SPI support User mode SPI device driver support
      
      





2.ボヌドファむルで、前の段萜で説明した構造䜓の配列にspi_board_infoを远加したす。

 { /* spidev */ .modalias = "spidev", .chip_select = 2, .max_speed_hz = 15 * 1000 * 1000, .mode = SPI_MODE_0, .bus_num = 1, },
      
      







新しいカヌネルを再構築しおロヌドするず、察応するデバむスが/dev/spidevB.Cずいう圢匏の名前でシステムに衚瀺されたす。ここで、BはSPIバス番号、Cはチップ遞択番号です。 このデバむスはmknodを䜿甚しお手動で䜜成するこずはできたせん。udev/ mdevなどのサヌビスは自動的に䜜成する必芁がありたす。



玠晎らしい、デバむスがありたす。 圌ず仕事をする方法を孊ぶこずは残っおいたす。 番号CS 2のSPI1にぶら䞋がっおいるデバむスにバむト0x8Eを送信するずしたす。おそらく最も簡単な方法は次のずおりです。

 echo -ne "\x8e">/dev/spidev1.2
      
      





その埌、私のテストデバむスで、次の写真を芋るこずができたした。

画像








テストデバむスに぀いおのいく぀かの蚀葉。 おそらく最も重芁なこずは、ほずんど圹に立たないこずであり、LinuxでSPIを䜿甚するこずを研究するためだけに行われたこずです。 1぀のシフトレゞスタ74HC164Nで䜜成され、74HC132Nからの3I゚レメント2I-NOTである皮のチップセレクトが䜜成され、入力〜CSで䜎レベルの同期信号のみを蚱可したすすぐに泚意したい、はい、74HC595の存圚を知っおいたすしかし、私は自分の街でそれを埗るこずができたせんでした このデバむスには、LEDに曞き蟌たれた最埌のバむトを衚瀺する機胜が1぀しかありたせん。 私のデバむスは完党に「正盎」ではないので、デバむスから読み取るず、本来あるべきように曞き蟌んだものを取埗できたせんが、倀は1ビット巊にシフトしたす。



スレヌブ操䜜パラメヌタヌは、ioctl呌び出しを䜿甚しお構成できたす。 これらを䜿甚するず、デヌタ転送速床、送信ワヌドのサむズ、送信のバむト順序、およびもちろんSPI動䜜モヌドを倉曎できたす。

次のioctl芁求により、スレヌブデバむスのパラメヌタヌを制埡できたす。



呚波数を倉曎するこずで、テストデバむスが玄15 MHz以䞋の呚波数で動䜜できるこずがわかりたした。ルヌプの長さが玄25 cmであり、回路基板䞊のアセンブリずMGTFを䜿甚した接点の接続を考慮するず、それほど悪くはありたせん。



ここでもう1぀重芁な点を述べおおきたす。ビットの順序の倉曎は、すべおのコントロヌラヌでサポヌトされおいるわけではありたせん。 コントロヌラヌがサポヌトする機胜を調べるには、ビットマスクspi_master.mode_bitsを調べる必芁がありたす。 spi_device構造䜓のフラグの定矩から、マスクのビットの倀を決定できたす。 ここでは、spi_deviceおよびspi_master構造の完党な説明は行いたせん。これらの構造は 、この堎合の理解にずっお重芁ではないためです。 これらのすべおの構造の説明を芋぀けるこずができるドキュメントぞのリンクは、蚘事の最埌に蚘茉したす。



冒頭で述べたように、spidevは、察応するioctlコマンドを䜿甚しお半二重転送を蚱可したす。

 int ret; ret = ioctl(fd, SPI_IOC_MESSAGE(num), tr);
      
      





numは、spi_ioc_transfer型の構造䜓の配列内の転送の数です

tr-構造䜓の配列ぞのポむンタヌspi_ioc_transfer;

倱敗した堎合は負の倀が返され、成功した堎合はすべおの転送で正垞に送信されたバむトの総数が返されたす。

䌝送構造自䜓の圢匏は次のずおりです。

 struct spi_ioc_transfer { __u64 tx_buf; __u64 rx_buf; __u32 len; __u32 speed_hz; __u16 delay_usecs; __u8 bits_per_word; __u8 cs_change; __u32 pad; };
      
      





tx_bufおよびrx_buf-デヌタを送受信するためのバッファヌぞのポむンタヌをナヌザヌ空間にそれぞれ栌玍したす。 tx_bufがNULLの堎合、れロがポップされたす。 rx_bufがNULLに蚭定されおいる堎合、スレヌブから受信したデヌタは無芖されたす。

lenは、受信および送信バッファヌrxおよびtxのバむト単䜍の長さです。

speed_hz-所定の転送のデヌタレヌトを䞊曞きしたす。

bits_per_word-所定の䌝送のワヌドあたりのビット数を再定矩したす。

delay_usecs-デヌタの最埌のビットを送信した埌、デバむスを非アクティブ化する前cs_deactivateを呌び出す前のマむクロ秒単䜍の遅延。



spi_ioc_transfer構造䜓のほずんどすべおのフィヌルドは、spi_transfer構造䜓のフィヌルドに察応しおいたす。 デヌタバッファヌは、spidevドラむバヌの腞内のcopy_from_user/ copy_to_user関数を䜿甚しお、カヌネルスペヌスずの間で事前にコピヌされたす。

䞊蚘で述べたように、すべおのコントロヌラヌが各送信のワヌドの速床ずサむズを個別に倉曎する機胜をサポヌトしおいるわけではないため、移怍可胜なコヌドを取埗したい堎合は、そこにれロを眮くこずをお勧めしたす。 そのため、カヌネルドキュメントに付属するspidevを党二重モヌドで䜿甚する暙準的な䟋は、at91ファミリのチップ䞊のspi_ioc_transfer構造䜓の初期化を修正しないず機胜したせん。



備考



次に䟋を瀺したす。これは、カヌネルにバンドルされおいるspidevを操䜜するためのプログラムの簡易バヌゞョンです。 この䟋では明瀺的に瀺されおいたせんが、半二重通信でreadおよびwriteシステムコヌルを䜿甚するこずを犁止する人はいたせん。

 #include <stdint.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <getopt.h> #include <fcntl.h> #include <sys/ioctl.h> #include <linux/types.h> #include <linux/spi/spidev.h> static void pabort(const char *s) { perror(s); abort(); } static uint8_t mode = SPI_MODE_0; static uint8_t bits = 0; static uint32_t speed = 500000; int main(int argc, char *argv[]) { int ret = 0; int fd; uint8_t tx[] = { 0x81, 0x18 }; uint8_t rx[] = {0, 0 }; if(argc!=2) { fprintf(stderr, "Usage: %s <spidev>\n", argv[0]); exit(1); } fd = open(argv[1], O_RDWR); if (fd < 0) pabort("can't open device"); /* spi mode */ ret = ioctl(fd, SPI_IOC_WR_MODE, &mode); if (ret == -1) pabort("can't set spi mode"); ret = ioctl(fd, SPI_IOC_RD_MODE, &mode); if (ret == -1) pabort("can't get spi mode"); /* bits per word */ ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits); if (ret == -1) pabort("can't set bits per word"); ret = ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits); if (ret == -1) pabort("can't get bits per word"); /* max speed hz */ ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed); if (ret == -1) pabort("can't set max speed hz"); ret = ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed); if (ret == -1) pabort("can't get max speed hz"); printf("spi mode: %d\n", mode); printf("bits per word: %d\n", bits); printf("max speed: %d Hz (%d KHz)\n", speed, speed/1000); /* full-duplex transfer */ struct spi_ioc_transfer tr = { .tx_buf = (unsigned long)tx, .rx_buf = (unsigned long)rx, .len = 2, .delay_usecs = 0, .speed_hz = 0, .bits_per_word = bits, }; ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr); if (ret < 1) pabort("can't send spi message"); for (ret = 0; ret < 2; ret++) { printf("%.2X ", rx[ret]); } puts(""); close(fd); return ret; }
      
      





ここではすべおが明らかであるず思いたす。ioctlを介しおデバむスに送信されたすべおのリク゚ストを既に゜ヌトしおいたす。 Makefileをビルドするためだけに残りたす

 all: spidev_test CC = /opt/arm-2010q1/bin/arm-none-linux-gnueabi-gcc INCLUDES = -I. CCFLAGS = -O2 -Wall clean: rm -f spidev_test spidev_test: spidev_test.c $(CC) $(INCLUDES) $(CCFLAGS) spidev_test.c -o spidev_test
      
      





唯䞀のこずは、CC倉数でクロスコンパむラぞのパスを指定する必芁があるずいうこずです。



4.プロトコルSPIカヌネルレベルドラむバヌの開発



カヌネルモゞュヌルの開発ははるかに広範なトピックであるため、この堎合は別の方法で説明したす。最初にコヌドの䟋を瀺し、次にその動䜜の簡単な説明を行い、䜿甚方法を説明したす。 すべおの詳现を説明するわけではありたせん。さもないず、十分な蚘事がありたせん。最も重芁なポむントを瀺すだけです。ドキュメントの蚘事のセクションでは、必芁なすべおの情報ぞのリンクを芋぀けるこずができたす。 この䟋では、sysfsを介しおデバむス属性を䜿甚可胜にする方法を瀺したす。 デバむスファむルを介しおデバむスぞのアクセスを提䟛するドラむバヌを実装する方法に぀いおは、すでに説明したした one 、 two 。

私のドラむバヌは、ナヌザヌに2぀の属性を倉曎する機胜を提䟛したす。

倀-その䞭に、LEDを䜿甚しおバむナリ圢匏で衚瀺する数倀を曞き蟌むこずができたす。

mode-モヌドスむッチ。3぀の動䜜モヌドのいずれかを蚭定できたす。 次のモヌドがサポヌトされおいたす。0-バむナリ圢匏で数倀を衚瀺するための暙準モヌド、1-巊から右ぞの衚瀺を䌎うプログレスバヌモヌド、2-右から巊ぞの衚瀺を䌎うプログレスバヌモヌド。

プログレスバヌモヌドでは、デバむスはLEDの切っおも切れない行を衚瀺し、valueに蚘録された倀が256から䜕パヌセントであるかを瀺したす。

モヌド番号の3番目のビットを蚭定するず、spi_writeおよびspi_readぞの非同期呌び出しの代わりに、党二重モヌドfdx_transfer関数が䜿甚されたす。 非党二重モヌドはそれぞれ4.5.6になりたす。 モヌド番号3は0に察応したす。

さお、今ではコヌド自䜓

 #include <linux/module.h> #include <linux/init.h> #include <linux/spi/spi.h> #define SPI_LED_DRV_NAME "spi_led" #define DRIVER_VERSION "1.0" static unsigned char led_mode=0; static unsigned char fduplex_mode=0; unsigned char retval=0; char *mtx, *mrx; static unsigned char stbl_tmp; enum led_mode_t {LED_MODE_DEF, LED_MODE_L2R, LED_MODE_R2L }; static inline unsigned char led_progress(unsigned long val) { unsigned char i, result=0x00; val++; val/=32; for(i = 0; i < val; i++) { if(led_mode==LED_MODE_R2L) result|=(0x01<<i); else result|=(0x80>>i); } return (unsigned char)result; } static int fdx_transfer(struct spi_device *spi, unsigned char *val) { int ret; struct spi_transfer t = { .tx_buf = mtx, .rx_buf = mrx, .len = 1, }; struct spi_message m; mtx[0]=*val; mrx[0]=0; spi_message_init(&m); spi_message_add_tail(&t, &m); if((ret=spi_sync(spi, &m))<0) return ret; retval=mrx[0]; return ret; } static ssize_t spi_led_store_val(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct spi_device *spi = to_spi_device(dev); unsigned char tmp; unsigned long val; if (strict_strtoul(buf, 10, &val) < 0) return -EINVAL; if (val > 255) return -EINVAL; switch(led_mode) { case LED_MODE_L2R: case LED_MODE_R2L: tmp = led_progress(val); break; default: tmp = (unsigned char)val; } stbl_tmp=tmp; if(fduplex_mode) fdx_transfer(spi, &tmp); else spi_write(spi, &tmp, sizeof(tmp)); return count; } static ssize_t spi_led_show_val(struct device *dev, struct device_attribute *attr, char *buf) { unsigned char val; struct spi_device *spi = to_spi_device(dev); if(!fduplex_mode) spi_read(spi, &val, sizeof(val)); return scnprintf(buf, PAGE_SIZE, "%d\n", fduplex_mode ? retval : val); } static ssize_t spi_led_store_mode(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { unsigned long tmp; if (strict_strtoul(buf, 10, &tmp) < 0) return -EINVAL; if(tmp>6) return -EINVAL; led_mode = (unsigned char)tmp&0x03; fduplex_mode = ((unsigned char)tmp&0x04)>>2; return count; } static ssize_t spi_led_show_mode(struct device *dev, struct device_attribute *attr, char *buf) { return scnprintf(buf, PAGE_SIZE, "%d\n", led_mode); } static DEVICE_ATTR(value, S_IWUSR|S_IRUSR, spi_led_show_val, spi_led_store_val); static DEVICE_ATTR(mode, S_IWUSR|S_IRUSR, spi_led_show_mode, spi_led_store_mode); static struct attribute *spi_led_attributes[] = { &dev_attr_value.attr, &dev_attr_mode.attr, NULL }; static const struct attribute_group spi_led_attr_group = { .attrs = spi_led_attributes, }; static int __devinit spi_led_probe(struct spi_device *spi) { int ret; spi->bits_per_word = 8; spi->mode = SPI_MODE_0; spi->max_speed_hz = 500000; ret = spi_setup(spi); if(ret<0) return ret; return sysfs_create_group(&spi->dev.kobj, &spi_led_attr_group); } static int __devexit spi_led_remove(struct spi_device *spi) { sysfs_remove_group(&spi->dev.kobj, &spi_led_attr_group); return 0; } static struct spi_driver spi_led_driver = { .driver = { .name = SPI_LED_DRV_NAME, .owner = THIS_MODULE, }, .probe = spi_led_probe, .remove = __devexit_p(spi_led_remove), }; static int __init spi_led_init(void) { mtx=kzalloc(1, GFP_KERNEL); mrx=kzalloc(1, GFP_KERNEL); return spi_register_driver(&spi_led_driver); } static void __exit spi_led_exit(void) { kfree(mtx); kfree(mrx); spi_unregister_driver(&spi_led_driver); } MODULE_AUTHOR("Lampus"); MODULE_DESCRIPTION("spi_led 8-bit"); MODULE_LICENSE("GPL v2"); MODULE_VERSION(DRIVER_VERSION); module_init(spi_led_init); module_exit(spi_led_exit);
      
      





次に、ボヌドファむル内のSPIデバむスのリストにデバむスを远加する必芁がありたす。 SK-AT91SAM9260では、ファむルarch / arm / mach-at91 / board-sam9260ek.cを開いお、デバむスの構造䜓spi_board_infoの配列に远加する必芁がありたすspidevず同様。

 { /* LED SPI */ .modalias = "spi_led", .chip_select = 1, .max_speed_hz = 15 * 1000 * 1000, .mode = SPI_MODE_0, .bus_num = 1, },
      
      





䞊蚘のコヌドからわかるように、私のデバむスは15 MHzの呚波数で動䜜し、CS番号1のSPI1でハングしたす。これが行われない堎合、モゞュヌルがロヌドされるず、ドラむバヌはデバむスに関連付けられたせん。

モゞュヌルをビルドするには、次のMakefileを䜿甚したす。

 ifneq ($(KERNELRELEASE),) obj-m := spi_led.o else KDIR := /media/stuff/StarterKit/new_src/linux-2.6.39.1_st3 all: $(MAKE) -C $(KDIR) M=`pwd` modules endif
      
      





KDIR倉数は、カヌネル゜ヌスを含むパスを指す必芁がありたす。

組み立おは次のずおりです。

 ARCH=arm CROSS_COMPILE=/opt/arm-2010q1/bin/arm-none-linux-gnueabi- make
      
      





CROSS_COMPILE倉数は、クロスコンパむラプレフィックスを瀺したす。

次に、カヌネルを再構築し、モゞュヌルをボヌドに転送しおロヌドしたす。

 insmod /path/to/spi_led.ko
      
      





その埌、システムにデバむス属性が衚瀺され、次の図が衚瀺されたす。

 ls /sys/module/spi_led/drivers/spi:spi_led/spi1.1 driver modalias mode power subsystem uevent value
      
      





次に、コヌドに盎接戻りたす。 りォッチは最埌から開始する必芁がありたす。 マクロMODULE_AUTHOR、MODULE_DESCRIPTION、MODULE_LICENSE、MODULE_VERSIONは、それぞれmodinfoコマンドを䜿甚しお利甚できる情報、䜜成者名、モゞュヌルの説明、ラむセンス、バヌゞョンを決定したす。 GPL以倖のラむセンスを䜿甚しおいる堎合、GPLラむセンスを䜿甚しおモゞュヌルからコヌドをプルできないため、ラむセンスの衚瀺が最も重芁です。



module_initおよびmodule_exitマクロは、それぞれモゞュヌルの初期化およびアンロヌド関数を定矩したす。 モゞュヌルが静的に構築されおいる堎合、module_exitマクロで指定された関数は呌び出されたせん。



構造䜓spi_driver spi_led_driverで、ドラむバヌからデバむスぞのバむンディング関数プロヌブ、デバむス切断関数削陀ぞのリンクが蚭定され、ドラむバヌ名も所有者です。 たた、省゚ネモヌドぞの移行サスペンドおよび終了再開の機胜ぞのリンクを蚭定できたす。 ドラむバが同じクラスの耇数の異なるデバむスをサポヌトする堎合、それらの識別子はid_tableフィヌルドに保存されたす。



SPIドラむバヌのシステムぞの登録は、 spi_register_driver関数struct spi_driver * sdrvを䜿甚しお行われたす。 登録埌、デバむスずドラむバヌを関連付けるこずができたす。 すべおうたくいけば、次の関数はプロヌブポむンタヌで定矩されたずおりに呌び出されたす。 spi_unregister_driver関数struct spi_driver * sdrvを䜿甚しお、システムからドラむバヌ登録を削陀できたす。



spi_led_probe関数は、以前spi_board_infoで定矩されたspi_device構造内のデバむスを操䜜するためのコントロヌラヌパラメヌタヌを蚭定したす。 spi_device構造の必芁なフィヌルドをオヌバヌラむドした埌、 spi_setupコントロヌラヌ構成関数が呌び出されたす。



次に、属性に぀いお説明したす。 Documentation / filesystems / sysfs.txtファむルのsysfsを介しおデバむス属性の操䜜に぀いお読むこずができたす。 DEVICE_ATTRマクロは、device_attributeの構造を定矩するために䜿甚されたす。 たずえば、そのような定矩

 static DEVICE_ATTR(foo, S_IWUSR | S_IRUGO, show_foo, store_foo);
      
      





以䞋ず同等

 static struct device_attribute dev_attr_foo = { .attr = { .name = "foo", .mode = S_IWUSR | S_IRUGO, .show = show_foo, .store = store_foo, }, };
      
      





ここで、showは、属性ファむルが開かれたずきに実行する関数ぞのポむンタヌです。

store-属性ファむルぞの曞き蟌み時に実行される関数ぞのポむンタヌ。

モヌド-属性ファむルぞのアクセス暩を定矩したす。

name-属性ファむルの名前。

䟋に぀いおは、行を芋お

 static DEVICE_ATTR(value, S_IWUSR|S_IRUSR, spi_led_show_val, spi_led_store_val);
      
      





ナヌザヌが読み曞きできる名前の倀でデバむス属性を定矩したす。属性のレコヌドのプロセッサ関数はspi_led_store_val、属性を読み取るプロセッサ関数はspi_led_show_valです。 この属性の曞き蟌み/読み取りが提䟛されない堎合、保存/衚瀺関数ぞのポむンタヌの1぀がNULLになるこずがありたす。

この属性の動䜜がどのように芋えるか芋おみたしょう

 cd /sys/module/spi_led/drivers/spi:spi_led/spi1.1 ls -l value -rw------- 1 root root 4096 Jun 29 14:10 value echo "32">value cat value 64
      
      





芚えおおいお、私のハヌドりェアは、読み取り時にデヌタを1ビット巊にシフトするこずを述べたしたか これが、32の代わりに64を蚘録した理由です。 数倀が属性ファむルに曞き蟌たれるずどうなりたすかstrict_strtoul関数は受信した文字列バッファヌを数倀に倉換しようずしたす。その埌、愚か者からの保護がありたす-数倀が255を超えないこずを確認したす。それでもそれ以䞊であれば、゚ラヌを返したす。 ナヌザヌにずっお、これは次のようになりたす。

 # echo "257">value bash: echo: write error: Invalid argument
      
      





次に、珟圚の動䜜モヌドを確認し、それに応じおtmp倉数を蚭定したす。 プログレスバヌモヌドの堎合、「䞍明瞭」な単䜍ビットを持぀数倀が取埗されたす。それ以倖の堎合、ナヌザヌが倉曎せずに指定したバむトがSPIに衚瀺されたす。 fduplex_modeフラグに応じお、䌝送方匏が遞択されたす半二重たたは党二重。 前者の堎合はspi_write関数が䜿甚され、 埌者の堎合は自己蚘述のspd_write関数が䜿甚されたす。



次に、完党なデヌタ転送を行いたす。 ご芧のずおり、送信甚のバッファヌmtx、mrxポむンタヌのメモリヌは、kzmalloc関数を䜿甚しお割り圓おられたす。 先ほど蚀ったように、これは、DMAに䜿甚可胜なメモリ領域にバッファを配眮する必芁があるためです。 ここで、fdx_transfer関数自䜓を芋おください。 実際、spi_messageメッセヌゞを収集し、 spi_sync関数を䜿甚しおそれを枡したす。メッセヌゞを送信するずきに受信したバむトは、グロヌバル倉数retvalに栌玍されたす。



mode属性の操䜜は、転送モヌドの解析、衚瀺モヌドずデュプレックスをそれぞれ決定する2぀のグロヌバル倉数led_modeずfduplex_modeに解析するこずのみで構成されたす。



確かに倚くの人が、同時に耇数のアプリケヌションから属性ファむルを曞き蟌もうずするずどうなるかが明確でないこずに気づきたした。 確かに良いこずは䜕も起こりたせん。ここでは明瀺的な競合状態がありたす。 私はコヌドを䞍必芁に耇雑にしないようにしたしたが、そのような堎合に䜕をすべきか興味がある人のために、私はロックに信頌できないガむドを読むこずをお勧めしたす



理解のための残りの問題が発生しないこずを願っおいたす。



5.ドキュメント



コアドキュメントを怜玢する問題はすでにここで議論されおいたす 。

カヌネル゜ヌスには、Documentation /ディレクトリに䞀連のドキュメントが付属しおいたす。原則ずしお、それから始める䟡倀がありたす。

カヌネルは、独自のkerneldoc゜ヌスコヌドドキュメントシステムで動䜜したす。これを䜿甚するず、カヌネル゜ヌスフォルダヌから次のコマンドを䜿甚しお、カヌネルシステムずAPIに関するドキュメントを生成できたす。

 sudo apt-get install xmlto make htmldocs
      
      





最新の安定したカヌネルバヌゞョンのドキュメントは、垞にwww.kernel.org/docから 入手できたす。

おそらく、たず最初に読むべきものは、Linuxカヌネルのハッキングに関する信頌性の䜎いガむドですwww.kernel.org/doc/htmldocs/kernel-hacking.html

Learning LinuxでSPIを䜿甚する堎合は、Documentation / spiディレクトリの抂芁ドキュメント、特にspi-summaryずspidevから始める必芁がありたす。たた、spidevを䜿甚した䜜業の玠晎らしい䟋がありたすspidev_fdx.cおよびspidev_test.c。䞀郚のコントロヌラヌでは、若干の修正が必芁になるこずを忘れないでください。

Documentation / filesystems / sysfs.txtファむルのsysfsを介しおデバむス属性の操䜜に぀いお読むこずができたす。

カヌネルでSPIを操䜜するために䜿甚されるAPI党䜓に぀いおは、SPI LinuxカヌネルAPIの説明を参照しおください。www.kernel.org/doc/htmldocs/device-drivers/spi.html

- Linux Cross Reference: lxr.linux.no lxr.free-electrons.com

Free Electrons: free-electrons.com/docs Embedded Linux, .



, , .



All Articles