自动挂接根文件系统(直接从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. ORACLE11g 重装系统后根据dbf恢复数据库

    1.安装一个和原系统一致的oracle 环境,主要包括版本.数据名sid.实例名.路径和数据库编码一致 2.修改listener.ora的参数 SID_LIST_LISTENER = (SID_LIS ...

  2. jmeter--接口自动化jmeter+ant+jenkins

    的 一.介绍 接口自动化工具:jmeter+ant+jenkins 流程: -1.jmeter已录制或手动设置好脚本后 -2.配置ant,使用Ant工具,进行批量执行jmeter的脚本 -3.使用Je ...

  3. vue2 里边使用 swiper2

    找过了很多轮播图插件,我都不会用,还是回到swiper2吧... npm install swiper@2.7.6 --save-dev 封装成一个组件 <template> <di ...

  4. __x__(35)0908第五天__ 层级 z-index

    如果三个 div 全部设置 position: absolute; 绝对定位,且未设置 z-index,  则从代码结构上    下面的元素 会盖住 上面的元素. z-index 层级: 通过 z-i ...

  5. (96)Wangdao.com_第二十九天_表单事件

    表单事件 input 事件        select 事件        change 事件        invalid 事件        reset 事件         submit 事件 ...

  6. 严重: StandardWrapper.Throwable org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'goodsController' defined in file [D:\eclipse\eclipse-space\pinyougou_parent\pinyou

    由于错误太宽,没法截取完整的,所以不怎么连贯,但是不影响错误的解决. 这个错误是因为service无法自动注入.显示嵌套状态异常. 我就查看了一下我的坐标和配置文件,配置文件的路径和访问地址都是正确的 ...

  7. netbeans10支持php7.1-7.3

    2019年1月16日10:56:49 官方发布时间2018年12月27日 PHP支持 NetBeans 10的所有PHP支持都是由我们的NetBeans提交者 Junichi Yamamoto提供的. ...

  8. [daily][emacs][go] 配置emacs go-mode的编辑环境以及环境变量问题

    1. 安装go 安装go-mode 使用emacs编辑go代码的时候,你需要有正常可运行的go环境. 并且有emacs的go-mode package https://www.emacswiki.or ...

  9. API认证&SDK&RESTful

    python API的安全认证   我们根据pid加客户端的时间戳进行加密md5(pid|时间戳)得到的单向加密串,与时间戳,或者其它字段的串的url给服务端. 服务端接收到请求的url进行分析 客户 ...

  10. 未能执行URL

    在 <compilation debug="true"> 下 加入: <buildProviders> <add extension=".h ...