自动挂接根文件系统(直接从NFS启动)

  1. 修改uboot命令行

把 bootargs=noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0,115200

改为:
set bootarges noinitrd root=/dev/nfs nfsroot=192.168.0.104:/home/book/work/nfs_root/first_fs ip=192.168.0.10:192.168.0.104:192.168.0.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0,115200
 
在uboot中设置如下:
setenv bootargs noinitrd root=/dev/nfs console=ttySAC0 nfsroot=192.168.0.104:/home/book/work/nfs_root/first_fs ip=192.168.0.3:192.168.0.104:192.168.0.1:255.255.255.0::eth0:off init=/linuxrc
设置NFS启动参数 :
  1. 设置服务器IP,目录
  2. 设置自己的IP
 
运行第一个驱动程序
insmod first_drv.ko 挂载first_drv.ko
cat /proc/devices 查看当前挂载了的驱动
 
增加一个测试程序

 
 
include <sys/types.h>
include <sys/stat.h>
include <fcntl.h>
include <stdio.h> int main(int argc, char **argv)
{
int fd;
int val = ;
fd = open("/dev/xxx", O_RDWR);//打开
if (fd < )
{
printf("can't open!\n");
}
write(fd,&val,);//写
return ;
}
 
编译测试程序
arm-linux-gcc -o first_dev_test first_dev_test.c
提示不能打开当前测试文件是因为不存在/dev/xxx这个文件

所以需要创建这个设备节点
创建设备节点使用mknod 命令
mknod /dev/xxx c 111 0
命令 设备节点 设备类型(字符型) 主设备号(111) 次设备号
 
 
挂载设备 命令:insmod xxx(设备名称)
卸载设备命令:rmmod xxx(设备名称)

查看设备命令:lsmod
cat /proc/devices 查看当前挂载了的驱动
 
 
自动分配主设备号
​​
在注册 register_chrdev函数中设备号位置填写0 系统将在自动分配设备号

1驱动程序里面可以自动分配主设备号 也可以手动指定设备号
  1. 应用程序去打开一个open("/dev/xxx", O_RDWR); 使用 mknod /dev/xxx c 主设备号 次设备号 手动创建
  2. 使用自动创建 使用udev机制 就是busybox 中的mdev机制自动创建 (根据系统信息创设备节点)

定义一个类和一个设备

static struct class *firstdrv_class;
static struct class_device *firstdrv_class_dev;
在初始化设备时添加
  1. 使用class_create创建一个firstdrv_class类
firstdrv_class = class_create(THIS_MODULE,"firstdrv");//创建一个 first_class 这样的一个类
  1. 使用class_device_create创建一个设备 设备节点是 xyz

firstdrv_class_dev = class_device_create(firstdrv_class, NULL, MKDEV(major, 0), NULL, "xyz"); //mdev 自动创建一个 /dev/xyz */

int frist_drv_init(void)

{

major= register_chrdev(,"frist_drv",&first_drv_fops);//注册函数(注册驱动程序) (major 主设备号 )告诉内核

//主设备号 驱动名称 file_operations结构

/*生成系统信息*/

firstdrv_class = class_create(THIS_MODULE,"firstdrv");//创建一个 first_class 这样的一个类

firstdrv_class_dev = class_device_create(firstdrv_class, NULL, MKDEV(major, ), NULL, "xyz"); //mdev 自动创建一个 /dev/xyz */

return ;

}
在出口函数中添加如下
  1. 使用class_device_unregister 函数来卸载 class_device_create创建的设备

class_device_unregister(firstdrv_class_dev);

  1. 使用class_destroy 释放 掉firstdrv_class这个类

class_destroy(firstdrv_class);

void frist_drv_exit(void)
{
unregister_chrdev(major,"frist_drv");//卸载函数 卸载驱动
class_device_unregister(firstdrv_class_dev);
class_destroy(firstdrv_class);
}
实现点亮LED灯功能
 
硬件操作
映射虚拟地址 :使用 ioremap(off,sz) 函数 映射
/*将设备的物理地址映射为虚拟地址*/
gpfcon = (volatile unsigned long *)ioremap(0x56000050, 16); //0x56000050 (物理 地址) 16(长度)
gpfdat = gpfcon+1; //0x56000050+4 = 0x56000054 (物理地址) 16(长度)
取消虚拟地址映射:iounmap(_addr);
iounmap(gpfcon);
iounmap(gpfcon+1);
内核和用户之间参数传递 :
copy_from_user的功能是从用户空间传递数据到内核空间
对应的 copy_to_user 从内核空间传递数据到 用户空间
copy_from_user(&val,buf,count);
 
  1. 配置 GPFCON open
static int first_drv_open(struct inode *inode, struct file *file)

{

//printk("first_drv_open\n");

/*配置GPFCON 4 5 6为输出*/

*gpfcon &=~((0x3<<(*))|(0x3<<(*))|(0x3<<(*)));//清除GPFCON 4 5 6对应位

*gpfcon |= ((0x1<<(*))|(0x1<<(*))|(0x1<<(*)));//设置 GPFCON 4 5 6 为输出

return ;

}
 
  1. 设置 GPFDAT write
static ssize_t first_drv_write(struct file *file, const char __user *buf, size_t count, loff_t * ppos)
{
int val;
//printk("first_drv_write\n");
copy_from_user(&val,buf,count);//将buf中的数据拷贝到 val中 val的值等于 *buf的前0-count的数据 copy_from_user的功能是从用户空间传递数据到内核空间
// 对应的 copy_to_user 从内核空间传递数据到 用户空间
if(val == )
{
*gpfdat |= ((<<)|(<<)|(<<));// 熄灭灯
}
else
{
*gpfdat &= ~((<<)|(<<)|(<<));//打开led
}
return ;
}
使用次设备号:
主设备号 是建立与内核的链接,次设备号 是用来给驱动使用的 

