chakokuのブログ(rev4)

テック・コミック・DTM・・・ごくまれにチャリ

BeagleBone用にデバドラを書く(その1)

最初の一歩ということで、、ロードされたらLEDが点灯して、アンロード?されたらLEDが消えるデバドラを書いてみた。これはデバドラというよりローダブルモジュールか。。

作成したモジュールをinsmodでロードするとLEDが点灯し、rmmodでアンロード?するとLEDが消えました。コンパイル中 warning等も出ているのでもうちょっと清書が必要と思われます。でもまぁ動きました。。


#include
#include
#include
#include
MODULE_LICENSE("GPL");

#define CONTROL_MODULE 0x44E10000
#define CONF_GPMC_A5 0x854
#define CONF_GPMC_A6 0x858
#define CONF_GPMC_A7 0x85C
#define CONF_GPMC_A8 0x860

#define CM_PER 0x44E00000
#define GPIO1_CLKCTRL 0xac
#define GPIO1 0x4804c000
#define GPIO_OE 0x134
#define GPIO_DATAOUT 0x13c

char * ctrl_module_base;
char * cm_per_base;
char * gpio1_base;

static int simple_init(void)
{
extern char * ctrl_module_base;
extern char * cm_per_base;
extern char * gpio1_base;

unsigned long set,val;

ctrl_module_base = ioremap_nocache(CONTROL_MODULE,CONF_GPMC_A8+7);

// set pad control
set = 0x1 << 6 | 0x0 << 5 | 0x1 << 4 | 0x1 << 3 | 0x7;
val = ioread32(ctrl_module_base + CONF_GPMC_A5);
iowrite32(val|set, ctrl_module_base + CONF_GPMC_A5);
val = ioread32(ctrl_module_base + CONF_GPMC_A6);
iowrite32(val|set,ctrl_module_base + CONF_GPMC_A6);
val = ioread32(ctrl_module_base + CONF_GPMC_A7);
iowrite32(val|set, ctrl_module_base + CONF_GPMC_A7);
val = ioread32(ctrl_module_base + CONF_GPMC_A8);
iowrite32(val|set, ctrl_module_base + CONF_GPMC_A8);

// GPIO1 clock enable
cm_per_base = ioremap_nocache(CM_PER , GPIO1_CLKCTRL+7);
set = 0x1 << 18 | 0x0 << 16 | 0x2;
val = ioread32(cm_per_base + GPIO1_CLKCTRL);
iowrite32(val|set, cm_per_base + GPIO1_CLKCTRL );

gpio1_base = ioremap_nocache(GPIO1 , GPIO_DATAOUT+7);
val = ioread32(gpio1_base + GPIO_OE);
val &= ~(1 << 24 | 1 << 23 | 1 << 22 | 1 << 21);
iowrite32(val,gpio1_base + GPIO_OE);

// set GPIO1_21,..,24 to L
val = ioread32(gpio1_base + GPIO_DATAOUT);
val &= ~(1 << 24 | 1 << 23 | 1 << 22 | 1 << 21);
iowrite32(val,gpio1_base + GPIO_DATAOUT);

// set GPIO1_21 to H
val = ioread32(gpio1_base + GPIO_DATAOUT);
val |= (1 << 21);
iowrite32(val,gpio1_base + GPIO_DATAOUT);

printk("Hello ok?\n");
return 0;
}

static void simple_exit(void)
{
extern char * ctrl_module_base;
extern char * cm_per_base;
extern char * gpio1_base;

unsigned long val;

// set GPIO1_21 to L
val = ioread32(gpio1_base + GPIO_DATAOUT);
val &= ~(1 << 21);
iowrite32(val,gpio1_base + GPIO_DATAOUT);

iounmap(ctrl_module_base);
iounmap(cm_per_base);
iounmap(gpio1_base);
printk("Goodbye ok??\n");
}

module_init(simple_init);
module_exit(simple_exit);

Makefileは以下(Ubunts上に作成したクロス開発環境でコンパイル)

KERNEL_DIR = /usr/local/ti-sdk-am335x-evm0/board-support/linux-3.2.0-psp05.06.00.00

MODULES = mymodule.o
obj-m := $(MODULES)

# compiler options
CROSS_COMPILE = arm-arago-linux-gnueabi-
COMPILER_DIR = /usr/local/ti-sdk-am335x-evm0/linux-devkit/bin

ARCH = arm
WARN = -Wall

# include directories
INCL = -I.
INCL += -I$(KERNEL_DIR)/include
CFLAGS = $(DEFS) $(WARN) $(INCL)

all:
$(MAKE) ARCH=$(ARCH) CROSS_COMPILE=$(COMPILER_DIR)/$(CROSS_COMPILE) -C $(KERNEL_DIR) M=$(PWD) modules

clean:
make -C $(KERNEL_DIR) M=$(PWD) clean