zedboard上首个驱动实践——Led

//  led驱动  *myled.c*//头文件
#include<linux/module.h> //最基本的文件,支持动态添加和卸载模块
#include<linux/kernel.h> //内核相关文件
#include<linux/fs.h> //包括文件操作相关struct的定义(struct file_operations和struct inode),MINOR、MAJOR的头文件
#include<linux/init.h> //初始化头文件
#include<linux/delay.h> //延时头文件
#include<asm/uaccess.h> //包括copy_to_user、copy_from_user等内核访问用户进程内存地址的函数定义
#include<asm/irq.h> //与处理器相关的中断
#include<asm/io.h> //包括ioremap、iowrite等内核访问IO内存等函数的定义
#include<asm/arch/regs-gpio.h> //与处理器相关的IO口操作
#include<asm/hardware.h> //与处理器相关的硬件
#include<linux/device.h> //包括device、class等结构的定义
#include<linux/slab.h> //包括kcalloc、kzalloc内存分配函数的定义
#include<linux/semaphore.h> //使用信号量必须的头文件
#include<linux/spinlock.h> //自旋锁

//定义变量
#define DEVICE "myled"
static struct class * myled_class;
static struct class * myled_class_dev;
int major;
volatile unsigned long * led_reg = NULL;

//open函数
//这个函数一般包括硬件的相关设置、初始化等,比如GPIO的属性。不过zedboard的gpio在硬件定制中已经设置属性,故此函数不需要添加
static int myled_open(struct inode * inode,struct file * file)
{
  printk("Open LED_DRV\n");
  return 0;
}

//write函数
static ssize_t myled_write(struct file * file,const char _ _user * buf,size_t count,loff_t * ppos)
{
  int val;
  printk("Open MY_LED_write\n");
  copy_from_user(&val,buf,count);//从用户空间赋值数据到内核空间
  * led_reg = val;
  return 0;
}

//file_operations结构体
static struct file_operations myled_fops={
  .owner = THIS_MODULE,
  .open  = myled_open,
  .write = myled_write,
};//注意这个分号不能少

//驱动初始化函数
static int myled_init(void)
{
  major=register_chrdev(0,"myled",&myled_fops);
  myled_class = class_create(THIS_MODULE,"myled");
  myled_class_dev = device_create(myled_class,NULL,MKDEV(major,0),NULL,"myled");
  led_reg = (volatile unsigned long *)ioremap(0x6a000000,32);
  * led_reg = 0x55;
  printk("Open LED_init\n");
  return 0;
}

//驱动卸载函数
static int myled_exit(void)
{
  unregister_chrdev(major,"myled");
  device_unregister(myled_class_dev);
  class_destroy(myled_class);
  iounmap(led_reg);
  printk("MY_LED_exit\n");
  return 0;
}

//驱动加载和卸载入口函数
module_init(myled_init);
module_exit(meled_exit);
MODULE_LICENSE("GPL");

驱动程序myled.c编写完成之后,需要对其进行编译,为了方便编译程序,需要编写一个Makefile文件

Makefile文件
KERN_SRC = /zedboard/linux-digilent-3.6-digilent-13.01
boj-m:=myled.o
all:
  make -C $ (KERN_SRC) M=‘pwd‘ modules
clean:
  make -C $ (KERN_SRC) M=‘pwd=‘clean
//在zedboard目录下新建driver文件夹,并将以上myled.c和Makefile文件放到该文件夹
mkdir driver
//进入driver目录,编译驱动,完成后会生成myled.ko驱动模块文件
cd driver
mak ARCH=arm  CROSS_COMPILE=arm-xilinx-linux-gnueabi- 
//驱动设计完成后,需要将其添加到设备树中
//打开设备树文件,并添加以下大号斜黑体内容
gedit arch/arm/boot/dts/digileng-zed.dts
spi-speed-hz = <4000000>;
spi-sclk-gpio = <&ps7_gpio_0 59 0 >;
spi-sdin-gpio = <&ps7_gpio_0 60 0 >;
};
myled{
compatible =  "dglnt,myled-1.00.a";
reg = <0x6a000000 0x10000>;
      };
   };
};
//重新生成设备树dtb文件
 ./scripts/dtc/dtc -I dts -O dtb -o .../devicetree.dtb   arch/arm/boot/dts/digilent-zed.dts
//将生成的设备树文件复制到SD卡的boot分区,接下来就可以进行加载驱动测试

简单测试驱动:1.将SD卡插入PC,在ubuntu下降生成的myled.ko文件复制到SD卡的rootfs分区的home目录,然后启动zedboard;2.启动linaro后,在串口终端里进入home目录,并使用insmod命令加载驱动程序;
 cd /home/ insmod  myled.ko
3.如果要卸载驱动,执行以下命令;
rmmod myled
应用程序调用驱动测试:
1.首先要编写一个简单的上位机测试程序ledtest.c,实现对LED的控制。
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<stdio.h>

int main(int argc,char * * argv)
{
  int fd;
  int val = 0xAA;
  fd = open("/dev/myled",O_PDWR);
  if(fd<0)
  {
    printf("error,can‘t open\n");
    return 0;
  }
  write(fd,&val,4);
  return 0;
}

其中fd=open就是打开myled这个设备,val是输出到led的值,最后通过write将其值写入到led寄存器

