рдпрд╣ рд▓рд┐рдирдХреНрд╕ рдореЗрдВ рджрд╛рд╕ рдПрд╕рдкреАрдЖрдИ рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд╛рд╕рд╢реАрд▓ рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдкрд░ рдореЗрд░реЗ рд▓реЗрдЦ рдХрд╛ рджреВрд╕рд░рд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рдкрд┐рдЫрд▓рд╛ рд╣рд┐рд╕реНрд╕рд╛
рдпрд╣рд╛рдБ рд╣реИ ред
3. spidev рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдпреВрдЬрд░рд╕реНрдкреЗрд╕ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдПрд╕рдкреАрдЖрдИ рдбреНрд░рд╛рдЗрд╡рд░ рдХрд╛ рд╡рд┐рдХрд╛рд╕
рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдПрд╕рдкреАрдЖрдИ рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдпреВрдЬрд░реНрд╕ рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рд╕реАрдорд┐рдд рд╕рдорд░реНрдерди рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдореВрд▓ рдЖрдзрд╛-рдбреБрдкреНрд▓реЗрдХреНрд╕ рдкрдврд╝рдиреЗ () рдФрд░ рд▓рд┐рдЦрдиреЗ () рдХреЗ рд▓рд┐рдП рджрд╛рд╕ рдПрд╕рдкреАрдЖрдИ рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рд╣реИред Ioctl () рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдПрдХ рджрд╛рд╕ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд╕рд╛рде рдкреВрд░реНрдг-рджреНрд╡реИрдз рдбреЗрдЯрд╛ рд╡рд┐рдирд┐рдордп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рд╛рде рд╣реА рдбрд┐рд╡рд╛рдЗрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рднреА рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред
рдЬрдм рдЖрдк рдЗрд╕ рдЙрдкрдпреЛрдХреНрддрд╛ API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдХрдИ рдХрд╛рд░рдг рд╣реИрдВ:
- рдПрдХ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдШрд╛рддрдХ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдШрдЯрдирд╛ рд╕реЗ рдЧреНрд░рд╕реНрдд рдирд╣реАрдВ рд╣реИред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдерд╛рди рдореЗрдВ рдЕрдорд╛рдиреНрдп рдкреЙрдЗрдВрдЯрд░реНрд╕ рдЖрдорддреМрд░ рдкрд░ рдкреВрд░реЗ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдХреНрд░реИрд╢ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
- рдЧреБрд▓рд╛рдо рдПрд╕рдкреАрдЖрдИ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рдореЛрдб рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░реНрд╕ рдХреЗ рд╕рд╛рде рдбреЗрдЯрд╛ рдПрдХреНрд╕рдЪреЗрдВрдЬ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рд░рд▓ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рд╡рд┐рдХрд╛рд╕, рдЬрд┐рд╕реЗ рдЕрдХреНрд╕рд░ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдРрд╕реЗ рдбреНрд░рд╛рдЗрд╡рд░ рд╣реИрдВ рдЬреЛ рдпреВрдЬрд░рд╕реНрдкреЗрд╕ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдиреНрд╣реЗрдВ рдЕрдиреНрдп рдХрд░реНрдиреЗрд▓ рдЗрдВрдЯрд░рдлреЗрд╕ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмрд╛рдзрд╛ рд╣реИрдВрдбрд▓рд░ рдпрд╛ рдбреНрд░рд╛рдЗрд╡рд░ рд╕реНрдЯреИрдХ рдХреЗ рдЕрдиреНрдп рд╕рдмрд╕рд┐рд╕реНрдЯрдо) рддрдХ рдкрд╣реБрдВрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдерд╛рди рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИрдВред
Spidev рд╕рдорд░реНрдерди рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:
1. рдЬрдм menuconfig рдореЗрдВ рдХрд░реНрдиреЗрд▓ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдЗрдЯрдо рдХреЛ рд╕рдХреНрд░рд┐рдп рдХрд░реЗрдВ:
Device Drivers SPI support User mode SPI device driver support
2. рдмреЛрд░реНрдб рдХреА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкрд┐рдЫрд▓реЗ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреА рд╕рд░рдгреА рдореЗрдВ spi_board_info рдЬреЛрдбрд╝реЗрдВ:
{ .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 рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, udv / mdev рдЬреИрд╕реА рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕реЗ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдорд╣рд╛рди, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЙрдкрдХрд░рдг рд╣реИред рдЙрд╕рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рд╣реИ, рдпрд╣ рд╕реАрдЦрдирд╛ рдмрд╛рдХреА рд╣реИред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдо рдПрд╕рдЯреАрдЖрдИ 1 рдкрд░ рд▓рдЯрдХрдиреЗ рд╡рд╛рд▓реЗ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рдмрд╛рдЗрдЯ 0x8 рдИ рдХреЛ рд╕реАрдПрд╕ 2 рдирдВрдмрд░ рдХреЗ рд╕рд╛рде рднреЗрдЬрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╕рдВрднрд╡рддрдГ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
echo -ne "\x8e">/dev/spidev1.2
рдЙрд╕рдХреЗ рдмрд╛рдж, рдореЗрд░реЗ рдкрд░реАрдХреНрд╖рдг рдЙрдкрдХрд░рдг рдкрд░, рдХреЛрдИ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЪрд┐рддреНрд░ рдХрд╛ рдЕрд╡рд▓реЛрдХрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ:

рдкрд░реАрдХреНрд╖рдг рдЙрдкрдХрд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╢рдмреНрджред рд╕рдВрднрд╡рддрдГ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд▓рдЧрднрдЧ рдмреЗрдХрд╛рд░ рд╣реИ рдФрд░ рдХреЗрд╡рд▓ рд▓рд┐рдирдХреНрд╕ рдореЗрдВ рдПрд╕рдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзреНрдпрдпрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕реЗ рдПрдХ рд╢рд┐рдлреНрдЯ рд░рдЬрд┐рд╕реНрдЯрд░ 74HC164N рдкрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ 3 рддрддреНрд╡реЛрдВ рдкрд░ 2I-NOT 74HC132N рд╕реЗ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЪрд┐рдкрд╕реЗрд▓реЗрдХреНрд╢рди рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рдЗрдирдкреБрдЯ ~ CS рдкрд░ рдХреЗрд╡рд▓ рдирд┐рдореНрди рд╕реНрддрд░ рдкрд░ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рд╕рд┐рдЧреНрдирд▓ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ (рдореИрдВ рддреБрд░рдВрдд рдиреЛрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рд╣рд╛рдВ, рдореБрдЭреЗ 74HC595 рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рдЕрдкрдиреЗ рд╢рд╣рд░ рдореЗрдВ рдирд╣реАрдВ рдкрд╛ рд╕рдХрддрд╛)ред рдЗрд╕ рдбрд┐рд╡рд╛рдЗрд╕ рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдХрд╛рд░реНрдп рд╣реИ - рдПрд▓ рдИ рдбреА рдкрд░ рд▓рд┐рдЦреЗ рдЧрдП рдЕрдВрддрд┐рдо рдмрд╛рдЗрдЯ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ред рдЪреВрдВрдХрд┐ рдореЗрд░рд╛ рдЙрдкрдХрд░рдг рдкреВрд░реА рддрд░рд╣ рд╕реЗ "рдИрдорд╛рдирджрд╛рд░" рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдкрдврд╝рдиреЗ рд╕реЗ рд╣рдореЗрдВ рд╡рд╣ рдирд╣реАрдВ рдорд┐рд▓реЗрдЧрд╛ рдЬреЛ рд╣рдордиреЗ рд▓рд┐рдЦрд╛ рдерд╛ (рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛), рд▓реЗрдХрд┐рди рдореВрд▓реНрдп рдПрдХ рдмрд┐рдЯ рд╕реЗ рдмрд╛рдИрдВ рдУрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╣реЛ рдЧрдпрд╛ред
рджрд╛рд╕ рд╕рдВрдЪрд╛рд▓рди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ ioctl () рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╡реЗ рдЖрдкрдХреЛ рдбреЗрдЯрд╛ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдЧрддрд┐, рдкреНрд░реЗрд╖рд┐рдд рд╢рдмреНрдж рдХрд╛ рдЖрдХрд╛рд░, рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рди рдореЗрдВ рдмрд╛рдЗрдЯ рдСрд░реНрдбрд░ рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдСрдкрд░реЗрд╢рди рдХреЗ рдПрд╕рдкреАрдЖрдИ рдореЛрдб рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд ioctl () рдЕрдиреБрд░реЛрдз рдЖрдкрдХреЛ рдПрдХ рджрд╛рд╕ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рджреЗрддрд╛ рд╣реИ:
- SPI_IOC_RD_MODE, SPI_IOC_WR_MODE - рд░реАрдб (рдЖрд░рдбреА) рдХреЗ рд▓рд┐рдП рдмрд╛рдЗрдЯ рдЬрд┐рд╕рдореЗрдВ рдкреЙрдЗрдВрдЯрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╡рд░реНрддрдорд╛рди рдПрд╕рдкреАрдЖрдИ рдореЛрдб рдХрд╛ рдорд╛рди рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ (WR) рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдбрд┐рд╡рд╛рдЗрд╕ рд╕рдВрдЪрд░рд┐рдд рдкреЙрдЗрдВрдЯрд░ рдХреЗ рдмрд╛рдЗрдЯ рдорд╛рди рдХреЗ рдЕрдиреБрд░реВрдк рдПрдХ рдореЛрдб рдкрд░ рд╕реЗрдЯ рд╣реИред рдореЛрдб рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреЙрдиреНрд╕реНрдЯреЗрдВрдЯреНрд╕ SPI_MODE_0 ... SPI_MODE_3 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╛ рдХреЙрдиреНрд╕реНрдЯреЗрдВрдЯреНрд╕ SPI_CPHA (рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рдлреЗрдЬ, рд▓реАрдбрд┐рдВрдЧ рдПрдЬ рдХреИрдкреНрдЪрд░, рдпрджрд┐ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ) рдФрд░ SPI_CPOD (рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рдкреЛрд▓рд░рд┐рдЯреА, рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рд╕рд┐рдЧреНрдирд▓ рдЙрдЪреНрдЪ рд╕реНрддрд░ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ) рдмрд┐рдЯрд╡рд╛рдЗрдЬрд╝ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ "рдпрд╛"ред
- SPI_IOC_RD_LSB_FIRST, SPI_IOC_WR_LSB_FIRST - рдПрдХ рд╕реВрдЪрдХ рдХреЛ рдПрдХ рдмрд╛рдЗрдЯ рд╕реЗ рдЧреБрдЬрд╛рд░реЗрдВ рдЬреЛ SPI рд╢рдмреНрджреЛрдВ рдХреЛ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рддреЗ рд╕рдордп рдмрд┐рдЯреНрд╕ рдХреЗ рд╕рдВрд░реЗрдЦрдг рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рд╢реВрдиреНрдп рдХрд╛ рдПрдХ рдорд╛рди рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдЯ рдкрд╣рд▓рд╛ (MSB-рдкрд╣рд▓рд╛) рд╣реИ, рдЕрдиреНрдп рдорд╛рди рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рджреБрд░реНрд▓рдн рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╕рдмрд╕реЗ рдХрдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдЯ рдкрд╣рд▓рд╛ (LSB-рдкрд╣рд▓рд╛) рд╣реИред рджреЛрдиреЛрдВ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рд╢рдмреНрдж рд╕рд╣реА рд╣реЛрдЧрд╛, рддрд╛рдХрд┐ рдЕрдкреНрд░рдпреБрдХреНрдд / рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдмрд┐рдЯреНрд╕ рдЙрдЪреНрдЪ рдХреНрд░рдо рдореЗрдВ рд╣реЛрдВрдЧреЗред рдЖрд░рдбреА / рдбрдмреНрд▓реНрдпреВрдЖрд░ - рдкрдврд╝рдиреЗ / рд▓рд┐рдЦрдиреЗ рдХрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдмрд┐рдЯреНрд╕ рдХреЗ рд╕рдВрд░реЗрдЦрдг рдХреЛ рдХреНрд░рдорд╢рдГ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред
- SPI_IOC_RD_BITS_PER_WORD, SPI_IOC_WR_BITS_PER_WORD - рдПрдХ рд╕реВрдЪрдХ рдХреЛ рдПрдХ рдмрд╛рдЗрдЯ рд╕реЗ рдЧреБрдЬрд░рддрд╛ рд╣реИ рдЬреЛ SPI рджреНрд╡рд╛рд░рд╛ рдбреЗрдЯрд╛ рд╕рдВрдЪрд╛рд░рд┐рдд рдХрд░рддреЗ рд╕рдордп рдкреНрд░рддрд┐ рд╢рдмреНрдж рдмрд┐рдЯреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдПрдХ рд╢реВрдиреНрдп рдорд╛рди рдЖрда рдмрд┐рдЯреНрд╕ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред RD / WR - рдХреНрд░рдорд╢рдГ рдкреНрд░рддрд┐ рд╢рдмреНрдж рдмрд┐рдЯреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдкрдврд╝реЗрдВ / рд▓рд┐рдЦреЗрдВред
- SPI_IOC_RD_MAX_SPEED_HZ, SPI_IOC_WR_MAX_SPEED_HZ - u32 рдЪрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реВрдЪрдХ рджреЗрддрд╛ рд╣реИ, рдЬреЛ Hz рдореЗрдВ SPI рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХрддрдо рдбреЗрдЯрд╛ рджрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдирд┐рдпрдВрддреНрд░рдХ рд╕реЗрдЯ рдЧрддрд┐ рдХреЛ рдареАрдХ рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдЖрд╡реГрддреНрддрд┐ рдХреЛ рдмрджрд▓рдХрд░, рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдореЗрд░рд╛ рдкрд░реАрдХреНрд╖рдг рдЙрдкрдХрд░рдг рд▓рдЧрднрдЧ 15 рдореЗрдЧрд╛рд╣рд░реНрдЯреНрдЬ рд╕реЗ рдЕрдзрд┐рдХ рдХреА рдЖрд╡реГрддреНрддрд┐ рдкрд░ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рд▓реВрдк рдХреА рд▓рдВрдмрд╛рдИ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рдЗрддрдирд╛ рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИ, рд╕рд░реНрдХрд┐рдЯ рдмреЛрд░реНрдб рдкрд░ рд▓рдЧрднрдЧ 25 рд╕реЗрдореА, рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдФрд░ рдПрдордЬреАрдЯреАрдПрдл рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрдкрд░реНрдХреЛрдВ рдХрд╛ рдХрдиреЗрдХреНрд╢рдиред
рдЕрдм рдореИрдВ рдПрдХ рдФрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдмрд┐рдЯреНрд╕ рдХреЗ рдХреНрд░рдо рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдлрд┐рд░ рд╕реЗ рд╕рднреА рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИред рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдирд┐рдпрдВрддреНрд░рдХ рдХрд┐рд╕ рдХрд╛рд░реНрдп рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдЖрдкрдХреЛ рдмрд┐рдЯ рдорд╛рд╕реНрдХ spi_master.mode_bits рдХреЛ рджреЗрдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЖрдк
spi_device рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдЭрдВрдбреЗ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рд╕реЗ рдореБрдЦреМрдЯрд╛ рдореЗрдВ рдмрд┐рдЯреНрд╕ рдХреЗ рдореВрд▓реНрдп рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ рдпрд╣рд╛рдБ spi_device рдФрд░
spi_master рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХрд╛ рдкреВрд░реНрдг рд╡рд┐рд╡рд░рдг рдирд╣реАрдВ рджреВрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИрдВред рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреА рдПрдХ рдХрдбрд╝реА, рдЬрд┐рд╕рдореЗрдВ рдЖрдк рдЗрди рд╕рднреА рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд╡рд┐рд╡рд░рдг рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдореИрдВ рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рджреВрдВрдЧрд╛ред
рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдерд╛, рд╕реНрдкрд┐рдбрд╡ рдЗрд╕реА ioctl () рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдзреЗ-рджреНрд╡реИрдз рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:
int ret; ret = ioctl(fd, SPI_IOC_MESSAGE(num), tr);
рдЬрд╣рд╛рдБ рд╕рдВрдЦреНрдпрд╛ 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 рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рджрд╛рд╕ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд▓реАрди рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рд╕рдВрдЪрд╛рд░рд┐рдд рдмрдлрд╝рд░реНрд╕ (рдЖрд░рдПрдХреНрд╕ рдФрд░ рдЯреАрдПрдХреНрд╕) рдХреА рд▓рдВрдмрд╛рдИ рд╣реИред
speed_hz - рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рджрд░ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддрд╛ рд╣реИред
рдмрд┐рдЯреНрд╕_рдкрд░_рд╢рдмреНрдж - рджрд┐рдП рдЧрдП рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рди рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐ рд╢рдмреНрдж рдмрд┐рдЯреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред
delay_usecs - рдЕрдВрддрд┐рдо рдмрд┐рдЯ рдбреЗрдЯрд╛ рд╕рдВрдЪрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ (cs_deactivate рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ) рдорд╛рдЗрдХреНрд░реЛрд╕реЗрдХрдВрдб рдореЗрдВ рджреЗрд░реАред
Spi_ioc_transfer рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рдЧрднрдЧ рд╕рднреА рдХреНрд╖реЗрддреНрд░ spi_transfer рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИрдВред рдбреЗрдЯрд╛ рдмрдлрд╝рд░реНрд╕ spidev рдбреНрд░рд╛рдЗрд╡рд░ рдХреЗ рдЖрдВрддреНрд░ рдореЗрдВ copy_from_user () / copy_to_user () рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд░реНрдиреЗрд▓ рд╕реНрдерд╛рди рд╕реЗ / рд╕реЗ рдкрд╣рд▓реЗ рдХреЙрдкреА рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдКрдкрд░ рдХрд╣рд╛, рд╕рднреА рдирд┐рдпрдВрддреНрд░рдХ рдкреНрд░рддреНрдпреЗрдХ рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рд╢рдмреНрдж рдХреА рдЧрддрд┐ рдФрд░ рдЖрдХрд╛рд░ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдмрджрд▓рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк рдПрдХ рдкреЛрд░реНрдЯреЗрдмрд▓ рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рд╡рд╣рд╛рдВ рд╢реВрдиреНрдп рдбрд╛рд▓рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдлреБрд▓ рдбреБрдкреНрд▓реЗрдХреНрд╕ рдореЛрдб рдореЗрдВ рд╕реНрдкрд╛рдЗрдбрд╡ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдЙрджрд╛рд╣рд░рдг, рдЬреЛ рдХрд░реНрдиреЗрд▓ рдбреЙрдХреНрдпреВрдореЗрдВрдЯреЗрд╢рди рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реИ, рдПрдЯ рез реп рез рдкрд░рд┐рд╡рд╛рд░ рд╕реЗ рдЪрд┐рдкреНрд╕ рдкрд░ spi_ioc_transfer рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдЖрд░рдВрднреАрдХрд░рдг рдореЗрдВ рд╕реБрдзрд╛рд░ рдХреЗ рдмрд┐рдирд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред
рдЯрд┐рдкреНрдкрдгреА:
- рдлрд┐рд▓рд╣рд╛рд▓, рдЗрд╕ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдмрд┐рдЯреНрд╕ рдХреЛ рдкреБрд╢ / рдХреИрдкреНрдЪрд░ рдХрд░рдиреЗ рдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЧрддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред
- рдлрд┐рд▓рд╣рд╛рд▓, рдЖрдк spidev рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд┐рдк рдХрд╛ рдЪрдпрди рдзреНрд░реБрд╡рддрд╛ рдХреЛ рдЙрд▓реНрдЯрд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдкреНрд░рддреНрдпреЗрдХ рджрд╛рд╕ рдбрд┐рд╡рд╛рдЗрд╕ рдирд┐рд╖реНрдХреНрд░рд┐рдп рд╣реИ рдЬрдм рдпрд╣ рд╕рдХреНрд░рд┐рдп рдЙрдкрдпреЛрдЧ рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рдЕрдиреНрдп рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдХреЛ рдЕрдкрдиреЗ рд╕рдВрдмрдВрдзрд┐рдд рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
- рдкреНрд░рддреНрдпреЗрдХ I / O рдЕрдиреБрд░реЛрдз рдХреЗ рд╕рд╛рде рдкреНрд░реЗрд╖рд┐рдд рдмрд╛рдЗрдЯреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд░ рдПрдХ рд╕реАрдорд╛ рд╣реЛрддреА рд╣реИред рдЖрдорддреМрд░ рдкрд░, рд╕реАрдорд╛ рд╕реНрдореГрддрд┐ рдХреЗ рдПрдХ рдкреГрд╖реНрда рдХреЗ рдЖрдХрд╛рд░ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИред рдХрд░реНрдиреЗрд▓ рдореЙрдбреНрдпреВрд▓ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рдорд╛рди рдХреЛ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
- рдЪреВрдВрдХрд┐ рдПрд╕рдкреАрдЖрдИ рдореЗрдВ рдбрд┐рд▓реАрд╡рд░реА рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреЗ рдХреА рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рдкрджреНрдзрддрд┐ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рди рдореЗрдВ рдХреЛрдИ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реИрдВ, рдпрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рдХреЛрдИ рднреА рдХреЛрдИ рднреА рдЙрдкрдХрд░рдг рдирд╣реАрдВ рд╣реИред
рдЕрдм рдореИрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреВрдВрдЧрд╛, рдпрд╣ spidev рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдПрдХ рд╕рд░рд▓реАрдХреГрдд рд╕рдВрд╕реНрдХрд░рдг рд╣реИ, рдЬреЛ рдХрд░реНрдиреЗрд▓ рдХреЗ рд╕рд╛рде рдмрдВрдбрд▓ рдореЗрдВ рдЖрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдирд╣реАрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреЛрдИ рднреА рд░реАрдб () рдФрд░ рд░рд╛рдЗрдЯ () рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЖрдзреЗ-рдЕрдзреВрд░реЗ рд╕рдВрдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реИред
#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
рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рд╕реАрд╕реА рдЪрд░ рдореЗрдВ рдЕрдкрдирд╛ рд░рд╛рд╕реНрддрд╛ рдХреНрд░реЙрд╕-рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
4. рдПрдХ рдХрд░реНрдиреЗрд▓-рд╕реНрддрд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ SPI рдбреНрд░рд╛рдЗрд╡рд░ рдХрд╛ рд╡рд┐рдХрд╛рд╕
рдХрд░реНрдиреЗрд▓ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рд╡рд┐рдХрд╛рд╕ рдПрдХ рдЕрдзрд┐рдХ рд╡реНрдпрд╛рдкрдХ рд╡рд┐рд╖рдп рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдо рджреВрд╕рд░реЗ рддрд░реАрдХреЗ рд╕реЗ рдЬрд╛рдПрдВрдЧреЗ: рдореИрдВ рдкрд╣рд▓реЗ рдХреЛрдб рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреВрдВрдЧрд╛, рдлрд┐рд░ рдореИрдВ рдЗрд╕рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд┐рд╡рд░рдг рджреВрдВрдЧрд╛, рдФрд░ рд╕рдордЭрд╛рдКрдВрдЧрд╛ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдореИрдВ рд╕рднреА рд╡рд┐рд╡рд░рдгреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рдЕрдиреНрдпрдерд╛ рдкрд░реНрдпрд╛рдкреНрдд рд▓реЗрдЦ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдореИрдВ рд╕рд┐рд░реНрдл рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реВрдВрдЧрд╛, рдкреНрд░рд▓реЗрдЦрди рдкрд░ рд▓реЗрдЦ рдХреЗ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдЖрдк рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдВрдХ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдореИрдВ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рдХреИрд╕реЗ sysfs рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбрд┐рд╡рд╛рдЗрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рдпрд╛ рдЬрд╛рдПред рдбрд┐рд╡рд╛рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбрд┐рд╡рд╛рдЗрд╕ рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдЗрд╕ рдкрд░ рдкрд╣рд▓реЗ рд╣реА рдЪрд░реНрдЪрд╛ рд╣реЛ рдЪреБрдХреА рд╣реИ:
рдПрдХ ,
рджреЛрдореЗрд░рд╛ рдбреНрд░рд╛рдЗрд╡рд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рджреЛ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛:
рдореВрд▓реНрдп - рдЗрд╕рдореЗрдВ рдЖрдк рдПрдХ рд╕рдВрдЦреНрдпрд╛ рд▓рд┐рдЦ тАЛтАЛрд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдЖрдк рдПрд▓рдИрдбреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рд░реВрдк рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ;
рдореЛрдб - рдореЛрдб рд╕реНрд╡рд┐рдЪ, рдЖрдкрдХреЛ рддреАрди рдСрдкрд░реЗрдЯрд┐рдВрдЧ рдореЛрдб рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореЛрдб рд╕рдорд░реНрдерд┐рдд рд╣реИрдВ: 0 - рдмрд╛рдЗрдирд░реА рд░реВрдк рдореЗрдВ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдореЛрдб, 1 - рдмрд╛рдПрдВ рд╕реЗ рджрд╛рдПрдВ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд╕рд╛рде рдкреНрд░рдЧрддрд┐ рдмрд╛рд░ рдореЛрдб, 2 - рджрд╛рдПрдВ рд╕реЗ рдмрд╛рдПрдВ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд╕рд╛рде рдкреНрд░рдЧрддрд┐ рдмрд╛рд░ рдореЛрдб;
рдкреНрд░рдЧрддрд┐ рдмрд╛рд░ рдореЛрдб рдореЗрдВ, рдбрд┐рд╡рд╛рдЗрд╕ рдПрд▓ рдИ рдбреА рдХреА рдПрдХ рдирд┐рд╖реНрдХреНрд░рд┐рдп рд░реЗрдЦрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдореВрд▓реНрдп рдореЗрдВ рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдкреНрд░рддрд┐рд╢рдд 256 рд╕реЗ рдХрд┐рддрдирд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдореЛрдб 1 рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдФрд░ рдореВрд▓реНрдп 128 рдореЗрдВ, рддреЛ рдмрд╛рдИрдВ рдУрд░ 8 рд╕реЗ 4 рдПрд▓ рдИ рдбреА рдкреНрд░рдХрд╛рд╢ рд╣реЛрдЧрд╛ред
рдпрджрд┐ рдЖрдк рдореЛрдб рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рддреАрд╕рд░рд╛ рдмрд┐рдЯ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдкреВрд░реНрдг-рджреНрд╡реИрдз рдореЛрдб (fdx_transfer () рдлрд╝рдВрдХреНрд╢рди) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдмрдЬрд╛рдп рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЙрд▓ рдХреЗ spi_write () рдФрд░ spi_read () рдХреЗ рд▓рд┐рдПред рдЧреИрд░-рдкреВрд░реНрдг рджреНрд╡реИрдз рдореЛрдб рдХреНрд░рдорд╢рдГ 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);
рдЕрдм, рд╣рдореЗрдВ рдЕрдкрдиреЗ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рдмреЛрд░реНрдб рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрд╕рдкреАрдЖрдИ рдЙрдкрдХрд░рдгреЛрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореЗрд░реЗ SK-AT91SAM9260 рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдлрд╝рд╛рдЗрд▓ рдЖрд░реНрдХ / рдЖрд░реНрдо / рдордЪ-рдПрдЯ91 / рдмреЛрд░реНрдб-рд╕рдо -9260ek.c рдЦреЛрд▓рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдФрд░ рдЗрд╕реЗ рд╣рдорд╛рд░реЗ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд▓рд┐рдП рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреА рд╣рдорд╛рд░реЗ рд╕рд░рдгреА рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред spi_board_info рд╣рдорд╛рд░реЗ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд▓рд┐рдП (spidev рдХреЗ рд╕рдорд╛рди):
{ .modalias = "spi_led", .chip_select = 1, .max_speed_hz = 15 * 1000 * 1000, .mode = SPI_MODE_0, .bus_num = 1, },
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдКрдкрд░ рджрд┐рдП рдЧрдП рдХреЛрдб рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдореЗрд░рд╛ рдбрд┐рд╡рд╛рдЗрд╕ 15 рдореЗрдЧрд╛рд╣рд░реНрдЯреНрдЬ рдХреА рдЖрд╡реГрддреНрддрд┐ рдкрд░ рдЪрд▓ рд░рд╣рд╛ рд╣реИ, CSI 1 рдХреЗ рд╕рд╛рде SPI1 рдкрд░ рд▓рдЯрдХрд╛ рд╣реБрдЖ рд╣реИред рдпрджрд┐ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЬрдм рдореЙрдбреНрдпреВрд▓ рд▓реЛрдб рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдбреНрд░рд╛рдЗрд╡рд░ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд╕рд╛рде рд╕рдВрдмрджреНрдз рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореЗрдХрдлрд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ:
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
рдХреЗрдбреАрдЖрдИрдЖрд░ рдЪрд░ рдХреЛ рдХрд░реНрдиреЗрд▓ рд╕реНрд░реЛрддреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдкрде рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
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 рдХрдорд╛рдВрдб, рд▓реЗрдЦрдХ рдХрд╛ рдирд╛рдо, рдореЙрдбреНрдпреВрд▓ рд╡рд┐рд╡рд░рдг, рд▓рд╛рдЗрд╕реЗрдВрд╕ рдФрд░ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдкрд▓рдмреНрдз рд╣реЛрдВрдЧреАред рд▓рд╛рдЗрд╕реЗрдВрд╕ рдХрд╛ рд╕рдВрдХреЗрдд рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрджрд┐ рдЖрдк рдЧреИрд░-рдЬреАрдкреАрдПрд▓ рд▓рд╛рдЗрд╕реЗрдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЬреАрдкреАрдПрд▓ рд▓рд╛рдЗрд╕реЗрдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореЙрдбреНрдпреВрд▓ рд╕реЗ рдХреЛрдб рдирд╣реАрдВ рдЦреАрдВрдЪ рдкрд╛рдПрдВрдЧреЗред
рдореИрдХреНрд░реЛрдЬрд╝
рдореЙрдбреНрдпреВрд▓_рдЗрдирд┐рдЯ () рдФрд░
рдореЙрдбреНрдпреВрд▓_рдПрдХреНрд╕рд┐рдЯ () рдХреНрд░рдорд╢рдГ рдореЙрдбреНрдпреВрд▓ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдФрд░ рдЕрдирд▓реЛрдб рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдореЙрдбреНрдпреВрд▓ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд░реВрдк рд╕реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдореЙрдбреНрдпреВрд▓_рдПрдХреНрд╕рд┐рдЯ рдореИрдХреНрд░реЛ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдлрд╝рдВрдХреНрд╢рди рдХрднреА рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред
рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ
рд╕рдВрд░рдЪрдирд╛ spi_driver spi_led_driver, рд▓рд┐рдВрдХ рдбреНрд░рд╛рдЗрд╡рд░ рд╕реЗ рдбрд┐рд╡рд╛рдЗрд╕ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рдВрд╕ (рдЬрд╛рдВрдЪ), рдбрд┐рд╡рд╛рдЗрд╕ рдбрд┐рд╕реНрдХрдиреЗрдХреНрд╢рди рдлрд╝рдВрдХреНрд╢рдВрд╕ (рдирд┐рдХрд╛рд▓реЗрдВ) рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рд╣реИрдВ, рдФрд░ рдбреНрд░рд╛рдЗрд╡рд░ рдХрд╛ рдирд╛рдо рднреА рд╕реНрд╡рд╛рдореА рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдКрд░реНрдЬрд╛-рдмрдЪрдд рдореЛрдб (рд╕рд╕реНрдкреЗрдВрдб) рдореЗрдВ рд╕рдВрдХреНрд░рдордг рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдВрдХ рдФрд░ рдЗрд╕рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ (рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ) рдХреЛ рд╡рд╣рд╛рдВ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдбреНрд░рд╛рдЗрд╡рд░ рдПрдХ рд╣реА рд╡рд░реНрдЧ рдХреЗ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЙрдирдХреЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ id_table рдлрд╝реАрд▓реНрдб рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ SPI рдбреНрд░рд╛рдЗрд╡рд░ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛
spi_register_driver рдлрд╝рдВрдХреНрд╢рди
(рд╕рдВрд░рдЪрдирд╛ spi_driver * sdrv) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдкрдВрдЬреАрдХрд░рдг рдХреЗ рдмрд╛рдж рд╣реИ рдХрд┐ рдбрд┐рд╡рд╛рдЗрд╕ рдФрд░ рдбреНрд░рд╛рдЗрд╡рд░ рдЬреБрдбрд╝рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рд╕рдм рдареАрдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЕрдЧрд▓рд╛ рдлрд╝рдВрдХреНрд╢рди рдЬрд╛рдВрдЪ рд╕реВрдЪрдХ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред рдЖрдк
рдХреНрд░рдорд╢рдГ spi_unregister_driver рдлрд╝рдВрдХреНрд╢рди
(рд╕рдВрд░рдЪрдирд╛ spi_driver * sdrv) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдбреНрд░рд╛рдЗрд╡рд░ рдкрдВрдЬреАрдХрд░рдг рд╣рдЯрд╛ рд╕рдХрддреЗ
рд╣реИрдВSpi_led_probe () рдлрд╝рдВрдХреНрд╢рди рдкрд╣рд▓реЗ рд╕реЗ
spi_board_info рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд spi_device рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдВрддреНрд░рдХ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред Spi_device рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдлрд╝реАрд▓реНрдб рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж,
spi_setup () рдирд┐рдпрдВрддреНрд░рдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рдВрдХреНрд╢рди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЕрдм рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВред рдЖрдк рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ / рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо / sysfs.txt рдлрд╝рд╛рдЗрд▓ рдореЗрдВ sysfs рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрдХрд░рдг рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдХреНрд░реЛ DEVICE_ATTR рдХрд╛ рдЙрдкрдпреЛрдЧ рдбрд┐рд╡рд╛рдЗрд╕_рдЯреИрдЯрд░ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдРрд╕реА рдкрд░рд┐рднрд╛рд╖рд╛
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, }, };
рдЬрд╣рд╛рдВ рд╢реЛ рд╡рд┐рд╢реЗрд╖рддрд╛ рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓рдиреЗ рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдПрдХ рд╕рдВрдХреЗрддрдХ рд╣реИ;
рд╕реНрдЯреЛрд░ - рд╡рд┐рд╢реЗрд╖рддрд╛ рдлрд╝рд╛рдЗрд▓ рдкрд░ рд▓рд┐рдЦрддреЗ рд╕рдордп рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ;
рдореЛрдб - рд╡рд┐рд╢реЗрд╖рддрд╛ рдлрд╝рд╛рдЗрд▓ рддрдХ рдкрд╣реБрдБрдЪ рдЕрдзрд┐рдХрд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ;
рдирд╛рдо - рд╡рд┐рд╢реЗрд╖рддрд╛ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдоред
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд╛рдЗрди рджреЗрдЦреЗрдВ
static DEVICE_ATTR(value, S_IWUSR|S_IRUSR, spi_led_show_val, spi_led_store_val);
рдпрд╣ рдирд╛рдо рдХреЗ рд╕рд╛рде рдбрд┐рд╡рд╛рдЗрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдкрдврд╝рд╛ / рд▓рд┐рдЦрд╛ рдЬрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ, рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд░рд┐рдХреЙрд░реНрдб рдХрд╛ рдкреНрд░реЛрд╕реЗрд╕рд░ рдлрд╝рдВрдХреНрд╢рди spi_led_store_val рд╣реИ, рд╡рд┐рд╢реЗрд╖рддрд╛ рдкрдврд╝рдиреЗ рдХрд╛ рдкреНрд░реЛрд╕реЗрд╕рд░ рдлрд╝рдВрдХреНрд╢рди spi_led_show_val рд╣реИред рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕реНрдЯреЛрд░ / рд╢реЛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд┐рдВрджреБ 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
рдпрд╛рдж рд░рдЦреЗрдВ, рдореИрдВрдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдХрд╛ рдореЗрд░рд╛ рдЯреБрдХрдбрд╝рд╛ рдбреЗрдЯрд╛ рдХреЛ рдкрдврд╝рддреЗ рд╕рдордп рдмрд╛рдИрдВ рдУрд░ рдПрдХ рдмрд┐рдЯ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ? рдпрд╣реА рд╡рдЬрд╣ рд╣реИ рдХрд┐ рд╣рдореЗрдВ 32 рджрд░реНрдЬ рдХреЗ рдмрдЬрд╛рдп 64 рдорд┐рд▓реЗред рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдХреЛрдИ рд╕рдВрдЦреНрдпрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓рд┐рдЦреА рдЬрд╛рддреА рд╣реИ: рд╕рдЦреНрдд_strtoul () рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рд╛рдкреНрдд рд╕реНрдЯреНрд░рд┐рдВрдЧ рдмрдлрд░ рдХреЛ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ рдореВрд░реНрдЦ рд╕реЗ рд╕реБрд░рдХреНрд╖рд╛ рд╣реЛрддреА рд╣реИ - рдпрд╣ рдЬрд╛рдВрдЪрдирд╛ рдХрд┐ рд╕рдВрдЦреНрдпрд╛ 255 рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реИред рдЕрдЧрд░, рдлрд┐рд░ рднреА, рдпрд╣ рдЕрдзрд┐рдХ рд╣реИ, рддреЛ рд╣рдо рдПрдХ рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
рдЕрдЧрд▓рд╛ рд╡рд░реНрддрдорд╛рди рдСрдкрд░реЗрдЯрд┐рдВрдЧ рдореЛрдб рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░, tmp рд╡реЗрд░рд┐рдПрдмрд▓ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдкреНрд░рдЧрддрд┐ рдмрд╛рд░ рдореЛрдб рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, "inextricable" рдпреВрдирд┐рдЯ рдмрд┐рдЯреНрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛рдПрдЧреА, рдЕрдиреНрдпрдерд╛ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмрд┐рдирд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдмрд╛рдЗрдЯ рдПрд╕рдкреАрдЖрдИ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред Fduplex_mode рдзреНрд╡рдЬ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рди рд╡рд┐рдзрд┐ рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдЖрдзрд╛-рджреНрд╡реИрдз рдпрд╛ рдкреВрд░реНрдг-рджреНрд╡реИрдзред рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ,
spi_write () рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рджреВрд╕рд░реЗ рдореЗрдВ рд╕реНрд╡-рд▓рд┐рдЦрд┐рдд spd_write ()ред
рдЕрдм рдкреВрд░рд╛ рдбрд╛рдЯрд╛ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдкрд░ рдЬрд╛рдПрдВред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рди рдХреЗ рд▓рд┐рдП рдмрдлрд╝рд░реНрд╕ (mtx, mrx рдкреЙрдЗрдВрдЯрд░реНрд╕) рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдХреЛ kzmalloc рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореБрдЭреЗ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдХрд╣рд╛, рдпрд╣ рдбреАрдПрдордП рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдмрдлрд╝рд░реНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдХрд╛рд░рдг рд╣реИред рдЕрдм рд╣рдо fdx_transfer () рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ spi_message рд╕рдВрджреЗрд╢ рдПрдХрддреНрд░ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ
spi_sync () рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ
ред рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреЗ рджреМрд░рд╛рди рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ
рд╡рд╛рд▓реА рдмрд╛рдЗрдЯ рд╡реИрд╢реНрд╡рд┐рдХ рд╡реИрд░рд┐рдПрдмрд▓ рд░рд┐рдЯреЗрд▓ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдореЗрд╢рд╛ fduplex_mode рдлреНрд▓реИрдЧ рд╕реЗрдЯ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдорд╛рди рд╡рд┐рд╢реЗрд╖рддрд╛ рд░реАрдбрд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рд╡рд╛рдкрд╕ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдореЛрдб рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдХреЗрд╡рд▓ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдореЛрдб рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЗрд╕реЗ рджреЛ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ led_mode рдФрд░ fduplex_mode рдореЗрдВ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛, рдЬреЛ рдХреНрд░рдорд╢рдГ рдкреНрд░рджрд░реНрд╢рди рдореЛрдб рдФрд░ рджреНрд╡реИрдз рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред
рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЖрдк рдореЗрдВ рд╕реЗ рдХрдИ рдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЬрдм рдЖрдк рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдХрдИ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рд╕реЗ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдлрд╝рд╛рдЗрд▓ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛ред рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХреБрдЫ рднреА рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдпрд╣рд╛рдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕реНрдкрд╖реНрдЯ рджреМрдбрд╝ рдХреА рд╕реНрдерд┐рддрд┐ рд╣реИред рдореИрдВрдиреЗ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдХреЛрдб рдХреЛ рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдореИрдВ
рддрд╛рд▓рд╛ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП
рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдЧрд╛рдЗрдб рдкрдврд╝рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдЙрдардирд╛ рдЪрд╛рд╣рд┐рдПред
5. рдкреНрд░рд▓реЗрдЦрди
рдХреЛрд░ рдкреНрд░рд▓реЗрдЦрди рдХреА рдЦреЛрдЬ рдХреЗ рдореБрджреНрджреЗ рдкрд░ рдкрд╣рд▓реЗ рд╣реА
рдпрд╣рд╛рдВ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛ рдЪреБрдХреА
рд╣реИ ред
рдХрд░реНрдиреЗрд▓ рд╕реНрд░реЛрдд рдкреНрд░рд▓реЗрдЦрди / рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдкреНрд░рд▓реЗрдЦрди рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдЖрддреЗ рд╣реИрдВред , .
kerneldoc. API :
sudo apt-get install xmlto make htmldocs
:
www.kernel.org/doc, Unreliable Guide To Hacking The Linux Kernel:
www.kernel.org/doc/htmldocs/kernel-hacking.htmlc SPI Linux Documentation/spi, spi-summary spidev. spidev: spidev_fdx.c spidev_test.c; .
sysfs Documentation/filesystems/sysfs.txt.
API SPI : SPI Linux kernel API description
www.kernel.org/doc/htmldocs/device-drivers/spi.html- Linux Cross Reference:
lxr.linux.no lxr.free-electrons.comFree Electrons:
free-electrons.com/docs Embedded Linux, .
, , .