全志R16平台SPI0接口的验证V1.1(分色排版)

来源:互联网 发布:ubuntu syslog 配置 编辑:程序博客网 时间:2024/05/22 15:00

全志R16平台SPI0接口的验证

2017/10/20 16:50

版本:V1.1

 

 

1、确定driver的name为spidev:

Q:\r16_tinav2.1\spi_csdn_tinav2.1\lichee\linux-3.4\drivers\spi\spidev.c

static struct spi_driver spidev_spi_driver = {

.driver = {

.name ="spidev",

.owner = THIS_MODULE,

},

.probe = spidev_probe,

.remove = __devexit_p(spidev_remove),

 

/* NOTE:  suspend/resume methods are not necessary here.

 * We don't do anything except pass the requests to/from

 * the underlying controller.  The refrigerator handles

 * most issues; the controller driver handles the rest.

 */

};

 

 

 

 

2、打开spi0,定义spi_dev_num的数量大于1,定义spi_board0的modalias为spidev(必须和驱动保持一致):

Q:\r16_tinav2.1\spi_csdn_tinav2.1\target\allwinner\astar-parrot\configs\sys_config.fex

;----------------------------------------------------------------------------------

;SPI controller configuration

;spi_used       = SPIx enable

;spi_cs_bitmap  = SPI bit mapping

;----------------------------------------------------------------------------------

[spi0]

spi_used       = 1

spi_cs_bitmap  = 1

spi_mosi       = port:PC00<3><default><default><default>

spi_miso       = port:PC01<3><default><default><default>

spi_sclk       = port:PC02<3><default><default><default>

spi_cs0        = port:PC03<3><1><default><default>

 

[spi1]

spi_used       = 0

spi_cs_bitmap  = 1

spi_cs0        = port:PA00<2><1><default><default>

spi_sclk       = port:PA01<2><default><default><default>

spi_mosi       = port:PA02<2><default><default><default>

spi_miso       = port:PA03<2><default><default><default>

 

;----------------------------------------------------------------------------------

;SPI device configuration

;spi_dev_num: number of spi devices

;----------------------------------------------------------------------------------

[spi_devices]

spi_dev_num = 1

 

;----------------------------------------------------------------------------------

;[spi_board0] spi device configuration

;modalias      = spi device name

;sflash_size    = spi flash size, optional, if spi_board0 is nor flash , carefully

;max_speed_hz  = max transfer speed

;bus_num       = bus ID

;chip_select   = chip select, 0,1

;mode          = SPI transfer mode

;----------------------------------------------------------------------------------

[spi_board0]

;modalias      = "at25df641"

modalias      = "spidev"

sflash_size   = 32

max_speed_hz  = 50000000

bus_num       = 0

chip_select   = 0

mode          = 0

 

 

 

 

3、原始编译:

rootroot@cm-System-Product-Name:/home/rediron/r16_tinav2.1$ tar zxvf r16_tinav2.1_csdn_20170901_1040.tar.gz

rootroot@cm-System-Product-Name:/home/rediron/r16_tinav2.1$

rootroot@cm-System-Product-Name:/home/rediron/r16_tinav2.1$ mv tina spi_csdn_tinav2.1

rootroot@cm-System-Product-Name:/home/rediron/r16_tinav2.1$

rootroot@cm-System-Product-Name:/home/rediron/r16_tinav2.1$ cd spi_csdn_tinav2.1/

rootroot@cm-System-Product-Name:/home/rediron/r16_tinav2.1/spi_csdn_tinav2.1$

rootroot@cm-System-Product-Name:/home/rediron/r16_tinav2.1/spi_csdn_tinav2.1$ source build/envsetup.sh 

rootroot@cm-System-Product-Name:/home/rediron/r16_tinav2.1/spi_csdn_tinav2.1$ lunch

     30. astar_parrot-tina

Which would you like?30

rootroot@cm-System-Product-Name:/home/rediron/r16_tinav2.1/spi_csdn_tinav2.1$ make -j12

rootroot@cm-System-Product-Name:/home/rediron/r16_tinav2.1/spi_csdn_tinav2.1$ pack -d

 

 

刷机之后:

root@TinaLinux:/#

