移植WK2124

  • 一、实验目的
  • 二、WK2124简介
  • 三、驱动源代码下载
  • 四、板级配置
  • 五、Makefile
  • 六、驱动代码修改
  • 总结

一、实验目的

将两路SPI接口扩展为8路UART接口

二、WK2124简介

目前WK系列能实现SPI扩展uart的芯片包括 WK2124、WK2204、WK2168、WK2132。目前 WK2124、WK2204、WK2168 能实现 SPI 扩展 4 路 UART,WK2132能实现扩展 2 路 UART。目前这几款芯片使用的都是相同的 linux 驱动。
WK 系列扩展的子通道的 UART 具备如下功能特点:

  1. 每个子通道 UART 的波特率、字长、校验格式可以独立设置,最高可以提供2Mbps 的通信速率。

  2. 每个子通道具备收/发独立的 256 级 FIFO,FIFO 的中断可按用户需求进行编程触发点且具备超时中断功能。

三、驱动源代码下载

下载链接直达:http://wkmic.com/News_List.php?tag=Jszc&theId=14%22
然后我们将.c和,h文件以及Makefile上传到我们得虚拟机中。

四、板级配置

目前在使用手上这块开发板提供的内核驱动好像是不支持设备树配置的,我按照手册的方式配置设备树一直没有生效,那我们只能手动在板级文件中添加设备节点,文件位于/home/stylle/01_nuc977/02.linux_kernel/arch/arm/mach-nuc970/,文件名为dev.c,然后我们看到spi相关部分,因为我们制作的板子不需要spi作为其他使用所以我这里将该文件所有有关spi的代码都先注释掉,然后添加我这里需要的内容;

这里提供spi0的配置:

