自动挂接根文件系统(直接从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. 在页面上获取web项目信息

    获取协议名称:request.getScheme() 获取域名:request.getServerName() 获取项目名称:request.getContextPath() 使用EL表达式获取项目名 ...

  2. jQuery插件开发的五种形态小结(转)

    关于jQuery插件的开发自己也做了少许研究,自己也写过多个插件,在自己的团队了也分享过一次关于插件的课.开始的时候整觉的很复杂的代码,现在再次看的时候就清晰了许多.这里我把我自己总结出来的东西分享出 ...

  3. Android学好Shape不再依赖美工

    原创 2014年03月27日 15:33:41 标签: Android Shape用法 20427 先上图 其实以上效果没有让美工提供任何图片 只要学会Shape你就能实现 想怎么样就怎么样 下面介绍 ...

  4. 20175320 2018-2019-2 《Java程序设计》第9周学习总结

    20175320 2018-2019-2 <Java程序设计>第9周学习总结 教材学习内容总结 本周学习了教材的第十一章的内容,在这章中介绍了JDBC与Mysql数据库,通过本章我了解到了 ...

  5. Python全栈-magedu-2018-笔记10

    第三章 - Python 内置数据结构 集set 约定 set 翻译为集合 collection 翻译为集合类型,是一个大概念 set 可变的.无序的.不重复的元素的集合 set定义 初始化 set( ...

  6. awk 复习

    awk 的再次学习!!!! awk 的一般模式 awk '{parttern + action }' {filename} , 提取/etc/passwd 的用户 awk -F ":&quo ...

  7. ubus socket always in connecting status

    When we try to transplant ubus to uclinux, ubusd can't run but "ubus list" will hang up. 1 ...

  8. stm32直流电机驱动与测速代码配套视频资料

    说实话就现在的市场应用中stm32已经占到了绝对住到的地位,51已经成为过去式,32的功能更加强大,虽然相应的难度有所增加,但是依然阻止不了大家学习32的脚步,不说大话了这些大家都懂要不然也不会学习s ...

  9. 【C++】链表回环检测

    //链表回环检测问题 #include<iostream> #include<cstdlib> using namespace std; ; struct node { int ...

  10. XXL-JOB之本地环境搭建

    一.源码下载 1.官网地址 登录以下地址查看详细搭建步骤: https://www.cnblogs.com/xuxueli/p/5021979.html 2.下载源码 根据1中打开的页面,下载源码,如 ...