root@TinaLinux:/# find . -name spi*

./proc/irq/97/spi0

./sys/bus/spi

./sys/bus/spi/devices/spi0.0

./sys/bus/platform/devices/spi.0

./sys/bus/platform/drivers/spi

./sys/bus/platform/drivers/spi/spi.0

./sys/devices/platform/spi.0

./sys/devices/platform/spi.0/spi_master

./sys/devices/platform/spi.0/spi_master/spi0

./sys/devices/platform/spi.0/spi_master/spi0/spi0.0

./sys/class/spi_master

./sys/class/spi_master/spi0

./sys/kernel/debug/clk/hosc/pll_periph/pll_periphahb1/ahb1/spinlock

./sys/kernel/debug/clk/hosc/pll_periph/spi0

./sys/kernel/debug/clk/hosc/spi1

root@TinaLinux:/#

 

 

 

 

4、在内核中打开SPI(生成设备节点/dev/spidev0.0):

rootroot@cm-System-Product-Name:/home/rediron/r16_tinav2.1/spi_csdn_tinav2.1$ make kernel_menuconfig

Device Drivers  --->

[*] SPI support  --->

< >   User mode SPI device driver support

修改为:

<*>   User mode SPI device driver support

 

 

rootroot@cm-System-Product-Name:/home/rediron/r16_tinav2.1/spi_csdn_tinav2.1$ make -j12

rootroot@cm-System-Product-Name:/home/rediron/r16_tinav2.1/spi_csdn_tinav2.1$ pack -d

 

 

(有兴趣的可以看看增加了哪些东西!)

root@TinaLinux:/# find . -name spi*

./dev/spidev0.0

./proc/irq/97/spi0

./sys/bus/spi

./sys/bus/spi/devices/spi0.0

./sys/bus/spi/drivers/spidev

./sys/bus/spi/drivers/spidev/spi0.0

./sys/bus/platform/devices/spi.0

./sys/bus/platform/drivers/spi

./sys/bus/platform/drivers/spi/spi.0

./sys/devices/platform/spi.0

./sys/devices/platform/spi.0/spi_master

./sys/devices/platform/spi.0/spi_master/spi0

./sys/devices/platform/spi.0/spi_master/spi0/spi0.0

./sys/devices/platform/spi.0/spi_master/spi0/spi0.0/spidev

./sys/devices/platform/spi.0/spi_master/spi0/spi0.0/spidev/spidev0.0

./sys/class/spi_master

./sys/class/spi_master/spi0

./sys/class/spidev

./sys/class/spidev/spidev0.0

./sys/kernel/debug/clk/hosc/pll_periph/pll_periphahb1/ahb1/spinlock

./sys/kernel/debug/clk/hosc/pll_periph/spi0

./sys/kernel/debug/clk/hosc/spi1

./sys/module/spidev

root@TinaLinux:/#

root@TinaLinux:/#

 

 

 

 

5、增加SPI的测试验证程序(spidev_test.c):

rootroot@cm-System-Product-Name:/home/rediron/r16_tinav2.1/spi_csdn_tinav2.1$

rootroot@cm-System-Product-Name:/home/rediron/r16_tinav2.1/spi_csdn_tinav2.1$ find . -name spidev_test.c

./lichee/linux-3.4/Documentation/spi/spidev_test.c

rootroot@cm-System-Product-Name:/home/rediron/r16_tinav2.1/spi_csdn_tinav2.1$

 

 

请严重注意:测试应用程序的名字不能叫:spidev_test。感觉是tinav2.1的SDK自动过滤掉了spidev_test这个应用程序名!

不过叫spidev_test0还是可以的!^_

 

W:\spi_csdn_tinav2.1\package\allwinner\spidev_test0\Makefile

W:\spi_csdn_tinav2.1\package\allwinner\spidev_test0\src\Makefile

 

spidev_test0.c这个就是lichee/linux-3.4/Documentation/spi/spidev_test.c,不过需要根据实际修改设备节点!)

默认为:static const char *device = "/dev/spidev1.1";

请改为:static const char *device = "/dev/spidev0.0";

W:\spi_csdn_tinav2.1\package\allwinner\spidev_test0\src\spidev_test0.c