/* SPI */
static struct nuc970_spi_info nuc970_spi0_platform_data = {.num_cs     = 2,.lsb       = 0,.txneg     = 1,.rxneg     = 0,.divider   = 4,.sleep     = 0,.txnum     = 0,.txbitlen  = 8,.bus_num   = 0,
};static struct resource nuc970_spi0_resource[] = {[0] = {.start = NUC970_PA_SPI0,.end   = NUC970_PA_SPI0 + NUC970_SZ_SPI0 - 1,.flags = IORESOURCE_MEM,},[1] = {.start = IRQ_SPI0,.end   = IRQ_SPI0,.flags = IORESOURCE_IRQ,}
};struct platform_device nuc970_device_spi0 = {.name         = "nuc970-spi0",.id          = -1,.num_resources    = ARRAY_SIZE(nuc970_spi0_resource),.resource   = nuc970_spi0_resource,.dev      = {.platform_data = &nuc970_spi0_platform_data,}
};static struct spi_board_info nuc970_spi0_board_info[] __initdata = {{.modalias = "wk2124-spi0", 和设备一亿uid.max_speed_hz = 10000000,.bus_num = 0,.chip_select = 0,       //use SS1.mode = SPI_MODE_0,.irq = IRQ_SPI0,},
};static struct nuc970_spi_info nuc970_spi1_platform_data = {.num_cs       = 2,.lsb       = 0,.txneg     = 1,.rxneg     = 0,.divider   = 4,.sleep     = 0,.txnum     = 0,.txbitlen  = 8,.bus_num   = 1,
};static struct resource nuc970_spi1_resource[] = {[0] = {.start = NUC970_PA_SPI1,.end   = NUC970_PA_SPI1 + NUC970_SZ_SPI1 - 1,.flags = IORESOURCE_MEM,},[1] = {.start = IRQ_SPI1,.end   = IRQ_SPI1,.flags = IORESOURCE_IRQ,}
};struct platform_device nuc970_device_spi1 = {.name         = "nuc970-spi1",.id          = -1,.num_resources    = ARRAY_SIZE(nuc970_spi1_resource),.resource   = nuc970_spi1_resource,.dev      = {.platform_data = &nuc970_spi1_platform_data,}
};static struct spi_board_info nuc970_spi1_board_info[] __initdata = {{.modalias = "wk2124-spi1",.max_speed_hz = 10000000,.bus_num = 1,.chip_select = 0,       //use SS0.mode = SPI_MODE_0,.irq = IRQ_SPI1,},
};

然后我们还需要在该文件中找到总线初始化中添加spi的设备,该函数在dev.c的末尾

// 添加到该函数中
void __init nuc970_platform_init(struct platform_device **device, int size);// 内容spi总线注册函数spi_register_board_info(nuc970_spi0_board_info, ARRAY_SIZE(nuc970_spi0_board_info));spi_register_board_info(nuc970_spi1_board_info, ARRAY_SIZE(nuc970_spi1_board_info));

然后我们将修改后的kernel编译烧录到板子上,然后可以查看/sys/bus/目录下查看到我们配置的总线已经生效了,下面开始进行驱动相关代码配置。

五、Makefile

根据官方提供的Makefile我们只需要修改交叉编译器和内核源码目录即可

# 修改为我们自己的编译器
MVTOOL_PREFIX = arm-linux-
# 修改为我们自己的内核驱动路径,这里需要保证板子的内核和这里的路径内核相同,且保证内核已经编译通过
KDIR := /home/stylle/01_nuc977/02.linux_kernel

六、驱动代码修改

// 这个结构体的匹配优先级在下面的优先级之上这里我们直接注释掉使用下面的方式匹配即可
#if 0
static const struct of_device_id rockchip_spi_wk2xxx_dt_match[] = {{ .compatible = "wkmisc,wk2124spi0", },{ },
};
MODULE_DEVICE_TABLE(of, rockchip_spi_wk2xxx_dt_match);
#endifstatic struct spi_driver wk2xxx_driver[2] = {[0]{.driver = {.name           = "nuc970_wk2124_spi0", //这里的名字需要保证和我们上面添加的板级文件的总线名称对应才能匹配到.bus            = &spi_bus_type,.owner          = THIS_MODULE,// .of_match_table = of_match_ptr(rockchip_spi_wk2xxx_dt_match), // 设备树匹配},.probe          = wk2xxx_probe, // 匹配成功后调用.remove         = wk2xxx_remove,  // 驱动卸载后调用.resume         = wk2xxx_resume,},
};

然后还需要更改我们的中断引脚,否则驱动生成了串口节点也是无法收发消息的;
这里官方移植的驱动代码是移植到瑞星微平台,所以该函数名我们也可以修改一下

static int nuc970_spi_parse_dt(struct device *dev)
{int irq; printk(KERN_ERR "-nuc970_spi_parse_dt()------in---\n");
#if 0// 从设备树获取IRQ——GPIOint irq_gpio, irq_flags, irq_gpio = of_get_named_gpio_flags(dev->of_node, "irq_gpio", 0,(enum of_gpio_flags *)&irq_flags);if (!gpio_is_valid(irq_gpio)){printk(KERN_ERR"invalid wk2xxx_irq_gpio: %d\n", irq_gpio);return -1;}
#endifirq = gpio_to_irq(NUC970_PB1); // 这里根据自己原理图上IRQ引脚进行修改if(!irq){printk(KERN_ERR"wk2xxx_irqGPIO: %d get irq failed!\n", irq);//gpio_free(s->irq_gpio);return -1;}printk(KERN_ERR"wk2xxx_irq_gpio: %d, irq: %d", NUC970_PB1, irq);printk(KERN_ERR"-nuc970_spi_parse_dt()------out---\n");return irq;
}

到这里代码的修改也就基本完成了,只不过使用两路spi的话还需要做一些修改,后续我会分享我移植的代码并上传提供下载使用。

//test spido{wk2xxx_read_global_reg(spi,WK2XXX_GENA,dat);printk(KERN_ERR "wk2xxx_probe()  GENA = 0x%X\n",dat[0]);wk2xxx_write_global_reg(spi,WK2XXX_GENA,0xf5);wk2xxx_read_global_reg(spi,WK2XXX_GENA,dat);printk(KERN_ERR "wk2xxx_probe()  GENA = 0x%X\n",dat[0]);wk2xxx_write_global_reg(spi,WK2XXX_GENA,0xf0);wk2xxx_read_global_reg(spi,WK2XXX_GENA,dat);printk(KERN_ERR "wk2xxx_probe()  GENA = 0x%X\n",dat[0]);}while(0);
/test spi //

总结

1、正常的情况下我们insmod模块过后上面这段代码打印的信息如图所示,否则表示spi通信异常;
2、当驱动加载过后在/dev中正常生成了串口节点过后串口无法通信的话一般问题都是出在irq中断引脚的地方。

目前驱动开发还没有学习完很多地方还是不懂,wk2124这个驱动还是相对来说比较简单的,但是我也在这上面花了不少时间,但本次移植该驱动的过程中算是熟悉了一遍platfrom总线匹配,以及串口设备的注册和spi设备的使用,算是有一些收获。

文件下载单文件版本双spi未进行测试,spi0和spi1为测试正常使用:链接:https://pan.baidu.com/s/1lMq7jSe3k5LX5vQCKA_ynA
提取码:ix73

【ARM】新唐NUC977移植WK2124驱动相关推荐

  1. 【Linux】新唐NUC977系统编译及烧写流程

    新唐NUC977系统编译及下载流程 前言 一.UBoot的编译 二.Kernel的编译 三.文件系统的制作 四.系统的烧录 烧录u-boot-spl.bin 烧写u-boot.bin 烧写env.tx ...

  2. 【Linux】新唐NUC977编译第一个内核驱动程序Hello World

    Hello World内核驱动程序 前言 一.文件的编写 二.内核的编译及烧录 2022-5-20补充控制LED灯 最后 前言    相关简介:   1,增加驱动文件 hello.c 和对应的 Mak ...

  3. 学习ARM架构,系统移植和驱动开发总结

    本次结束了对ARM架构,系统移植和驱动开发的学习,它们都是属于底层,难度想对都比较的难一点,但先学习arm架构之后去学习系统移植和驱动开发,会使自己对系统移植和驱动开发容易理解点. arm架构 arm ...

  4. 新唐单片机移植RT-Thread,Finsh组件的接口函数编写

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.RTT的移植 二.具体函数代码 1.rt_hw_console_output的编写 2.rt_hw_console ...

  5. 新唐NUC980使用记录:开发环境准备与编译配置基础说明

    文章目录 目的 开发环境准备 调试烧录环境 开发编译环境 编译工具链 uboot 和 linux buildroot 应用程序示例 NUC980 NuWriter Linux command line ...

  6. 新唐M251 CORTEX-M23内核移植TencentOS tiny教程

    Cortex M23 移植TencentOS tiny 准备源码和工具 准备硬件.软件 移植开始 准备源码和工具 TencentOS tiny的源码地址在这: TencentOS tiny. MDK软 ...

  7. 新唐单片机keil驱动问题

    1:新唐单片机keil编译工具,资料都可以在新唐官网下载.keil驱动软件要安装在keil安装的目录下,今天安装了很久,一直提示不成功,就是因为驱动Nu-link driver 没有安装到keil安装 ...

  8. 【原创】ARM LINUX 外部RTC实时时钟驱动移植(RX8025)

    [原创]ARM LINUX 外部RTC实时时钟驱动移植(RX8025) Author: chad Mail: linczone@163.com 开发板:AT91SAM9260 内核版本:linux-2 ...

  9. 新唐ARM®Cortex™-M0特点总结

    ARM®CortexTM-M0特点: 主频50mhz主频,0.9DMIPS/MHz(相当于8位和16位产品的2-4倍) 小的处理内核,系统和存储器,可以降低器件成本 完善的电源管理(睡眠,深度睡眠和深 ...

最新文章

  1. 数据库配置,参考django框架,采用嵌套的字典实现
  2. 你想使用自己编译的内核进行工作吗?
  3. 剑指offer 二叉搜索树的后序遍历
  4. NeurIPS 2020 所有RL papers全扫荡
  5. C++实现输入任意大小的整形数组并且利用冒泡排序法进行升序排序并且进行二分查找
  6. Url 助手类(Url Helper)
  7. 鸟哥私房菜重温笔记4
  8. 实时分析:Flume+Kafka+SparkStreaming商品评分排行榜
  9. 自己的服务器进不去显示403,HTTP 403错误:含义和解决方法
  10. “Stream has already been operated upon or closed” Exception in Java
  11. linux文件操作chown,chmod,chgrp命令的使用
  12. JAVA核心编程之集合
  13. 区块链公司依靠电信主网颠覆汇款行业
  14. shell 关闭电脑wifi_笔记本通过命令配置wifi win7系统
  15. 身份证号码组件:lt;idcardgt; —— 快应用组件库H-UI
  16. shell脚本保姆级教程,附赠100个shell脚本案例!
  17. Elasticsearch(ES) 基本知识
  18. MATLAB——直方图操作
  19. 数字图像 - 图像隐写
  20. Zxing系列之设置二维码图片背景透明教程

热门文章

  1. Linux--解决上cf慢的问题(通过修改hosts)
  2. 天地元黄-恢宏古宋宣和之昌盛(从千字文版本说到逐浪字库的立身理念)
  3. 微信开源C++Libco介绍与应用(二)
  4. 离散数学20_第1章_等价符号⇔的定义
  5. vivado 基于cordic IP核的波形发生器
  6. 【HTML 教程系列第 11 篇】HTML 中常用的文本格式化标签
  7. MATLAB 欧拉法、改进的欧拉法、龙格库塔法
  8. 在VM中安装vmware-tools ,使用tar命令解压文件时显示无法mkdir:只读文件系统
  9. 嘀嘀快的微信支付宝打群架,司机乘客乐开花
  10. QT报make: Circular all <- first dependency dropped.错误解决。