liunx驱动----点亮LED的更多相关文章

  1. linux平台总线驱动设备模型之点亮LED

    这一节里,我们来使用平台驱动设备这一套架构来实现我们之前使用简单的字符设备驱动点亮LED,这里并无实际意义,只是告诉大家如果编写平台总线驱动设备. 问:如何编写平台总线驱动设备这一套架构的设备驱动? ...

  2. 嵌入式linux驱动开发之点亮led(驱动编程思想之初体验)

    这节我们就开始开始进行实战啦!这里顺便说一下啊,出来做开发的基础很重要啊,基础不好,迟早是要恶补的.个人深刻觉得像这种嵌入式的开发对C语言和微机接口与原理是非常依赖的,必须要有深厚的基础才能hold的 ...

  3. 驱动编程思想之初体验 --------------- 嵌入式linux驱动开发之点亮LED

    这节我们就开始开始进行实战啦!这里顺便说一下啊,出来做开发的基础很重要啊,基础不好,迟早是要恶补的.个人深刻觉得像这种嵌入式的开发对C语言和微机接口与原理是非常依赖的,必须要有深厚的基础才能hold的 ...

  4. ARM学习篇一 点亮LED

    要点亮LED,先决条件是什么,当然得有相应的硬件设施.板子的整个电路图比较大,我就直接取相关部分. 给发光二级管加上3.3v电压后,通过1k电阻,直接与S3C2440连接.至于为什么要加电阻,大家应该 ...

  5. arm-点亮led灯

    点亮指路灯:学习四环节:led原理图分析,芯片手册导读,思维导图设计,为什么要使用led:通常led是作为程序调试的重要手段.led原理图:led实质为发光二极管,当其两端电压一定时,即处于导通状态. ...

  6. 学习笔记——单片机简介 & 点亮LED & 流水灯 & 电路基础【更新Ing】

    视频地址:https://www.bilibili.com/video/av10765766 超详细!!!!!! 单片机内部三大资源 [资源:单片机可提供使用的东西] FLASH 可以重复擦写 断电后 ...

  7. 【iCore4 双核心板_ARM】例程五:SYSTICK定时器 实验——定时点亮LED

    实验原理: 通过STM32的三个GPIO口驱动三色LED的三个通道,设定GPIO为推挽输出模式,采 用灌电流方式与LED连接,输出高电平LED灭,输出低电平LED亮,通过系统定时器实现 1s定时,每秒 ...

  8. 【iCore1S 双核心板_ARM】例程十:SYSTICK定时器实验——定时点亮LED

    实验原理: 通过STM32的三个GPIO口驱动三色LED的三个通道,设定GPIO为推挽输出,采用 灌电流的方式与LED连接,输出高电平LED灭,输出低电平LED亮,通过系统定时器实现 1s定时,每秒变 ...

  9. 第7章 使用寄存器点亮LED灯

    第7章     使用寄存器点亮LED灯 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fir ...

随机推荐

  1. 【最短路+最大流】上学路线@安徽OI2006

    目录 [最短路+最大流]上学路线@安徽OI2006 PROBLEM SOLUTION CODE [最短路+最大流]上学路线@安徽OI2006 PROBLEM 洛谷P4300 SOLUTION 先在原图 ...

  2. (73)Wangdao.com第十二天_JavaScript consol 对象与控制台

    consol 对象 console对象是 JavaScript 的原生对象 它有点像 Unix 系统的标准输出stdout和标准错误stderr, 可以输出各种信息到控制台,并且还提供了很多有用的辅助 ...

  3. ECMA Script 6_简单介绍

    ECMAScript 6 ECMA 组织 前身是 欧洲计算机制造商协会 指定和发布脚本语言规范,标准在每年的 6 月份正式发布一次,作为当年的正式版本 这样一来,就不需要以前的版本号了,只要用年份标记 ...

  4. [LeetCode] Ambiguous Coordinates 模糊的坐标

    We had some 2-dimensional coordinates, like "(1, 3)" or "(2, 0.5)".  Then, we re ...

  5. 安装Percona版本的MySQL主从复制

    准备两台虚拟机,按顺序执行1.1节的公共部分 1.1 首先安装 cmake # yum –y install cmake     //也需要安装gcc-c++,openssl openssl-deve ...

  6. Docker 安装以及运用

    Docker 运行在 CentOS 7 上,要求系统为64位.系统内核版本为 3.10 以上.Docker 运行在 CentOS-6.5 或更高的版本的 CentOS 上,要求系统为64位.系统内核版 ...

  7. Linux_相关命令(学习,备忘)

    1.Linux 查看实时cpu使用率: top 说明:top命令即时显示process的动态 2.查看cpu处理器使用率: cat /proc/stat 3.平均cpu使用率 4.赋予文件夹下所有文件 ...

  8. 屏蔽登录QQ后总是弹出的QQ网吧页面

    不知道从什么时候开始的,每次登录QQ的时候,有个叫qq网吧的页面都会弹出来,腾讯你是撒吗?这个公司真是死性不改.按照它的提示,已经设置了好几次这是我家,这特么不是网吧,然并卵.你说它技术不行吧,它堪称 ...

  9. PHP 多个构造函数

    class A { function __construct() { $a = func_get_args(); $i = func_num_args(); if (method_exists($th ...

  10. Google Adsense Google判断广告点击作弊的方式和数据 数据分析

    Google判断广告点击作弊的几种方式和数据 - 王庆东mas - 博客园 http://www.cnblogs.com/x-poior/p/5581327.html 作弊广告点击的CTR数据太高网上 ...