最初の一歩ということで、、ロードされたらLEDが点灯して、アンロード?されたらLEDが消えるデバドラを書いてみた。これはデバドラというよりローダブルモジュールか。。
作成したモジュールをinsmodでロードするとLEDが点灯し、rmmodでアンロード?するとLEDが消えました。コンパイル中 warning等も出ているのでもうちょっと清書が必要と思われます。でもまぁ動きました。。
Makefileは以下(Ubunts上に作成したクロス開発環境でコンパイル)
#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 0x13cchar * 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);
KERNEL_DIR = /usr/local/ti-sdk-am335x-evm0/board-support/linux-3.2.0-psp05.06.00.00MODULES = mymodule.o
obj-m := $(MODULES)# compiler options
CROSS_COMPILE = arm-arago-linux-gnueabi-
COMPILER_DIR = /usr/local/ti-sdk-am335x-evm0/linux-devkit/binARCH = 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) modulesclean:
make -C $(KERNEL_DIR) M=$(PWD) clean