当前位置: 技术问答>linux和unix
linux下点灯问题
来源: 互联网 发布时间:2017-01-26
本文导语: 硬件平台:OMAP-L138 软件平台:linux-2.6.32+VMware 问题描述: 板子上有个CPLD,CPLD的逻辑关系开发商不给,只给了文档描述,如下: 我自己写了个字符驱动用来控制灯的状态: 代码如下: static int __init hello_init(void) { ...
硬件平台:OMAP-L138
软件平台:linux-2.6.32+VMware
问题描述:
板子上有个CPLD,CPLD的逻辑关系开发商不给,只给了文档描述,如下:
我自己写了个字符驱动用来控制灯的状态:
代码如下:
动态加载的信息如下:
root@seed:/opt# insmod first_driver_hello.ko
led_addr is 0xc4888040.
helloword:: Hello module is installed!!!!!!
root@seed:/opt#
但是灯没有点亮,已证实硬件没有问题,请高手指点~~~
软件平台:linux-2.6.32+VMware
问题描述:
板子上有个CPLD,CPLD的逻辑关系开发商不给,只给了文档描述,如下:
我自己写了个字符驱动用来控制灯的状态:
代码如下:
static int __init hello_init(void)
{
unsigned long led_addr;
led_addr = (unsigned long)ioremap(0x64000040,0x08);
printk("nled_addr is 0x%x.n",led_addr);
writel(0x00,led_addr);
iounmap(led_addr);
printk("nhelloword:: Hello module is installed!!!!!!n");
return 0;
}
动态加载的信息如下:
root@seed:/opt# insmod first_driver_hello.ko
led_addr is 0xc4888040.
helloword:: Hello module is installed!!!!!!
root@seed:/opt#
但是灯没有点亮,已证实硬件没有问题,请高手指点~~~
|
随便在内核里找了段代码
if (!request_mem_region(up->port.mapbase, size, "serial")) {
ret = -EBUSY;
break;
}
if (up->port.flags & UPF_IOREMAP) {
up->port.membase = ioremap_nocache(up->port.mapbase,
size);
if (!up->port.membase) {
release_mem_region(up->port.mapbase, size);
ret = -ENOMEM;
}
}
这里你应该先request_mem_region
此外建议使用ioread8 iowrite8 这样的api
if (!request_mem_region(up->port.mapbase, size, "serial")) {
ret = -EBUSY;
break;
}
if (up->port.flags & UPF_IOREMAP) {
up->port.membase = ioremap_nocache(up->port.mapbase,
size);
if (!up->port.membase) {
release_mem_region(up->port.mapbase, size);
ret = -ENOMEM;
}
}
这里你应该先request_mem_region
此外建议使用ioread8 iowrite8 这样的api
|
这个驱动,请根据你的需要进行修改。
#include
#include
#include
#include
#include
#include
#include
#include
#include
void *R_GPBCON;
void *R_GPBDAT;
static u32 resave_gpbcon;
static u32 resave_gpbdat;
static struct input_dev my_led_dev;
static void iomap_gpb(void)
{
R_GPBCON = ioremap(0x56000010,0x4);
R_GPBDAT = ioremap(0x56000014,0x4);
}
static void unmap_gpb(void)
{
iounmap(R_GPBCON);
iounmap(R_GPBDAT);
}
static void init_led_reg(void)
{
u32 temp;
resave_gpbcon = __raw_readl(R_GPBCON);
resave_gpbdat = __raw_readl(R_GPBDAT);
temp = resave_gpbcon & (~(0xff