static const char *device = "/dev/spidev0.0";

static uint8_t mode;

static uint8_t bits = 8;

static uint32_t speed = 500000;

static uint16_t delay;

 

static void transfer(int fd)

{

int ret;

//uint8_t tx[] = {

//0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,

//0x40, 0x00, 0x00, 0x00, 0x00, 0x95,

//0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,

//0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,

//0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,

//0xDE, 0xAD, 0xBE, 0xEF, 0xBA, 0xAD,

//0xF0, 0x0D,

//};

// CityBrand WelCome U!

uint8_t tx[] = {

0x43, 0x69, 0x74, 0x79, 0x42, 0x72, 0x61, 0x6E, 0x64, 0x20,

0x57, 0x65, 0x6C, 0x43, 0x6F, 0x6D, 0x65, 0x20, 0x55, 0x21,

0x43, 0x69, 0x74, 0x79, 0x42, 0x72, 0x61, 0x6E, 0x64, 0x20,

0x57, 0x65, 0x6C, 0x43, 0x6F, 0x6D, 0x65, 0x20, 0x55, 0x21,

0x43, 0x69, 0x74, 0x79, 0x42, 0x72, 0x61, 0x6E, 0x64, 0x20,

0x57, 0x65, 0x6C, 0x43, 0x6F, 0x6D, 0x65, 0x20, 0x55, 0x21,

};

uint8_t rx[ARRAY_SIZE(tx)] = {0, };

struct spi_ioc_transfer tr = {

.tx_buf = (unsigned long)tx,

.rx_buf = (unsigned long)rx,

.len = ARRAY_SIZE(tx),

.delay_usecs = delay,

.speed_hz = speed,

.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 < ARRAY_SIZE(tx); ret++) {

//if (!(ret % 6))

//puts(" ");

//printf("%.2X ", rx[ret]);

if (!(ret % 20)){

puts("\n");

}

printf("%c", rx[ret]);

}

//puts("");

puts("\n");

puts("\n");

puts("\n");

}

 

 

rootroot@cm-System-Product-Name:/home/rediron/r16_tinav2.1/spi_csdn_tinav2.1$ make menuconfig

Allwinner  --->

< > spidev_test0.................... spidev_test0 just test the SPI interface (NEW)

修改为:

<*> spidev_test0.................... spidev_test0 just test the SPI interface

 

rootroot@cm-System-Product-Name:/home/rediron/r16_tinav2.1/spi_csdn_tinav2.1$ make -j12

rootroot@cm-System-Product-Name:/home/rediron/r16_tinav2.1/spi_csdn_tinav2.1$ pack -d

 

 

开发板:SC3817R。

请将开发板上的U8引脚上的第2脚(SPI0-MISO)和第5脚(SPI0-MOSI)通过1k欧姆的电阻连接在一起!(不建议直连,阻值可以根据实际情况灵活决定!)

[   15.706372] xt_time: kernel timezone is -0000

[   16.581894] android_usb gadget: high-speed config #1: android

 

 

 

BusyBox v1.24.1 () built-in shell (ash)

 

 _____  _              __     _

|_   _||_| ___  _ _   |  |   |_| ___  _ _  _ _

  | |   _ |   ||   |  |  |__ | ||   || | ||_'_|

  | |  | || | || _ |  |_____||_||_|_||___||_,_|

  |_|  |_||_|_||_|_|  Tina is Based on OpenWrt!

 ----------------------------------------------

 Tina Linux (Neptune, 593A1793)

 ----------------------------------------------

root@TinaLinux:/#

root@TinaLinux:/# spidev_test0 

spi mode: 0

bits per word: 8

max speed: 500000 Hz (500 KHz)

 

 

CityBrand WelCome U!

 

CityBrand WelCome U!

 

CityBrand WelCome U!

 

 

 

 

 

root@TinaLinux:/#

(验证通过!)

 

 

 

 

参考资料:

http://www.xuebuyuan.com/1345420.html

Linux2.6.32下SPI驱动的移植如下图所示:

 

 

http://blog.sina.com.cn/s/blog_6182b82201011s6j.html

基于S3C2440的Linux SPI驱动移植笔记

 

阅读全文
0 0
原创粉丝点击