arm7(S3C44B0X)数码管驱动程序
来源:互联网 发布:推荐一款翻译软件 编辑:程序博客网 时间:2024/05/16 11:09
本程序适合基于三星44B0X arm7的开发板。我买的是蓝海微芯的开发板,不过从bios的代码可以看出是仿优龙的。八个数码管(1-8)接在了PCONE I/O口上。能够控制的有1,4-7。
如何在内核源代码树中添加驱动程序和在romfs中添加用户应用程序可以参考前两篇文章,下面只粘贴代码,注释的代码是2.6内核注册字符设备的代码,而我的板子是2.4的内核。
先看一下板子的输出吧:
____ _ _
/ __| ||_|
_ _| | | | _ ____ _ _ _ _
| | | | | | || | _ /| | | |/ // /
| |_| | |__| || | | | | |_| |/ /
| ___/____|_||_|_| |_|/____|/_//_/
| |
|_|
For further information check:
http://www.uclinux.org/
BusyBox v0.60.5 (2007.06.07-12:05+0000) Built-in shell (msh)
Enter 'help' for a list of built-in commands.
# more /proc/sys/kernel/printk
7 4 1 7
# ls -l /dev/led
crw-r--r-- 1 root root 254, 0 Jan 01 00:00 /dev/led
# more /proc/ioports
01d20028-01d20033 : led
06000000-06000ffe : cs8900a
# led
Hey! device opened
Turn off LED1
/dev/led opened, fd=3
Turn off LED4
Turn off LED5
Turn off LED6
Turn off LED7
Turn on LED1
Turn on LED4
Turn on LED5
Turn on LED6
Turn on LED7
Hmmm! device closed
/dev/led closed :)
1. uClinux-dist/linux-2.4.x/drivers/char/led.c
#include <linux/module.h>
#include <linux/config.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/signal.h>
#include <linux/interrupt.h>
#include <linux/errno.h>
#include <linux/ioport.h>
#include <linux/fs.h>
#include <asm/hardware.h>
#include <asm/io.h>
#include <asm/mach/irq.h>
#include <asm/arch/irqs.h>
#include <asm/uaccess.h>
#include <asm/irq.h>
#include "led.h"
MODULE_LICENSE ("GPL");
int led_major = 254;
// int led_minor = 0;
// int number_of_devices = 1;
// struct cdev cdev;
dev_t dev = 0;
static int led_open (struct inode *inode, struct file *file)
{
printk (KERN_INFO "Hey! device opened/n");
return 0;
}
static int led_release (struct inode *inode, struct file *file)
{
printk (KERN_INFO "Hmmm! device closed/n");
return 0;
}
void led_manager(int arg, int nr)
{
if (arg == 0) {
printk (KERN_INFO "Turn on LED%d/n", nr);
outb(inb(S3C44B0X_PDATE) & ~(1 << (nr - 1)), S3C44B0X_PDATE);
} else if (arg == 1) {
printk (KERN_INFO "Turn off LED%d/n", nr);
outb(inb(S3C44B0X_PDATE) | (1 << (nr - 1)), S3C44B0X_PDATE);
} else
printk (KERN_INFO "Wrong arg/n");
}
int led_ioctl (struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg)
{
int ret = 0;
int nr = _IOC_NR(cmd);
led_manager(arg, nr);
// switch (cmd) {
// case LED1:
// led_manager(arg, nr);
// break;
//
// case LED4:
// led_manager(arg, nr);
// break;
//
// case LED5:
// led_manager(arg, nr);
// break;
//
// case LED6:
// led_manager(arg, nr);
// break;
//
// case LED7:
// led_manager(arg, nr);
// break;
//
// default:
// break;
// }
return ret;
}
struct file_operations led_fops = {
.owner = THIS_MODULE,
.open = led_open,
.release = led_release,
.ioctl = led_ioctl,
};
// static void char_reg_setup_cdev (void)
// {
// int error, devno = MKDEV (led_major, led_minor);
// cdev_init (&cdev, &led_fops);
// cdev.owner = THIS_MODULE;
// cdev.ops = &led_fops;
// error = cdev_add (&cdev, devno , 1);
// if (error)
// printk (KERN_NOTICE "Error %d adding char_reg_setup_cdev", error);
//
// }
static int __init led_init (void)
{
int result;
// dev = MKDEV (led_major, led_minor);
// result = register_chrdev_region (dev, number_of_devices, "led");
request_region(S3C44B0X_PCONE, 12, "led");
result = register_chrdev(led_major, "led", &led_fops);
if (result<0) {
printk (KERN_WARNING "led: can't get major number %d/n", led_major);
return result;
}
outl(0x00025569, S3C44B0X_PCONE);
outb((inl(S3C44B0X_PDATE) & 0x06), S3C44B0X_PDATE);
// char_reg_setup_cdev ();
printk (KERN_INFO "led_ioctl driver done/n");
return 0;
}
static void __exit led_exit (void)
{
// dev_t devno = MKDEV (led_major, led_minor);
// cdev_del (&cdev);
// unregister_chrdev_region (devno, number_of_devices);
release_region(S3C44B0X_PCONE, 12);
unregister_chrdev(led_major, "led");
printk (KERN_INFO "led_ioctl cleaned up/n");
}
module_init (led_init);
module_exit (led_exit);
2. uClinux-dist/linux-2.4.x/drivers/char/led.h
#define LED_MAGIC 'k'
#define LED1 _IO (LED_MAGIC, 1)
#define LED4 _IO (LED_MAGIC, 4)
#define LED5 _IO (LED_MAGIC, 5)
#define LED6 _IO (LED_MAGIC, 6)
#define LED7 _IO (LED_MAGIC, 7)
3. uClinux-dist/user/led/led.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <fcntl.h>
#include "led.h"
#define TURNON 0
#define TURNOFF 1
int main (void)
{
int fd;
fd = open ("/dev/led",O_RDWR);
if (fd < 0) {
printf ("fd open failed/n");
exit(0);
}
printf ("/n/dev/led opened, fd=%d/n",fd);
ioctl (fd, LED1, TURNOFF);
sleep(1);
ioctl (fd, LED4, TURNOFF);
sleep(1);
ioctl (fd, LED5, TURNOFF);
sleep(1);
ioctl (fd, LED6, TURNOFF);
sleep(1);
ioctl (fd, LED7, TURNOFF);
sleep(1);
ioctl (fd, LED1, TURNON);
sleep(1);
ioctl (fd, LED4, TURNON);
sleep(1);
ioctl (fd, LED5, TURNON);
sleep(1);
ioctl (fd, LED6, TURNON);
sleep(1);
ioctl (fd, LED7, TURNON);
sleep(1);
close (fd);
printf ("/dev/led closed :)/n");
return 0;
}
如何在内核源代码树中添加驱动程序和在romfs中添加用户应用程序可以参考前两篇文章,下面只粘贴代码,注释的代码是2.6内核注册字符设备的代码,而我的板子是2.4的内核。
先看一下板子的输出吧:
____ _ _
/ __| ||_|
_ _| | | | _ ____ _ _ _ _
| | | | | | || | _ /| | | |/ // /
| |_| | |__| || | | | | |_| |/ /
| ___/____|_||_|_| |_|/____|/_//_/
| |
|_|
For further information check:
http://www.uclinux.org/
BusyBox v0.60.5 (2007.06.07-12:05+0000) Built-in shell (msh)
Enter 'help' for a list of built-in commands.
# more /proc/sys/kernel/printk
7 4 1 7
# ls -l /dev/led
crw-r--r-- 1 root root 254, 0 Jan 01 00:00 /dev/led
# more /proc/ioports
01d20028-01d20033 : led
06000000-06000ffe : cs8900a
# led
Hey! device opened
Turn off LED1
/dev/led opened, fd=3
Turn off LED4
Turn off LED5
Turn off LED6
Turn off LED7
Turn on LED1
Turn on LED4
Turn on LED5
Turn on LED6
Turn on LED7
Hmmm! device closed
/dev/led closed :)
1. uClinux-dist/linux-2.4.x/drivers/char/led.c
#include <linux/module.h>
#include <linux/config.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/signal.h>
#include <linux/interrupt.h>
#include <linux/errno.h>
#include <linux/ioport.h>
#include <linux/fs.h>
#include <asm/hardware.h>
#include <asm/io.h>
#include <asm/mach/irq.h>
#include <asm/arch/irqs.h>
#include <asm/uaccess.h>
#include <asm/irq.h>
#include "led.h"
MODULE_LICENSE ("GPL");
int led_major = 254;
// int led_minor = 0;
// int number_of_devices = 1;
// struct cdev cdev;
dev_t dev = 0;
static int led_open (struct inode *inode, struct file *file)
{
printk (KERN_INFO "Hey! device opened/n");
return 0;
}
static int led_release (struct inode *inode, struct file *file)
{
printk (KERN_INFO "Hmmm! device closed/n");
return 0;
}
void led_manager(int arg, int nr)
{
if (arg == 0) {
printk (KERN_INFO "Turn on LED%d/n", nr);
outb(inb(S3C44B0X_PDATE) & ~(1 << (nr - 1)), S3C44B0X_PDATE);
} else if (arg == 1) {
printk (KERN_INFO "Turn off LED%d/n", nr);
outb(inb(S3C44B0X_PDATE) | (1 << (nr - 1)), S3C44B0X_PDATE);
} else
printk (KERN_INFO "Wrong arg/n");
}
int led_ioctl (struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg)
{
int ret = 0;
int nr = _IOC_NR(cmd);
led_manager(arg, nr);
// switch (cmd) {
// case LED1:
// led_manager(arg, nr);
// break;
//
// case LED4:
// led_manager(arg, nr);
// break;
//
// case LED5:
// led_manager(arg, nr);
// break;
//
// case LED6:
// led_manager(arg, nr);
// break;
//
// case LED7:
// led_manager(arg, nr);
// break;
//
// default:
// break;
// }
return ret;
}
struct file_operations led_fops = {
.owner = THIS_MODULE,
.open = led_open,
.release = led_release,
.ioctl = led_ioctl,
};
// static void char_reg_setup_cdev (void)
// {
// int error, devno = MKDEV (led_major, led_minor);
// cdev_init (&cdev, &led_fops);
// cdev.owner = THIS_MODULE;
// cdev.ops = &led_fops;
// error = cdev_add (&cdev, devno , 1);
// if (error)
// printk (KERN_NOTICE "Error %d adding char_reg_setup_cdev", error);
//
// }
static int __init led_init (void)
{
int result;
// dev = MKDEV (led_major, led_minor);
// result = register_chrdev_region (dev, number_of_devices, "led");
request_region(S3C44B0X_PCONE, 12, "led");
result = register_chrdev(led_major, "led", &led_fops);
if (result<0) {
printk (KERN_WARNING "led: can't get major number %d/n", led_major);
return result;
}
outl(0x00025569, S3C44B0X_PCONE);
outb((inl(S3C44B0X_PDATE) & 0x06), S3C44B0X_PDATE);
// char_reg_setup_cdev ();
printk (KERN_INFO "led_ioctl driver done/n");
return 0;
}
static void __exit led_exit (void)
{
// dev_t devno = MKDEV (led_major, led_minor);
// cdev_del (&cdev);
// unregister_chrdev_region (devno, number_of_devices);
release_region(S3C44B0X_PCONE, 12);
unregister_chrdev(led_major, "led");
printk (KERN_INFO "led_ioctl cleaned up/n");
}
module_init (led_init);
module_exit (led_exit);
2. uClinux-dist/linux-2.4.x/drivers/char/led.h
#define LED_MAGIC 'k'
#define LED1 _IO (LED_MAGIC, 1)
#define LED4 _IO (LED_MAGIC, 4)
#define LED5 _IO (LED_MAGIC, 5)
#define LED6 _IO (LED_MAGIC, 6)
#define LED7 _IO (LED_MAGIC, 7)
3. uClinux-dist/user/led/led.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <fcntl.h>
#include "led.h"
#define TURNON 0
#define TURNOFF 1
int main (void)
{
int fd;
fd = open ("/dev/led",O_RDWR);
if (fd < 0) {
printf ("fd open failed/n");
exit(0);
}
printf ("/n/dev/led opened, fd=%d/n",fd);
ioctl (fd, LED1, TURNOFF);
sleep(1);
ioctl (fd, LED4, TURNOFF);
sleep(1);
ioctl (fd, LED5, TURNOFF);
sleep(1);
ioctl (fd, LED6, TURNOFF);
sleep(1);
ioctl (fd, LED7, TURNOFF);
sleep(1);
ioctl (fd, LED1, TURNON);
sleep(1);
ioctl (fd, LED4, TURNON);
sleep(1);
ioctl (fd, LED5, TURNON);
sleep(1);
ioctl (fd, LED6, TURNON);
sleep(1);
ioctl (fd, LED7, TURNON);
sleep(1);
close (fd);
printf ("/dev/led closed :)/n");
return 0;
}
- arm7(S3C44B0X)数码管驱动程序
- arm7(S3C44B0X)键盘中断驱动程序
- UCOS-II移植到三星S3C44B0X(ARM7)
- ARM7---数码管显示---0-F
- S3C44B0X按键键盘的uClinux驱动程序设计
- S3C44B0X按键键盘的uClinux驱动程序设计
- S3C44B0X键盘的uClinux驱动程序设计
- S3C44B0X键盘的uClinux驱动程序设计
- 7段数码管显示器公用驱动程序
- arm7
- 关于ARM7驱动12232f LCD的驱动程序
- 基于中颖SH88F516驱动TM1640的LED数码管驱动程序
- 数码管
- 数码管
- 数码管
- 数码管
- 数码管
- 数码管
- 控制自己不要和她联系了
- 第一天
- 数据中心的五大趋势
- 深入理解C#的中static
- 近六成职场人患上“工作综合征”
- arm7(S3C44B0X)数码管驱动程序
- arm7(S3C44B0X)键盘中断驱动程序
- ASP的cookie和session区别
- 出来混,迟早要还的
- 管理SAS DashBoard 仪表盘的安全
- 一道小题:指向二维数组的指针...我的一点理解(int w[2][3],(*pw)[3];pw=w; 则下列错误的是 a.*(w[0]+2) b.*(pw+1)[2] c..pw[0][0] d.*(pw[1]+2) )
- GRUB入门教程
- [JavaME入门篇][1]JavaME开发环境搭建
- 如何修改 SAP 登录界面的文字(事务码SE61)