2.将ledtest.c复制到driver目录下,并对其编译
arm-xilinx-linux-gnueabi-gcc   -o   ledtest   ledtest.c
3.编译完成后,同样将生成的ledtest可执行文件复制到SD卡的rootfs分区的home目录下4.启动zedboard,在串口下执行如下命令即完成了驱动测试
cd   /homeinsmod  myled.ko./ledtest


原文地址:https://www.cnblogs.com/ylsm-kb/p/9062246.html

时间: 2024-10-11 09:57:47

zedboard上首个驱动实践——Led的相关文章

时间都去哪了-移动Web首屏优化实践

时间都去哪了-移动Web首屏优化实践 首屏时间 可用性的前提,后面用户是否使用你app很重要的因素之一: 我们PC上访问其实现在的带宽已经很好了,百兆光宽带,但是在移动端就不一样了,很多用户还是使用的流量,GPRS.所以,对于首屏时间的加载,压力还是蛮大的: 我们手机在出发一个操作之后,发生了什么? 下面是在返回数据前发生的动作,但是作为前端,我们好像动不了这些东西,不可能叫运营商去帮你定制一套系统: 这个才是我们真正要去做的东西-渲染(webkit) 给你两个优化的方面,优化网路与优化渲染(高

在Ubuntu18.04上安装Nvidia驱动

拿到了一台新机子,带显卡的那种,当然是各种倒腾了!于是我又一天装了三遍机子来进行各种尝试熟悉配置啥的. 所以首先是在裸机上安装Nvidia驱动. 环境:Ubuntu18.04 刚安装完系统,当然是把软件更新器提出的下载更新给下载一下了.所以首先应该是 1 sudo apt-get update 当然,上述是系统主动提出的更新,并没有输入指令啦~ 接下来,为了安装较新的驱动,先将ppa源加入 1 sudo add-apt-repository ppa:graphics-drivers/ppa 2

[异常解决] ubuntu上安装JLink驱动遇到的坑及给后来者的建议

一.前言 最近将整个电脑格式化,改成了linux操作系统 希望这样能让自己在一个新的世界探索技术.提升自己吧- win上的工具用多了,就不想变化了- 继上一篇<ubuntu上安装虚拟机遇到的问题(vmware坑了,virtual-box简单安装,在virtual-box中安装精简版win7)> link:http://www.cnblogs.com/zjutlitao/p/5061917.html 遇到的在ubuntu上装虚拟机坑之后,接下来又遇到了一个新的问题—— 如何在在ubuntu上安装

一步一步学ZedBoard &amp; Zynq(七):制作ZedBoard上linux根文件系统(ramdisk)

一步一步学ZedBoard & Zynq(七):制作ZedBoard上linux根文件系统(ramdisk) 网址:http://xilinx.eetrend.com/blog/3935 Digilent的OOB设计给出了一个ZedBoard上完整的运行的linux系统所需要的所有文件,包括配置FPGA的bit文件. 配置ARM PS系统的First-Stage boot loader(FSBL)和引导linux需要的Second-Stage boot loader(SSBL).Linux内核z

zedboard上移植OPENCV库

zedboard上移植OPENCV库 之前做了很多移植OPENCV库的工作,但是需要包含的各种库,需要交叉编译,X264 ,JPGE ,FFMPGE等等 注意:在<嵌入式系统软硬件协同设计实战指南>中13章中,说了需要关闭各种设置开关,根本原因是我们没有相应的库支持,所以我们如果需要在opencv中使用相应的库,那么就必须提前将各种库交叉编译好,放入交叉编译器的目录,我的交叉编译器安装目录/root/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx

【转载】8天学通MongoDB——第八天 驱动实践

作为系列的最后一篇,得要说说C#驱动对mongodb的操作,目前驱动有两种:官方驱动和samus驱动,不过我个人还是喜欢后者, 因为提供了丰富的linq操作,相当方便. 官方驱动:https://github.com/mongodb/mongo-csharp-driver/downloads.下载后,还提供了一个酷似msdn的帮助文档. samus驱动:https://github.com/samus/mongodb-csharp/downloads. 下面就具体看看samus驱动,https:

RK3288开发板PopMetal上的GPIO驱动实例

楼主在这边给大家介绍下如何使用PopMetal的GPIO.先讲过程,再讲原理吧, 该驱动需要涉及到的知识点:1,DTS设备树的作用,2,platform虚拟总线驱动的编写. 第一步,添加DTS节点 在/kernel/arch/arm/boot/dts/rockchip.dts下添加如下内容. 下图rockchip-leds-gpio这部分的内容,修改保存, 第二步,在kernel/drivers下创建个LED文件夹,然后加入如下几个文件驱动文件leds.c,Makefile和Kconfig.如下

AM335x内核模块驱动之LED

在Ubuntu的任意可操作的文件才建立text目录 在text中建立zyr-hello.c: #include<linux/kernel.h> #include<linux/module.h> #include<linux/init.h> #include <linux/miscdevice.h> #include <linux/types.h> #include <linux/ioctl.h> #include <linux/

普元云计算-阿里云上的容器技术实践详解

转载本文需注明出处:EAII企业架构创新研究院,违者必究.如需加入微信群参与微课堂.架构设计与讨论直播请直接回复公众号:"EAII企业架构创新研究院".(微信号:eaworld)   导读:本文以"实践过程中问题与思考"为主体,与大家分享其中的过程和经验,希望大家在后续的工作中能够避免相关问题,形成更佳实践. 为什么选择阿里云 现在的公有云如雨后春笋,国外如AWS.Azure.Bluemix,国内如BAT.DaoCloud.goodrain,都可以给大家提供丰富的云