tiny4412linux驱动开发pdf,tiny4412--linux驱动学习(2)

在ubuntu下编写验证字符设备驱动

并移植到arm开发板上

1,准备工作

uname -r  查看电脑版本信息

apt-get  install  linux-source  安装相应版本的linux内核

2,编写驱动程序

Global CharDev.c

/*GlobalCharDev.c*/#include#include#include#include

#define DEV_NAME "GlobalChar"

static ssize_t GlobalRead(struct file *, char *, size_t, loff_t *);static ssize_t GlobalWrite(struct file *, const char *, size_t,loff_t *);static int char_major = 0;static int GlobalData = 0; /*"GlobalChar"设备的全局变量*/

/*初始化字符设备驱动的 file_operations 结构体*/

struct file_operations globalchar_fops ={

.read=GlobalRead,

.write=GlobalWrite

};/*模块初始化*/

static int __init GlobalChar_init(void)

{intret;

ret= register_chrdev(char_major, DEV_NAME, &globalchar_fops);/*注册设备驱动,_driver_char_misc.c 第290行参考*/

if(ret < 0)

printk(KERN_ALERT"GlobalChar Reg Fail\n");else{

printk(KERN_ALERT"GlobalChar Reg Success\n");

char_major=ret;

printk(KERN_ALERT"Major = %d\n", char_major);

}returnret;

}/*模块卸载函数*/

static void __exit GlobalChar_exit(void)

{

unregister_chrdev(char_major, DEV_NAME);/*注销设备驱动*/

return;

}/*模块驱动读函数*/

static ssize_t GlobalRead(struct file *file, char *buf, size_t len, loff_t *off)

{if (copy_to_user(buf, &GlobalData ,sizeof(int)))

{/*从内核复制 GlobalData 到用户空间*/

return -EFAULT;

}return sizeof(int);

}/*模块驱动写函数*/

static ssize_t GlobalWrite(struct file *file, const char *buf, size_t len, loff_t *off)

{if (copy_from_user(&GlobalData, buf, sizeof(int)))

{/*从用户复制 GlobalData 到内核*/

return -EFAULT;

}return sizeof(int);

}

module_init(GlobalChar_init);

module_exit(GlobalChar_exit);

MODULE_LICENSE("GPL");

MODULE_AUTHOR("dongjin");

Makefile

ifneq ($(KERNELRELEASE),)

obj-m :=GlobalCharDev.oelse# KERNELDIR?= /lib/modules/$(shell uname -r)/build

KERNELDIR?= /usr/src/linux-headers-$(shell uname -r) //这两个都可以

PWD :=$(shell pwd)default:

$(MAKE)-C $(KERNELDIR) M=$(PWD) modules

clean:

rm-rf rm -rf *.ko *.mod* *.o* *.sy*endif

理解:

pwd-->  驱动文件目录

kerneldir -->  内核源码目录

default -->  表示到内核源码目录中去编译pwd下的驱动文件

——————————————————————————————————————————————————————

make 编译

root@ubuntu:/home/arm/data/char_driver# make

make-C /usr/src/linux-headers-4.4.0-31-generic M=/home/arm/data/char_driver modules

make[1]: 正在进入目录 `/usr/src/linux-headers-4.4.0-31-generic' CC [M] /home/arm/data/char_driver/GlobalCharDev.o

Building modules, stage2.

MODPOST1modules

LD [M]/home/arm/data/char_driver/GlobalCharDev.ko

make[1]:正在离开目录 `/usr/src/linux-headers-4.4.0-31-generic'

出现Global CharDev.ko文件

2,insmod Global CharDev.ko  将模块加入内核

3,cat  /proc/devices  查看驱动设备

4919fbf287813867b0227b3ba892886d.png

4,mknod  /dev/GlobalChar   c  247  0      根据相应的设备号,建立设备节点。

5,测试文件

/*GlobaiCharText.c 测试文件*/#include#include#include#include#include

#define DEV_NAME "/dev/GlobalChar"

intmain()

{intfd, num;/*打开设备文件*/fd= open(DEV_NAME, O_RDWR, S_IRUSR |S_IWUSR);if(fd < 0)

{

printf("Open Device Fail!\n");return -1;

}/*读取当前设备数值*/read(fd,&num, sizeof(int));

printf("The GlobalChar is %d\n", num);

printf("Please input a numble written to GlobalChar:");

scanf("%d", &num);/*写入新的数值*/write(fd,&num, sizeof(int));/*重新读取数值*/read(fd,&num, sizeof(int));

printf("The GlobalChar is %d\n", num);

close(fd);return 0;

}

