linux c led 驱动程序,uclinux简单LED驱动程序
uclinux简单LED驱动程序
by panasonic.lin@163.com
这回还是拿44b0x板上的LED开唰,这是linux2.4的方法,linux2.6有很大区别,相比之下还是2.4的内核比较简单,2.6比较灵活点。
首先声明,此方法是把驱动编译进内核,如果驱动程序比较多的话可能导致内核很冗肿,这时候建议用可加载模块的方式。顶层的简单应用程序放在文件系统中。
1.0
uClinux-dist20050311/linux-2.4.x/drivers/char/{led.h,led.c}
驱动头文件
/************************************************************************************************************/
/*************led.h*************************************************/
/***********************************************************************************************************/
#ifndef __CONFIG_H
#define __CONFIG_H
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define LED_MAJOR_NR 231
#define DEVICE_NAME "led"
#define PCONC (*(volatile unsigned *)0x01D20010)
#define PDATC (*(volatile unsigned *)0x01D20014)
#define SET_LED_OFF 0
#define SET_LED_ON 1
#define LED0_CON (0x01<<2)
#define LED1_CON (0x01<<4)
#define LED2_CON (0x01<<6)
#define LED0_DAT (0X1<<1)
#define LED1_DAT (0X1<<2)
#define LED2_DAT (0X1<<3)
#endif
驱动程序主体:
/************************************************************************************************************/
/*************led.c*************************************************/
/***********************************************************************************************************/
#include"led.h"
static int led_open(struct inode *inode,struct file *filp);
static int led_release(struct inode *inode,struct file *filp);
static int led_ioctl(struct inode *inode,struct file *filp,unsigned int cmd);
int led_init(void);
void led_cleanup(void);
static struct file_operations LED_fops=
{
owner:THIS_MODULE,
#if 0
llseek:gpio_llseek,
read:gpio_read,
write:gpio_write,
#endif
ioctl:led_ioctl,
open:led_open,
release:led_release,
};
static int led_open(struct inode *inode,struct file *filp)
{
PCONC =(PCONC&(~(0XC)))|LED0_CON;//change led0,not change led1 and led2!
MOD_INC_USE_COUNT;
return 0;
}
static int led_release(struct inode *inode,struct file *filp)
{
MOD_DEC_USE_COUNT;
return 0;
}
static int led_ioctl(struct inode *inode,struct file *filp,unsigned int cmd)
{
switch(cmd)
{
case 0:
PDATC |= LED0_DAT;//LED0=1
break;
case 1:
PDATC &=~(LED0_DAT);//LED0=0
break;
default:
return -1;
break;
}
return 0;
}
int led_init(void){
int result;
result=register_chrdev(231,"led",&LED_fops);
if(result<0)
{
printk(KERN_ERR ":unable to register!\n");
return (result);
}
printk(KERN_DEBUG ":init OK\n");
return 0;
}
void led_cleanup(void)
{
unregister_chrdev(231,"led");
}
2.0
/uClinux-dist20050311/user/ledtest/{ledtest.c,Makefile}
用户空间程序
/************************************************************************************************************/
/*************ledtest.c*********************************************/
/***********************************************************************************************************/
#include
#include
#include
#include
#include
#include
void delay(int delay){
int i;
for(;delay>0;delay--){
for(i=0;i<5000;i++);
}
}
int main(){
int fd1;
int j;
fd1=open("/dev/led",O_RDWR);
if(fd1== -1){
printf("file can not be open");
return -1;
}
for(j=0;j<10;j++)
{
ioctl(fd1,1);
delay(1000);
ioctl(fd1,0);
delay(1000);
}
close(fd1);
return 0;
}
/************************************************************************************************************/
/*************Makefile*********************************************/
/***********************************************************************************************************/
EXEC = ledtest
OBJS = ledtest.o
all: $(EXEC)
$(EXEC): $(OBJS)
$(CC) $(LDFLAGS) -o $@ $(OBJS) $(LDLIBS)
romfs:
$(ROMFSINST) /bin/$(EXEC)
clean:
rm -f $(EXEC) *.elf *.gdb *.o
3.0
修改添加驱动配置文件和Makefile
uClinux-dist20050311/linux-2.4.x/drivers/char/{Makefile,config.in,mem.c}
Makefile
obj-$(CONFIG_C5471_WDT) += wdt_c5471.o
#add by panasonic 2009-12-12
obj-$(CONFIG_LED_TEST) += led.o
config.in
if [ "$CONFIG_CPU_S3C44B0X" = "y" ]; then
bool 'Samsung S3C44B0X serial ports support' CONFIG_SERIAL_S3C44B0X
bool 'test led drivers' CONFIG_LED_TEST
if [ "$CONFIG_SERIAL_S3C44B0X" = "y" ]; then
mem.c
int __init chr_dev_init(void)
{
if (devfs_register_chrdev(MEM_MAJOR,"mem",&memory_fops))
printk("unable to get major %d for memory devs\n", MEM_MAJOR);
memory_devfs_register();
rand_initialize();
/*add by panasonic 2009-1-1*/
#ifdef CONFIG_LED_TEST
led_init();
#endif
#ifdef CONFIG_I2C
i2c_init_all();
#endif
uClinux-dist20050311/vendors/Samsung/44B0/Makefile
DEVICES = \
tty,c,5,0 console,c,5,1 cua0,c,5,64 cua1,c,5,65 \
\
mem,c,1,1 kmem,c,1,2 null,c,1,3 \
zero,c,1,5 random,c,1,8 urandom,c,1,9 \
\
ram0,b,1,0 ram1,b,1,1 \
\
ptyp0,c,2,0 ptyp1,c,2,1 ptyp2,c,2,2 ptyp3,c,2,3 \
ptyp4,c,2,4 ptyp5,c,2,5 ptyp6,c,2,6 ptyp7,c,2,7 \
ptyp8,c,2,8 ptyp9,c,2,9 ptypa,c,2,10 ptypb,c,2,11 \
ptypc,c,2,12 ptypd,c,2,13 ptype,c,2,14 ptypf,c,2,15 \
\
rom0,b,31,0 rom1,b,31,1 rom2,b,31,2 rom3,b,31,3 \
rom4,b,31,4 rom5,b,31,5 rom6,b,31,6 rom7,b,31,7 \
rom8,b,31,8 rom9,b,31,9 \
\
tty0,c,4,0 tty1,c,4,1 tty2,c,4,2 tty3,c,4,3 \
ttyS0,c,4,64 ttyS1,c,4,65 \
\
ttyp0,c,3,0 ttyp1,c,3,1 ttyp2,c,3,2 ttyp3,c,3,3 \
ttyp4,c,3,4 ttyp5,c,3,5 ttyp6,c,3,6 ttyp7,c,3,7 \
ttyp8,c,3,8 ttyp9,c,3,9 ttypa,c,3,10 ttypb,c,3,11 \
ttypc,c,3,12 ttypd,c,3,13 ttype,c,3,14 ttypf,c,3,15 \
\
led,c,231,0
4.0
修改添加应用程序的配置和Makefile
uClinux-dist20050311/user/Makefile
dir_$(CONFIG_USER_HELLO) += app
dir_$(CONFIG_USER_LEDTEST) += ledtest
uClinux-dist20050311/config/config.in
#############################################################################
mainmenu_option next_comment
comment 'led driver test'
bool 'LEDtest' CONFIG_USER_LEDTEST
comment "LED_TEST"
endmenu
#############################################################################
5.0
编译连接调试
$make menuconfig
选中customize kernel settings/customize vendor/user settings
然后在kernel setting那里选中test led drivers
最后在vendor/user setting那里选中led drivers test下面的LEDtest应用程序
$make clean
$make dep
$make lib_only
$make user_only
$make romfs
$make image
$make
生成uclinux_rom.bin,uclinux_ram.bin.gz,romfs.img
uclinux_rom.bin拷贝到tftp输出目录。
将根文件系统映像挂载到回环设备,然后拷贝到nfs输出目录:
$mount -o loop romfs.img /mnt
$cp -a /mnt/* /home/panasonic/nfs-root/
在根文件系统的/etc目录新建init.d目录,在init.d目录下新建rcS脚本
#!/bin/sh
mount -t proc proc /proc
hostname 44b0
cat /etc/motd
/bin/msh
$chmod +x rcS添加可执行属性。
重启nfs服务
打开minicom
打开板子
$ping 192.168.0.1
$tftpboot 0xc500000
$bootm 0xc500000
进入shell后首先看看/dev下面有没有led的设备文件
也可以cat /proc/devices查看
好,看看bin目录有没有用户空间应用程序ledtest
运行./ledtest即可看到led一闪一闪的。
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。
linux c led 驱动程序,uclinux简单LED驱动程序相关推荐
- 嵌入式Linux LED,键盘,AD驱动程序开发
LED,键盘,AD驱动程序开发 原文: http://blog.sina.com.cn/s/blog_4083b2d70100bnlf.html 一:硬件平台及系统平台 C ...
- linux下ad键盘驱动,led、键盘、ADC驱动程序
LED,键盘,AD驱动程序开发 一:硬件平台及系统平台 CPU: S3C2410A SDRAM: 64M FLASH: K9F1208(64MB) NET: CS8900 友善之臂2410,优龙241 ...
- 使用驱动程序点亮LED灯
继第一节第一个驱动程序框架记录之后,本篇文章将会在上一篇驱动程序的框架下编写点亮LED的驱动程序,同样会对上一个框架进行修改,优化.接下来进入正题 1.点亮LED程序框架分析 在最开始之前先来梳理一下 ...
- Linux驱动编程篇(三)——LED驱动(一)简单LED驱动
一.LED驱动程序的实现目标及流程图 1.打开LED 2.关闭LED 二.LED驱动程序的实现部分 1.内核层LED驱动程序 2.应用层LED测试程序 三.内核层LED驱动程序的编程步骤 1.添加头文 ...
- 嵌入式linux驱动开发之点亮led(驱动编程思想之初体验)
这节我们就开始开始进行实战啦!这里顺便说一下啊,出来做开发的基础很重要啊,基础不好,迟早是要恶补的.个人深刻觉得像这种嵌入式的开发对C语言和微机接口与原理是非常依赖的,必须要有深厚的基础才能hold的 ...
- linux驱动编写--2--应用程序控制led闪烁
本系列教程的上一篇: linux驱动编写--1--点亮led 目标:编写一个驱动程序,实现上一篇没写的 "接口".并编写一个测试程序,透过驱动来控制led闪烁. 硬件:micro ...
- 【嵌入式Linux】嵌入式Linux驱动开发基础知识之LED驱动框架--面向对象、分层设计思想
文章目录 前言 1.LED驱动程序框架 1.1.对于LED驱动,我们想要什么样的接口? 1.2.LED驱动要怎么写,才能支持多个板子?分层写 1.3.程序分析 驱动程序 应用程序 Makefile 1 ...
- linux 使用设备树点亮LED 实战
文章目录 前言 一.使用设备树 1.1.使用寄存器函数读写 1.2.使用pinctrl和gpio子系统 前言 了解了设备树后,这一小节将使用设备树方式点亮LED 一.使用设备树 imx6ull-ali ...
- linux设备驱动第一篇:设备驱动程序简介
为什么80%的码农都做不了架构师?>>> 首先,我们知道驱动是内核的一部分,那么驱动在内核中到底扮演了什么角色呢? 设备驱动程序在内核中的角色:他们是一个个独立的"黑 ...
- Linux驱动编程 step-by-step (一)驱动程序的作用
驱动程序的作用: 简单来说 驱动程序就是使计算机与设备通信的特殊的代码,在作单片机时候(无OS)我们自己定义接口及自定义的结构来操作相关硬件,而在有OS的模式下我们操作的硬件是去实现对应的接口(这些接 ...
最新文章
- 1 项目里面如何打印log日志
- delphi 实现屏幕旋转代码_X86指令混淆之函数分析和代码块粉碎
- Java基础班学习笔记(15)GUI图形界面编程
- Module Zero概览
- html5 canvas图文编辑器源码_5个微信编辑器,再也不用为公众号发愁啦
- c#中窗体的close、dispose的区别及分析
- 教你如何监控 Java 线程池运行状态
- 重写(override / overwrite)
- FTP 两种传输模式 Binary 和 ASCII 的区别
- Android开发笔记(九十五)自定义Drawable
- 自动驾驶——模型部署的学习笔记
- D. Robot Rapping Results Report(拓扑排序+二分)
- 美国最受欢迎的婴儿名字:女孩Sophia和男孩Liam
- 做好产品需求文档的这十步
- 阿里云自助建站+模板建站+功能定制建站如何选择,详细教程
- Axure 点图片外区域即隐藏_多年后终迎换代,新奔腾B70——颜值即是正义!_搜狐汽车...
- LoadRunner 11压测时碰到错误Error: missing newline in E:\xx\RCV.dat
- ES6(ECMAScript6)学习笔记
- Powerbuilder历程
- android电视自动关机,android实现自动关机的具体方法
热门文章
- python程序输出田字格_Python程序练习题5.1-输出更大的田字格。
- Java——打印九宫格(奇数行方阵)
- linux 两个序列比对,Clustal:多序列比对分析、序列同源性分析
- 星梦邮轮世界梦号推出深圳母港特别航次
- 深圳两所新大学,来了!
- 计算机专业大学分数线低的,成绩徘徊在985、211分数线边缘,这4所大学考上容易,退档率极低...
- 如何连接新浪sae共享数据库
- 百度收录批量查询_如何查看网站是否被收录?
- SpringCloud蓝绿发布
- 80psi等于多少kpa_1kpa等于多少psi