목차
목 차
1. 개요
2. 설계
3. 알고리즘 분석
4. 실험 결과
5. 결론 및 토의
부록. 소스와 Makefile
1. app.c
2. gpiobutton.c
3. textlcd.c
4. Makefile
1. 개요
2. 설계
3. 알고리즘 분석
4. 실험 결과
5. 결론 및 토의
부록. 소스와 Makefile
1. app.c
2. gpiobutton.c
3. textlcd.c
4. Makefile
본문내용
{
set_ddram_address(i);
writebyte(' ');
}
/* 시간 표시 */
for(i = 0; time[i] != '\0' i++){
set_ddram_address(i);
writebyte(time[i]);
}
/* 시간을 s와 ms 단위로 각각 저장 */
sprintf(sec, "%d", timei/10);
sprintf(msec,"%d",timei%10);
j=0;
/* sec 부분 표시 */
for(i=7; sec[j]!='\0' i++){
set_ddram_address(i);
writebyte(sec[j]);
j++;
}
/* s와 ms 사이의 값 표시 */
set_ddram_address(i++);
writebyte('.');
j=0;
/* ms 단위 표시 */
for(;msec[j]!='\0'i++){
set_ddram_address(i);
writebyte(msec[j]);
j++;
}
}
/* 게임이 끝나면 "Game over!!"표시 */
void timer_stop(){
char end[] = "Game over!!"
int i;
for(i=0; end[i] != '\0' i++){
set_ddram_address(64+i);
writebyte(end[i]);
}
}
int textlcdport_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long t)
{
unsigned long time;
copy_from_user(&time, t , sizeof(time) );
switch(cmd)
{
case TEXTLCD_TIMER_START:
timer_start(time);
break
case TEXTLCD_CLEAR:
clear_display();
break
case TEXTLCD_TIMER_STOP:
timer_stop();
break
}
return 1;
}
int textlcdport_open(struct inode *inode, struct file *file)
{
/* 메세지 */
char welcome[] = "Welcome to our game!"
char msg[] = "Press GPIO 16 button!"
int i;
/* 모든 문자 제거 */
for(i = 0; i<20; i++)
{
set_ddram_address(i);
writebyte(' ');
}
for(i = 64; i<84; i++)
{
set_ddram_address(i);
writebyte(' ');
}
/* 문자 표시 */
for(i=0; welcome[i] != '\0'i++){
set_ddram_address(i);
writebyte(welcome[i]);
}
for(i = 0; msg[i] != '\0' ; i++)
{
set_ddram_address(i+64);
writebyte(msg[i]);
}
MOD_INC_USE_COUNT; // open function에 항상 사용
printk("Opencall for text LCD device \n");
return 0;
}
int textlcdport_release(struct inode *inode, struct file *file)
{
MOD_DEC_USE_COUNT; // release function에 항상 사용
printk("Releasecall for Char Device \n");
return 0;
}
ssize_t textlcdport_write(struct file *file, const char *buffer, size_t length, loff_t *offset)
{
return length;
}
static struct file_operations textlcd_fops =
{
write : textlcdport_write,
ioctl : textlcdport_ioctl,
open : textlcdport_open,
release : textlcdport_release,
};
int init_module(void)
{
printk("TESTDEVICE DRIVER \n");
strcpy(device_name, "TEST_Device");
result= register_chrdev(major_number, device_name, &textlcd_fops);
if(result<0)
{
printk(KERN_WARNING "device: can get major number");
return result;
}
if(major_number==0)
major_number=result;
printk("major_number:%d\n",major_number);
return 0;
}
void cleanup_module(void)
{
printk("CleanUp Module\n");
if(!unregister_chrdev(major_number,device_name))
printk("%s: Successful deregistration\n",device_name);
else
printk("%s: Cleanup failed",device_name);
}
4. Makefile
CC:=arm-linux-gcc
INCLUDEDIR := /root/PXA255-Pro/Kernel/linux-2.4.19-pro3_nlcd/include
CFLAGS := -D__KERNEL__ -Wall -O2 -DMODULE
CFLAGS2 := -I.. -I$(INCLUDEDIR)
CROSS_COMPILE := arm-linux-
CC=$(CROSS_COMPILE)gcc
LD=$(CROSS_COMPILE)ld
All: gpiobutton textlcd app
gpiobutton :
$(CC) $(CFLAGS) $(CFLAGS2) -c -o gpiobutton.o gpiobutton.c
textlcd:
$(CC) $(CFLAGS) -c textlcd.c -o textlcd.o
app :
$(CC) -I$(INCLUDEDIR) -o app app.c -lrt
clean :
rm -rf app *.o
set_ddram_address(i);
writebyte(' ');
}
/* 시간 표시 */
for(i = 0; time[i] != '\0' i++){
set_ddram_address(i);
writebyte(time[i]);
}
/* 시간을 s와 ms 단위로 각각 저장 */
sprintf(sec, "%d", timei/10);
sprintf(msec,"%d",timei%10);
j=0;
/* sec 부분 표시 */
for(i=7; sec[j]!='\0' i++){
set_ddram_address(i);
writebyte(sec[j]);
j++;
}
/* s와 ms 사이의 값 표시 */
set_ddram_address(i++);
writebyte('.');
j=0;
/* ms 단위 표시 */
for(;msec[j]!='\0'i++){
set_ddram_address(i);
writebyte(msec[j]);
j++;
}
}
/* 게임이 끝나면 "Game over!!"표시 */
void timer_stop(){
char end[] = "Game over!!"
int i;
for(i=0; end[i] != '\0' i++){
set_ddram_address(64+i);
writebyte(end[i]);
}
}
int textlcdport_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long t)
{
unsigned long time;
copy_from_user(&time, t , sizeof(time) );
switch(cmd)
{
case TEXTLCD_TIMER_START:
timer_start(time);
break
case TEXTLCD_CLEAR:
clear_display();
break
case TEXTLCD_TIMER_STOP:
timer_stop();
break
}
return 1;
}
int textlcdport_open(struct inode *inode, struct file *file)
{
/* 메세지 */
char welcome[] = "Welcome to our game!"
char msg[] = "Press GPIO 16 button!"
int i;
/* 모든 문자 제거 */
for(i = 0; i<20; i++)
{
set_ddram_address(i);
writebyte(' ');
}
for(i = 64; i<84; i++)
{
set_ddram_address(i);
writebyte(' ');
}
/* 문자 표시 */
for(i=0; welcome[i] != '\0'i++){
set_ddram_address(i);
writebyte(welcome[i]);
}
for(i = 0; msg[i] != '\0' ; i++)
{
set_ddram_address(i+64);
writebyte(msg[i]);
}
MOD_INC_USE_COUNT; // open function에 항상 사용
printk("Opencall for text LCD device \n");
return 0;
}
int textlcdport_release(struct inode *inode, struct file *file)
{
MOD_DEC_USE_COUNT; // release function에 항상 사용
printk("Releasecall for Char Device \n");
return 0;
}
ssize_t textlcdport_write(struct file *file, const char *buffer, size_t length, loff_t *offset)
{
return length;
}
static struct file_operations textlcd_fops =
{
write : textlcdport_write,
ioctl : textlcdport_ioctl,
open : textlcdport_open,
release : textlcdport_release,
};
int init_module(void)
{
printk("TESTDEVICE DRIVER \n");
strcpy(device_name, "TEST_Device");
result= register_chrdev(major_number, device_name, &textlcd_fops);
if(result<0)
{
printk(KERN_WARNING "device: can get major number");
return result;
}
if(major_number==0)
major_number=result;
printk("major_number:%d\n",major_number);
return 0;
}
void cleanup_module(void)
{
printk("CleanUp Module\n");
if(!unregister_chrdev(major_number,device_name))
printk("%s: Successful deregistration\n",device_name);
else
printk("%s: Cleanup failed",device_name);
}
4. Makefile
CC:=arm-linux-gcc
INCLUDEDIR := /root/PXA255-Pro/Kernel/linux-2.4.19-pro3_nlcd/include
CFLAGS := -D__KERNEL__ -Wall -O2 -DMODULE
CFLAGS2 := -I.. -I$(INCLUDEDIR)
CROSS_COMPILE := arm-linux-
CC=$(CROSS_COMPILE)gcc
LD=$(CROSS_COMPILE)ld
All: gpiobutton textlcd app
gpiobutton :
$(CC) $(CFLAGS) $(CFLAGS2) -c -o gpiobutton.o gpiobutton.c
textlcd:
$(CC) $(CFLAGS) -c textlcd.c -o textlcd.o
app :
$(CC) -I$(INCLUDEDIR) -o app app.c -lrt
clean :
rm -rf app *.o
소개글