RICO BOARD驱动探索之旅_环境搭建与点亮LED
今天开始更新我的博客,一个专题: RICO BOARD驱动探索之旅
机缘巧合,我申请到了RICO BOARD,一直想自己玩玩,现在开播!!!
这款板的渊源我就不赘述了,它是以TI Sitara AM437X为处理器,优点我也省略,反正我是小白。
既然是小白,我就以小白的目光来开发这一套板的驱动(基于LINUX)
驱动开发准备工作:
(1)编译内核
我用的是官方带的内核,按照说明书移植好编译工具链,然后直接按照说明编译即可;
不过得改改Makefile
ARCH 改为 ARCH ?=arm
ARCH 改为 CROSS_COMPILE ?=arm-linux-gnueabihf-
(2)搭建NFS
小白在此声明,板子和你的宿主机之间必须得传文件,你可用FTP,NFS,U盘,但是最方便的莫过于用NFS了。
NFS的搭建网上是有的,但是在这里我还是写一写(搬)吧:
(1)sudo apt-get install nfs-kernel-server
(2)sudo vi /etc/exports
添加/home/king/nfs *(rw,subtree_check,no_root_squash,no_all_squash,sync) //这是之后放文件的目录
(3)chmod 777 –R /home/king/nfs
(4)sudo vi /etc/default/nfs-kernel-server
将RPCMOUNTDOPTS改为 RPCMOUNTDOPTS="-p 13100"
(5)sudo service nfs-kernel-server restart
到这儿应该就搭好了,我们做个测试:
sudo mount -t nfs 127.0.0.1:/home/king/nfs /mnt //咱先自个儿挂自个儿上面,然后试试
完成了以上工作,我们开始我们的第一个驱动开发:
我是电子专业出身,所以玩过几款单片机,形成一个习惯:拿到一个板子,总想着先点亮一盏LED看看,这次就让我再任
性一次吧,我们先来点个灯玩玩。
我们先来说说单片机点灯要哪些个过程:
(1)搞清楚灯在哪个管脚?
(2)看芯片的手册,看看如何把对应的管脚配置成输出模式?
(3)然后再看看怎样改变管脚的电平,使其变为低电平,LED就亮了?
我们做LINUX驱动开发LED点亮呢?
(1)搭建一个可用的字符设备驱动框架;
(2)搞清楚灯在哪个管脚?
(3)看芯片的手册,找到相关的寄存器的内存地址;
(4)在初始化中完成寄存器的地址映射;
(5)将LED操作函数填充到字符设备驱动框架中;
有了这个思维,我想我们的工作就会简单很多。我们一步一步的走,不就点个灯嘛。。。
(1)字符设备驱动框架代码
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/cdev.h>
#include <linux/delay.h>
#include <linux/device.h>
#include <asm/atomic.h>
#include <asm/uaccess.h>
#include <asm/io.h>
#define DEV_NAME "king"
struct class *king_class;
static struct device *this_dev;
int major=0;
dev_t dev_nr=0;
struct cdev king_cdev;
static int king_open(struct inode *pinode , struct file *pfile)
{
printk("king_open : Tring to open !!!\n");
return 0;
}
static int king_release(struct inode *pinode , struct file *pfile)
{
printk("king_open : Tring to release !!!\n");
}
ssize_t king_read(struct file *file, const char __user *buf, size_t count, loff_t * ppos)
{
printk("king_read : king_dev is reading!!!\n");
return count;
}
ssize_t king_write(struct file *file, const char __user *buf, size_t count, loff_t * ppos)
{
printk("king_write : king_dev is writing!!!\n");
return count;
}
static struct file_operations dev_ops = //本设备的操作函数结构体
{
.owner = THIS_MODULE,
.open = king_open,
.read = king_read,
.write = king_write,
.release = king_release,
};
int hello_init(void) //初始化一个字符设备
{
int ret=0;
printk("hello_init : king_dev is ins!!!\n");
alloc_chrdev_region(&dev_nr,0,1,DEV_NAME);
major = MAJOR(dev_nr);
printk(DEV_NAME"'s major is %d (hello_init)\n",major);
cdev_init(&king_cdev,&dev_ops);
king_cdev.owner = THIS_MODULE;
ret = cdev_add(&king_cdev,dev_nr,1);
king_class = class_create(THIS_MODULE,"king_cdev");
this_dev = device_create(king_class,NULL,MKDEV(major,0),NULL,DEV_NAME);
printk("hello_init : enjoy yourself!\n");
return 0;
}
int hello_exit(void)
{
device_destroy(king_class,MKDEV(major,0));
class_destroy(king_class);
cdev_del(&king_cdev);
unregister_chrdev_region(dev_nr,1);
printk(KERN_ALERT"kernel:\t%s,Bye\n",KERN_ALERT);
return 0;
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
这个是我自己的一个字符设备驱动框架,亲测绝逼可用。然后我们要写一个Makefile:
KERN_DIR = /home/king/work/rico/kernel/linux-3.12.10-ti2013.12.01 #这个是你的内核目录
all:
make -C $(KERN_DIR) M=`pwd` modules
clean:
make -C $(KERN_DIR) M=`pwd` modules clean
rm -rf modules.order
obj-m += king.o #要编译的模块的名字
然后直接make就好,把生成的king.ko放到板子里面,然后insmod就好了,你会找到/dev/king,这样就对了!!!
(2)不过不要开心的太早,接下来该看芯片手册了,如果正好你是小白且英语不好就随我看看,if not,跳过。
找到general-purpose input/output这一章,其实就是GPIO,哈哈!!
然后我们看看这段文字:
The general-purpose interface combines six general-purpose input/output (GPIO) modules. Each GPIO
module provides 32 dedicated general-purpose pins with input and output capabilities; thus, the
generalpurpose interface supports up to 192 (6 × 32) pins
讲的就是这款芯片的GPIO模块一共有6组,每组管脚有32个脚,都具有GPIO功能,最多达到192个管脚
OK,我们略过对于GPIO管脚功能的大篇幅描述,直接取我们有用的信息,我长话短说:
配置GPIO_OE Register:
这个寄存器控制每个管脚的模式(输入,输出,中断),一共32位,代表32个管脚,将我们想要的管脚
所对应的位设置为0就行。
学习使用GPIO_CLRDATAOUT
这个寄存器可以控制管脚的电平,只要对应的位为1,为0的位不受影响,则这个管脚的电平被拉低;
学习使用GPIO_SETDATAOUT
这个寄存器可以控制管脚的电平,只要对应的位为1,为0的位不受影响,则这个管脚的电平被拉高;
好了,寄存器功能就搞定了!
(3)下面你可以好好开心开心,我们找找LED在哪个GPIO口:
在GPIO1_24~GPIO1_27,哈哈,我们这一步完成的很轻松;
(4)找到寄存器的地址:
首先去Memory Map 找GPIO1的地址,0x4804c000,其余寄存器找到其偏移值就行,加上去就好。
(5)填入字符设备框架:
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/cdev.h>
#include <linux/delay.h>
#include <linux/device.h>
#include <asm/atomic.h>
#include <asm/uaccess.h>
#include <asm/io.h>
#define DEV_NAME "king"
struct class *king_class;
static struct device *this_dev;
volatile unsigned long *gpio1_oe = NULL;
volatile unsigned long *gpio1_dataout = NULL;
volatile unsigned long *gpio1_clrdata = NULL;
volatile unsigned long *gpio1_setdata = NULL;
int major=0;
dev_t dev_nr=0;
struct cdev king_cdev;
static int king_open(struct inode *pinode , struct file *pfile)
{
printk("king_open : Tring to open !!!\n");
*gpio1_oe &= ~(1<<25); //对应的位清零
*gpio1_oe &= ~(1<<26);
*gpio1_oe &= ~(1<<27);
return 0;
}
static int king_release(struct inode *pinode , struct file *pfile)
{
printk("king_open : Tring to release !!!\n");
*gpio1_setdata |= 1<<25; //对应的位置1
*gpio1_setdata |= 1<<26;
*gpio1_setdata |= 1<<27;
}
ssize_t king_write(struct file *file, const char __user *buf, size_t count, loff_t * ppos)
{
printk("king_write : king_dev is writing!!!\n");
*gpio1_clrdata |= 1<<25;
*gpio1_setdata |= 1<<26;
*gpio1_setdata |= 1<<27;
return count;
}
static struct file_operations dev_ops =
{
.owner = THIS_MODULE,
.open = king_open,
.write = king_write,
.release = king_release,
};
int hello_init(void)
{
int ret=0;
printk("hello_init : king_dev is ins!!!\n");
alloc_chrdev_region(&dev_nr,0,1,DEV_NAME);
major = MAJOR(dev_nr);
printk(DEV_NAME"'s major is %d (hello_init)\n",major);
cdev_init(&king_cdev,&dev_ops);
king_cdev.owner = THIS_MODULE;
ret = cdev_add(&king_cdev,dev_nr,1);
king_class = class_create(THIS_MODULE,"king_cdev");
this_dev = device_create(king_class,NULL,MKDEV(major,0),NULL,DEV_NAME);
gpio1_oe = (volatile unsigned long *)ioremap(0x4804c000+0x0134 , 32);
gpio1_dataout = (volatile unsigned long *)ioremap(0x4804c000+0x013c , 32); //映射寄存器
gpio1_clrdata = (volatile unsigned long *)ioremap(0x4804c000+0x0190 , 32);
gpio1_setdata = (volatile unsigned long *)ioremap(0x4804c000+0x0194 , 32);
printk("hello_init : enjoy yourself!\n");
return 0;
}
int hello_exit(void)
{
device_destroy(king_class,MKDEV(major,0));
class_destroy(king_class);
cdev_del(&king_cdev);
unregister_chrdev_region(dev_nr,1);
iounmap(gpio1_setdata);
iounmap(gpio1_clrdata);
iounmap(gpio1_dataout);
iounmap(gpio1_oe);
printk(KERN_ALERT"kernel:\t%s,Bye\n",KERN_ALERT);
return 0;
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
下面给一个测试代码:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#define DEV_NAME "/dev/king"
int main(int argc, char const *argv[])
{
int fd = 0;
int ret = 0,i=0;
int led=0;
fd = open(DEV_NAME,O_RDWR);
if (fd<0)
{
/* code */
printf("You are wrong!!!\n");
exit(0);
}
ret = write(fd,&led,1);
printf("I am writing %d\n",ret);
sleep(5);
close(fd);
return 0;
}
操作流程:
(1)make,生成ko文件,拷到板子;
(2)编译测试代码:arm-linux-gnueabihf-gcc -o app app.c
生成app,拷到板子;
(3)insmod king.ko
./app
看到板子灯亮5S后灭掉。
RICO BOARD驱动探索之旅_环境搭建与点亮LED相关推荐
- 关于FS4412的ARM开发环境搭建并点亮LED灯
目录 一.ARM开发环境搭建 1.安装 GCC 编译工具 2.安装 Yagarto 工具包 3.安装FS-JTAG调试软件 4.安装JRE 5.安装FS-JTAG驱动 6.安装USB转串口驱动 7.安 ...
- esp8266 micropython开发环境搭建及点亮led
电脑兼容安装python2.7.7和python3.6.6成功后解决了清除和下载固件失败问题,成功点亮led 1.安装esptool 在命令行下输入 pip install esptool pip i ...
- 【esp8266】:python也能控制单片机?esp8266 micropython开发环境搭建及点亮led
买来8266后好久没用,今天才发现自己安装的python3.6版本不支持,电脑兼容安装python2.7.7和python3.6.6成功后解决了清除和下载固件失败问题,成功点亮led 1.安装espt ...
- C语言奇妙之旅_环境搭建
爱护"环境"从我做起 课前回顾 C语言是由什么演变而来的 ALGOL -> CPL -> BAPL -> B -> C 机器语言. 汇编语言 ...
- 探花交友_第2章_环境搭建(新版)
探花交友_第2章_环境搭建(新版) 文章目录 探花交友_第2章_环境搭建(新版) 课程介绍 <探花交友> 1.项目介绍 1.1.项目背景 1.2.市场分析 1.3.目标用户群体 1.4.使 ...
- Go学习笔记_环境搭建
Go学习笔记_环境搭建 Go背景知识 go的特点(官网): Build fast, reliable, and efficient software at scale- Go is an open s ...
- 小白的渗透之旅1-DVWA环境搭建
小白的渗透之旅1-DVWA环境搭建 注意:DVWA需要依赖httpd.PHP.MySQL.php-mysql等应用或组件,最简单的方法是安装wampserver(http://www.wampserv ...
- 【原作者:吴秦(Tyler)http://www.cnblogs.com/skynet/archive/2010/04/12/1709892.html】Android开发之旅:环境搭建及HelloWo
Android开发之旅:环境搭建及HelloWorld 2010-04-12 00:45 by 吴秦, 801360 阅读, 138 评论, 收藏, 编辑 --工欲善其事必先利其器 引言 本系列适合0 ...
- Android开发之旅:环境搭建及HelloWorld
2019独角兽企业重金招聘Python工程师标准>>> 引言 本系列适合0基础的人员,因为我就是从0开始的,此系列记录我步入Android开发的一些经验分享,望与君共勉!作为Andr ...
最新文章
- 概述 互联网时代的商业挑战
- 计算机硬件性能提升定律,❤️多核编程·笔记
- how is odata metadata request served 故意把configuration file里的GM6改成GM61之后
- java第十三章总结
- x-shell 通过堡垒机连接 ssh多个机器 自动化脚本
- codevs1521 华丽的吊灯
- SharePoint 实现ajax异步加载数据的几种方式
- Lync Server 2013企业版部署系列之一:部署环境介绍
- iOS底层探索之Block(五)——Block源码分析(__block 底层都做了什么?)
- (转)《麻省理工科技评论》发布2017年全球十大突破性技术榜单
- 儿童过敏性鼻炎的最佳治疗方法
- html中阳历生日转换成农历,农历转阳历换算(阴历和阳历生日转换器)
- lower_bound 、upper_bound 、binary_search
- xp系统本地连接服务器,xp系统本地连接受限制或无连接怎么办丨xp本地连接断开无法上网解决办法...
- Vue框架+Axios框架
- H5中段落自动空两格
- 【Neo4j × 知识图谱】图形化数据库基本操作: 创建节点与关系、添加属性、查询节点 | 附:可视化 构建四大名著 知识图谱(含源代码)| word2vec实战: 构造斗罗大陆人物关系
- windows查看本机的mac地址
- elang 字符处理
- 物联卡中心:物联卡能永久使用吗?放手机会不会被封卡