gcc -o  GlobalCharText  GlobalCharText.c      编译出可执行文件

执行:

root@ubuntu:/home/arm/data/char_driver# ./a.outThe GlobalCharis 0Please input a numble written to GlobalChar:111The GlobalCharis 111

——————————————————————————————————————————————————————————————————————

通过NFS我们可以建立共享目录,将编写好的驱动加载到arm板,当然也需要配置环境变量。

1,驱动文件:需要将Make file中KERNLDIR 改成 自己下载内核的地址,如:

KERNELDIR ?= /home/arm/linux-4.4

8f025b2b6910e68a5c79b94755208729.png

f4002c8411cc868ad1d2e42ffc104d2a.png

f343ac83b13f157c0ccc489510a0ced2.png

eb10934f431430c283be605968b55732.png

2,测试文件:理所当然我们需要使用交叉编译去编译出可执行文件。

注意:首先我们要知道自己制作的做小系统是采用静态编译还是动态编译,我的采用静态编译

1,静态:

5dd4fbc1bae5bc37830b3bd84b725791.png

38b48ed4ddd503b2e6d20fff143ced3b.png

2,动态:

需要在制作最小系统时,在  /lib  下加入所需的动态交叉编译库(所选交叉编译工具目录下的链接库),但是我在制作randisk的过程中,提示内存不足,暂没查找其原因。

如果在静态根文件系统内使用动态编译链所编译的elf,会提示:-sh:./test:no found  (这里 not found 指的是 链接库)

测试:

1967272653668a00958d9bb7e7f654b1.png

卸载:

1,删除  /dev  下的设备节点

rm /dev/GlobalChar

2,卸载驱动

rmmod  GlopbalCharDev.ko

出现问题:

ebe8520384633e95f6a86d323b09a752.png

44df48e61af6ca2002b83875040d3155.png

——————————————————————————————————————————————————————

参考:

http://tieba.baidu.com/p/3645403366

https://blog.csdn.net/Ultraman_hs/article/details/53239455

解决移植到arm上不兼容的问题

https://blog.csdn.net/zqj6893/article/details/48439711

解决驱动卸载问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第一章 建立ANDROID应用开发环境 - 5 - 1.1 步骤一:下载并安装JDK (JAVA SE DEVELOPMENT KIT) - 5 - 1.2 步骤二:下载并安装ADT集成开发环境和ANDROID SDK - 6 - 1.2.1 下载Android SDK (API 17) - 7 - 1.2.2 启动ADT集成开发环境 (Android Developer Tools) - 8 - 1.3 步骤三:创建ANDROID模拟器 - 9 - 1.4 步骤四:开发第一个ANDROID程序 (验证开发环境是否搭建成功) - 11 - 1.4.1 创建HelloWorld工程 - 11 - 1.4.2 在模拟器运行Android程序 - 13 - 1.5 步骤五:建立TINY4412调试环境 - 13 - 1.5.1 安装USB ADB驱动程序 - 13 - 1.5.2 在Tiny4412上测试ADB功能 - 14 - 1.5.3 通过USB ADB在Tiny4412上运行程序 - 16 - 1.5.4 在Tiny4412上调试Android程序 - 18 - 第二章 在ANDORID程序中访问硬件 - 20 - 2.1 如何使用函数库(LIBFRIENDLYARM-HARDWARE.SO)? - 20 - 2.2 函数库(LIBFRIENDLYARM-HARDWARE.SO)接口说明 - 22 - 2.2.1 通用的输入输出接口 - 22 - 2.2.2 串口通讯的接口说明 - 23 - 2.2.3 开关LED的接口说明 - 24 - 2.2.4 让PWM蜂鸣器发声和停止发声的接口说明 - 24 - 2.2.5 读取ADC的转换结果的接口说明 - 24 - 2.2.6 I2C接口说明 - 25 - 2.2.7 SPI接口说明 - 26 - 2.2.8 GPIO接口说明 - 28 - 2.3 示例程序说明 - 29 - 2.3.1 在板LED示例 - 29 - 2.3.2 GPIO示例 - 30 - 2.3.3 串口通讯示例 - 34 - 2.3.4 PWM示例 - 35 - 2.3.5 A/D转换示例 - 36 - 2.3.6 I2C& EEPROM示例 - 36 - 2.3.7 SPI示例 - 37 - 2.4 在ADT中导入示例工程 - 37 -

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值