hello,好的,谢谢,想请教一下,您那边有没有添加过SPI的设备,我这边加载了几次驱动,好像都没有识别。
先确认你的dts里的这个电压是不是配置为正确的:&vcc_1v8
android代码有kernel\drivers\spi\spi-w25q128fw-test.c
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/err.h>
#include <linux/io.h>
#include <linux/of.h>
#include <linux/interrupt.h>
#include <linux/platform_device.h>
#include <linux/spi/spi.h>
#include <linux/spi/spidev.h>
#include <linux/fs.h>
#include <linux/device.h>
#include <linux/slab.h>
#include <linux/cdev.h>
#include <linux/gpio.h>
#include <linux/input.h>
#include <linux/sched.h>
#include <linux/wait.h>
#include <linux/delay.h>
#include <asm/uaccess.h>
#include <asm/io.h>
#include <linux/ioctl.h>
#include <linux/soc/rockchip/rk_vendor_storage.h>
#define w25q128fw_DEVICE_ID 0x6018
#define w25q128fw_SPI_READ_ID_CMD 0x9F
static int w25q128fw_id=0;//0:NG,1:OK
static int w25q128fw_spi_read_id(struct spi_device *spi)
{
int status;
char tbuf[] = {w25q128fw_SPI_READ_ID_CMD};
char rbuf[3];
status = spi_write_then_read(spi, tbuf, sizeof(tbuf), rbuf, sizeof(rbuf));
if (status == 0){
printk("w25q128fw: ID = %02x %02x %02x\n",rbuf[0], rbuf[1], rbuf[2]);
if(w25q128fw_DEVICE_ID==(rbuf[1]<<8|rbuf[2])){
printk("w25q128fw is ok\n");
w25q128fw_id=1;
}
else
w25q128fw_id=0;
}
else {
printk("%s: read ID error\n", __FUNCTION__);
w25q128fw_id=0;
}
return status;
}
static int w25q128fw_spi_probe(struct spi_device *spi)
{
int ret = 0;
struct device_node __maybe_unused *np = spi->dev.of_node;
printk("w25q128fw_spi_probe\n");
if(!spi)
return -ENOMEM;
printk("w25q128fw_spi_probe: setup mode %d, %s%s%s%s%u bits/w, %u Hz max\n",
(int) (spi->mode & (SPI_CPOL | SPI_CPHA)),
(spi->mode & SPI_CS_HIGH) ? "cs_high, " : "",
(spi->mode & SPI_LSB_FIRST) ? "lsb, " : "",
(spi->mode & SPI_3WIRE) ? "3wire, " : "",
(spi->mode & SPI_LOOP) ? "loopback, " : "",
spi->bits_per_word, spi->max_speed_hz);
w25q128fw_spi_read_id(spi);
return ret;
}
static struct of_device_id w25q128fw_match_table[] = {
{ .compatible = "khadas,rk3399-spi",},
{},
};
static struct spi_driver w25q128fw_spi_driver = {
.driver = {
.name = "w25q128fw-spi",
.owner = THIS_MODULE,
.of_match_table = w25q128fw_match_table,
},
.probe = w25q128fw_spi_probe,
};
static int w25q128fw_spi_init(void)
{
return spi_register_driver(&w25q128fw_spi_driver);
}
module_init(w25q128fw_spi_init);
static void w25q128fw_spi_exit(void)
{
spi_unregister_driver(&w25q128fw_spi_driver);
}
module_exit(w25q128fw_spi_exit);
MODULE_AUTHOR("goenjoy <goenjoy@khadas.com>");
MODULE_DESCRIPTION("khadas SPI TEST Driver");
MODULE_LICENSE("GPL");
电压配置没问题,驱动程序应该没问题,因为现在开机打印信息里没有看到关于spi的设备信息,感觉是设备树配置得有问题,想请教一下您那边有没有设备树配置spi的例子?
还有想请教一下这个电压配置是有什么作用吗?
&spi1 {
spi_test: spi_test@00{
compatible = “khadas,rk3399-spi”;
reg = <0x00>;
spi-max-frequency = <48000000>;
status = “okay”;
};
};
电压匹配,配置不对,spi会有问题
hello,我们现在外设芯片用的就是3.3V的电平,是不是这里就不需要改成1.8V?
看红色箭头,这电源域接的是1.8V,所以dts要配置对应的1.8V。
你的外设要改成1.8V。
hello,现在spi的clk用逻辑分析仪抓,或者用示波器一直是低电平是什么原因呢?
当初我也遇到过这个问题,抓不到波形,后面在读写函数上连续读写2000次才能抓到。