历史上的今天
今天是:2024年10月12日(星期六)
2018年10月12日 | Tiny210驱动之LED测试
2018-10-12 来源:eefocus
first_drv.c驱动源码:
#include "linux/device.h"
#include "linux/module.h"
#include "linux/kernel.h"
#include "linux/fs.h"
#include "linux/init.h"
#include "linux/delay.h"
#include "asm/uaccess.h"
#include "asm/irq.h"
#include "asm/io.h"
static struct class *firstdrv_class;
volatile unsigned long *gpj2con = NULL;
volatile unsigned long *gpj2dat = NULL;
static int first_drv_open(struct inode *inode, struct file *file)
{
// 配置GPJ2_0,GPJ2_1,GPJ2_2,GPJ2_3为输出
*gpj2con &= ~((0xf<<(0*4)) | (0xf<<(1*4)) | (0xf<<(2*4)) | (0xf<<(3*4)));
*gpj2con |= ((0x1<<(0*4)) | (0x1<<(1*4)) | (0x1<<(2*4)) | (0x1<<(3*4)));
return 0;
}
static ssize_t first_drv_write(struct file *file, const char __user *buf, size_t count, loff_t * ppos)
{
int val;
copy_from_user(&val, buf, count); // copy_to_user();
if (val == 1)
{
// 点灯
*gpj2dat &= ~((1<<0) | (1<<1) | (1<<2) | (1<<3));
}
else
{
// 灭灯
*gpj2dat |= (1<<0) | (1<<1) | (1<<2) | (1<<3);
}
return 0;
}
static struct file_operations first_drv_fops = {
.owner = THIS_MODULE, // 这是一个宏,推向编译模块时自动创建的__this_module变量
.open = first_drv_open,
.write = first_drv_write,
};
int major;
static int first_drv_init(void)
{
major = register_chrdev(0, "first_drv", &first_drv_fops); // 注册, 告诉内核
firstdrv_class = class_create(THIS_MODULE, "firstdrv");
device_create(firstdrv_class, NULL, MKDEV(major, 0), NULL, "xyz"); // /dev/xyz
gpj2con = (volatile unsigned long *)ioremap(0xE0200280, 16);
gpj2dat = gpj2con + 1;
return 0;
}
static void first_drv_exit(void)
{
unregister_chrdev(major, "first_drv"); // 卸载
device_destroy(firstdrv_class, MKDEV(major, 0));
class_destroy(firstdrv_class);
iounmap(gpj2con);
}
module_init(first_drv_init);
module_exit(first_drv_exit);
MODULE_LICENSE("GPL");
====================================================================
firstdrvtest.c测试程序:
#include "sys/types.h"
#include "sys/stat.h"
#include "fcntl.h"
#include "stdio.h"
// firstdrvtest on
// firstdrvtest off
int main(int argc, char **argv)
{
int fd;
int val = 1;
fd = open("/dev/xyz", O_RDWR);
if (fd < 0)
{
printf("can't open!\n");
}
if (argc != 2)
{
printf("Usage :\n");
printf("%s 《on|off》\n", argv[0]); //实际为"<"
return 0;
}
if (strcmp(argv[1], "on") == 0)
{
val = 1;
}
else
{
val = 0;
}
write(fd, &val, 4);
return 0;
}
上一篇:Tiny210驱动之KEY测试
史海拾趣
|
我们现在需要用ARM的CPU做两款产品,一个是Netbook,一个是Barcode scanner,都需要加上CDMA2000/EVDO/HSxPA的3G模组,其中Netbook使用Android系统,Barcode scanner使用WM6.5系统,请问大家在开发类似产品的时候使用的都是哪家的3G模组呢? 我有 ...… 查看全部问答> |
|
为什么将GPIO配置成中断模式后,GPGDAT就不能读了?? 将GPIO如GPG端口中的GPG1配置成中断模式(GPGCON中配的),这样的话GPGDAT就不能读了吧(至少2440的datasheet上是这么说的)? 但是我看别人写的驱动怎么将GPG配成了中断模式,却用读取GPGDAT的相应位来判断是否产 ...… 查看全部问答> |
|
Windows Mobile 5.0,Windows Mobile 60设备,如何在我的程序运行过程中禁用上面的Power电源按钮 Windows Mobile 5.0,Windows Mobile 60设备,如何在我的程序运行过程中禁用上面的Power电源按钮… 查看全部问答> |
|
源码请教,关于Tab Ctrl 的多对话框共享从串口采集的数据,怎么实现啊? 现在有个项目,28号就要,很急,没实现Tab Ctrl 的多对话框共享从串口采集的数据,有四个对话框,每个对话框分别有很多的控件,要显示从串口采集来的数据,怎么样才能实现共享啊,请大家帮帮忙!!! 其中Tab Ctrl 的多对话框主要使用下面的方案5实 ...… 查看全部问答> |
|
无线通信模块在M2M领域的应用(四) 传统农业生产的物质技术手段落后,主要依靠人力、畜力和各种手工工具以及一些简单机械。在现实中主要存在农业科技含量低,装备水平低,农业污染和水资源浪费严重,农业产出少,农民收入低,农产品品种少等问题。 ...… 查看全部问答> |
|
大家好,最近在做一个比赛,需要使用SD卡来记录工作状态下的数据。但是对于文件系统和怎样对于SD卡进行操作不是很了解,所以和大家商讨一下。我先把我的两个函数放上来,大家帮我看看。 了、我没有使用FIFO功能,因为我觉得对于SD卡返回的信息的读 ...… 查看全部问答> |




