Petalinux对zcu106编译自定义驱动模块

平台

ubuntu16.04
petalinux2018.3
vscode编辑器

前言

之前写过imx28的驱动,这次因为毕设要用zcu106的vcu,涉及到驱动的部分,所以再来回顾下开发流程,petalinux工具提供了极大的便利,对于开发来说,但也有自己的坏处,每次编译贼慢,想直接载kenrel中编译写makefile又出问题,算了就这样吧。

过程

1、创建linux,见上一篇文章,这里硬件平台挂载一个PL的自定义gpio输出,硬件框图如下所示:

这里的gpio全部挂载到pl的led上,然后4个一组,挂载两组,查看他们的地址线,如下

2、修改设备树,这里加一个led,根目录加上如下:

/include/ "system-conf.dtsi"
/ {zynqmp-ledctl {#address-cells = <0x1>;#size-cells = <0x1>;compatible = "xlnx,zynqmp-ledctl";status = "okay";reg = < 0x80000000 0x04     /* data 0*/0x80001000 0x04 >;  /* oen  0*/};
};

3、创建自己的module,这里起一个zynqmp-ledctl

petalinux-create -t modules --name zynqmp-ledctl --enable

4、核心驱动部分如下,open、read自己写吧,下面主要是创建设备、类、驱动啥的

static int setup_ledctl_cdev(void)
{alloc_chrdev_region(&zynqmp_ledctl_dev.dev_id, 0, DEVLED_CNT, DRIVER_NAME);zynqmp_ledctl_dev.major = MAJOR(zynqmp_ledctl_dev.dev_id);cdev_init(&zynqmp_ledctl_dev.cdev, &zynmp_ledctl_fops);cdev_add(&zynqmp_ledctl_dev.cdev, zynqmp_ledctl_dev.dev_id, DEVLED_CNT);zynqmp_ledctl_dev.class = class_create(THIS_MODULE, DRIVER_NAME);if (IS_ERR(zynqmp_ledctl_dev.class)) {return PTR_ERR(zynqmp_ledctl_dev.class);}zynqmp_ledctl_dev.device = device_create(zynqmp_ledctl_dev.class, NULL,\zynqmp_ledctl_dev.dev_id, NULL, DRIVER_NAME);if (IS_ERR(zynqmp_ledctl_dev.device)) {return PTR_ERR(zynqmp_ledctl_dev.device);}return 0;
}static int zynqmp_ledctl_probe(struct platform_device *dev)
{u32 val = 0;int ret;u32 regdata[6];const char *str;struct property *proper;/* 获取设备树中的属性数据 *//* 1、获取设备节点 */zynqmp_ledctl_dev.nd = of_find_node_by_path("/zynqmp-ledctl");if(zynqmp_ledctl_dev.nd == NULL) {printk("zynqmp-ledctl node nost find!\r\n");return -EINVAL;} else {printk("zynqmp-ledctl node find!\r\n");}/* 2、获取 compatible 属性内容 */proper = of_find_property(zynqmp_ledctl_dev.nd, "compatible", NULL);if(proper == NULL) {printk("compatible property find failed\r\n");} else {printk("compatible = %s\r\n", (char*)proper->value);}/* 3、获取 status 属性内容 */ret = of_property_read_string(zynqmp_ledctl_dev.nd, "status", &str);if(ret < 0){printk("status read failed!\r\n");} else {printk("status = %s\r\n",str);}ret = of_property_read_u32_array(zynqmp_ledctl_dev.nd, "reg", regdata, 4);if(ret < 0) {printk("reg property read failed!\r\n");} else {u8 i = 0;printk("reg data:\r\n");for(i = 0; i < 4; i++)printk("%#X ", regdata[i]);printk("\r\n");}      data_r = ioremap(regdata[0], regdata[1]);printk("%#X ", data_r);data1_r = ioremap(regdata[2], regdata[3]);printk("%#X ", data1_r );setup_ledctl_cdev();if(data_r)zynqmp_ledctl_set_dir(1, 1);return 0;
}

5、编译

petalinux-build -c zynqmp-ledctl#only for moudule
petalinux-build -c device-tree#only for device-tree
petalinux-build #for all
petalinux-package --boot --format BIN --fsbl images/linux/zynqmp_fsbl.elf --u-boot images/linux/u-boot.elf --pmufw images/linux/pmufw.elf --fpga images/linux/*.bit --force
#combine to image

5、开机加载驱动,zynqmp-ledctl就是我们编写的驱动

加载驱动之后可以在/dev下查看到我们的设备zynqmp-ledctl
6、测试app编写,因为主机超级终端啥的都是在win10,所以app在win10上交叉编译了,之前有过教程怎么配环境,编写app

int main(char argc, char *argv[])
{printf("Joydon Jiang@doncejiang@163.com\n");if(argc < 3){printf("app : %s ,error input!\r\n", argv[0]);return -1;}char* file_name = argv[1];printf("app : %s\r\n", file_name);int fd = open(file_name, O_RDWR);if(fd < 0){printf("app : %s , file %s open failed!\r\n", argv[1]);return -1;}unsigned char val = atoi(argv[2]);int ret = write(fd, &val, sizeof(val));if(ret < 0){printf("app : %s , file %s write failed!\r\n", argv[1]);close(fd);return -1;}ret = close(fd);return 0;
}

很简单一看就懂,下面进行代码测试,然后再win10下make

通过lrz工具通过串口传输到开发板

测试

运行app如下:

开发板亮灯,踩坑完成,告辞

编译进内核

正常传统配置Linux默认内核加载项是在Makefile记忆Kconfig中修改,参考链接

https://blog.csdn.net/cediy2088long/article/details/7409236

现在是加一条命令:

donce@donce:~/project/linux_img/nohdmi$ petalinux-build -x mrproper
donce@donce:~/project/linux_img/nohdmi$ petalinux-build -c zynqmp-ledctl -x do_install

这里就是点灯的驱动安装在内核中,然后进行编译测试,失败,哈哈,以后再搞吧,先记录下。

Petalinux对zcu106编译自定义驱动模块相关推荐

  1. gcc编译自定义头文件

    2019独角兽企业重金招聘Python工程师标准>>> C中外部函数实例 内部函数:static声明,只对本文件域生效,外部不可引用 外部函数,使用extern声明,默认可以去掉,在 ...

  2. Raspberry PI 编译WLan驱动模块, 并配置登录WIFI

    1. 硬件说明: 手头的Raspberry PI 还是1代 B+型号. 出入无线网卡型号: Comfast, CF-WU835P, 树莓派一点反映都没有. windows下插入网卡, 提示芯片型号为: ...

  3. buildroot添加编译自定义APP源码的方法

    概要 buildroot添加编译自定义APP源码, 首先在package/Config.in中添加指向新增APP目录的Config.in: 然后在package中新增目录APP,并在里面添加Confi ...

  4. OpenWrt编译自定义固件

    OpenWrt编译自定义固件 1.编译环境搭建 OpenWrt官网 https://openwrt.org/ OpenWrt源码地址 https://github.com/openwrt/openwr ...

  5. build 之前执行task_浅谈VS编译自定义编译任务—MSBuild Task(csproject)-阿里云开发者社区...

    在上一篇浅谈.NET编译时注入(C#-->IL)中我们简单的反编译查看了几种c#语法糖和PostSharp在编译成IL时为我做的MSIL注入.紧接着在这节,要来看的就是MSBuild Task. ...

  6. Android编译自定义sdk,java – 使用自定义android.bluetooth.而不是在android studio中默认的sdk android.jar中存在一个...

    我想使用自定义android.bluetooth而不是Android SDK附带的android.jar中的presend.我将android.bluetooth编译成单独的jar文件并导入到stud ...

  7. Android编译自定义sdk,向Android SDK中添加自定义的库 (Addon)

    一般情况下, Android中的第三方应用程序SDK都由开发者直接打包发布,在使用SDK的时候,将所需要的文件(jar.native共享库)加入到项目中 ,这是最通用的方式.不过对于每个应用程序而言, ...

  8. 单独编译某个驱动模块

    CROSS_COMPILE:指定编译器的前缀 ARCH:指定平台 export:用于设置或显示环境变量 -C: 指定Linux内核源代码的根目录 M:指定单独编译的模块所在的目录 参考:编译模块命令m ...

  9. Android:源码环境编译自定义的APP到ROM(System Image)中

    有时候我们需要在源码环境中增加自己的应用或模块,随ROM一起发布. 下面讲述相关步骤: 1. 首先可以在SDK环境下进行编码设计(如果你的APP不涉及到emulator无法模拟的硬件的话) 也可以参考 ...

最新文章

  1. (并查集 带关系)Find them, Catch them -- poj -- 1703
  2. oracle数据库简单操作
  3. MATLAB从入门到精通-matlab中符号推导应用及相关技巧
  4. Sicily 1817 校歌手大奖赛
  5. KRKR简单使用实例开发
  6. 复方丙酸氯倍他索软膏購買技巧
  7. linux进程上下文切换,Linux 性能分析总结之 CPU 上下文切换(二)
  8. 风变编程python论文_如何看待风变编程的 Python 网课?
  9. java applet程序设计,Java Applet程序设计基础
  10. oracle 实现 自增主键功能
  11. SharePoint 2010 使用沙盒解决方案隐藏页面中的”元素”
  12. 《java程序设计》第十一周学习小结 201671010130
  13. HTML5 web SQL 和indexedDB的使用
  14. Visio的基本使用教程
  15. Android本地音乐播放器的制作
  16. TPC,TPCC,TPMC(计算机性能衡量指标) -----
  17. wamp mysql 密码_WAMP中的mysql设置密码
  18. ios-获取相册相机图片
  19. [BZOJ3144]切糕
  20. 服务器淘汰cpu组装的电脑,从服务器淘汰下来的至强cpu还可以用多久

热门文章

  1. 分析人工智能审核优点及智能审核原理
  2. 进程(三)—— 查看进程状态、进程优先级
  3. 律师所小程序开发 律师小程序开发定制 律所小程序源码定制
  4. 另一台电脑中res文件无法用adams打开
  5. 免费为网站配置ssl证书, 使网站变成https.半小时搞定
  6. 移动端测试-高级手势TouchAction-笔记
  7. Spring详解-------依赖注入的三种方式实例详解
  8. 股票的基础知识、除权与除息
  9. CDA数据分析师 - 数据分析概述
  10. 购物车html页面,简单实用的商品购物和添加购物车界面设计