Skip to content
Snippets Groups Projects
Commit 561a1367 authored by 201221016Kim Haeram's avatar 201221016Kim Haeram
Browse files

Initial commit

parents
No related branches found
No related tags found
No related merge requests found
Pipeline #3856 canceled
app/app 0 → 100755
File added
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <sys/sysmacros.h>
#define LED_MAJOR_NUMBER 504
#define LED_MINOR_NUMBER 100
#define LED_DEV_PATH_NAME "/dev/uart_ioctl"
#define IOCTL_MAGIC_NUMBER 'l'
#define IOCTL_CMD_DIRECTION _IOWR(IOCTL_MAGIC_NUMBER, 0, int)
#define IOCTL_CMD_RECEIVE _IOWR(IOCTL_MAGIC_NUMBER, 1, int)
#define IOCTL_CMD_TRANSMIT _IOWR(IOCTL_MAGIC_NUMBER, 2, int)
int main(void)
{
// dev_t led_ioctl;
int fd;
int txrx;
char buf[1024];
// led_ioctl = makedev(LED_MAJOR_NUMBER, LED_MINOR_NUMBER);
// mknod(LED_DEV_PATH_NAME, S_IFCHR|0666, led_dev);
fd = open(LED_DEV_PATH_NAME, O_RDWR);
if(fd < 0){
printf("fail to open led\n");
return -1;
}
printf("rx: 0, tx: 1. enter parameter: ");
scanf("%d", &txrx);
ioctl(fd, IOCTL_CMD_DIRECTION, &txrx);
if(txrx == 0){
printf("now RPi keep reading..\n");
while(1){
ioctl(fd, IOCTL_CMD_RECEIVE, &buf);
printf("%1023s",buf);
}
}else if(txrx == 1){
printf("now RPi keep writing..\n");
while(1){
printf("Input string: ");
scanf("%1023s",buf);
ioctl(fd, IOCTL_CMD_TRANSMIT, &buf);
}
}else{
printf("invalid parameter. program shutdown\n");
}
close(fd);
return 0;
}
cmd_/home/pi/Workspace/project_6/dev/dev.ko := ld -r -EL -T ./scripts/module-common.lds -T ./arch/arm/kernel/module.lds --build-id -o /home/pi/Workspace/project_6/dev/dev.ko /home/pi/Workspace/project_6/dev/dev.o /home/pi/Workspace/project_6/dev/dev.mod.o ; true
This diff is collapsed.
This diff is collapsed.
/home/pi/Workspace/project_6/dev/dev.ko
/home/pi/Workspace/project_6/dev/dev.o
KERNEL_DIR = /lib/modules/4.19.66-v7+/build
obj-m := dev.o
PWD := $(shell pwd)
all :
make -C $(KERNEL_DIR) M=$(PWD) modules
clean:
make -C $(KERNEL_DIR) M=$(PWD) clean
dev/dev.c 0 → 100644
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/uaccess.h>
#include <linux/slab.h>
#include <linux/delay.h>
#include <asm/mach/map.h>
#include <asm/io.h>
#include <asm/uaccess.h>
#define UART_MAJOR_NUMBER 504
#define UART_DEV_NAME "uart_ioctl"
#define GPIO_BASE_ADDR 0x3F200000
#define GPFSEL1 0x04
#define USRT_BASE_ADDR 0x3F201000
#define UART_DR 0x00
#define UART_FR 0x18
#define UART_CR 0x30
#define UART_LCRH 0X2C
#define IOCTL_MAGIC_NUMBER 'l'
#define IOCTL_CMD_DIRECTION _IOWR(IOCTL_MAGIC_NUMBER, 0, int)
#define IOCTL_CMD_RECEIVE _IOWR(IOCTL_MAGIC_NUMBER, 1, int)
#define IOCTL_CMD_TRANSMIT _IOWR(IOCTL_MAGIC_NUMBER, 2, int)
static void __iomem *gpio_base;
static void __iomem *usrt_base;
volatile unsigned int *gpsel1;
volatile unsigned int *uart_dr;
volatile unsigned int *uart_fr;
volatile unsigned int *uart_cr;
volatile unsigned int *uart_lcrh;
int uart_open(struct inode *inode, struct file *filp){
printk(KERN_ALERT "UART driver open!!\n");
gpio_base = ioremap(GPIO_BASE_ADDR, 0x60);
usrt_base = ioremap(USRT_BASE_ADDR, 0x60);
gpsel1 = (volatile unsigned int *)(gpio_base + GPFSEL1);
uart_dr = (volatile unsigned int *)(usrt_base + UART_DR);
uart_fr = (volatile unsigned int *)(usrt_base + UART_FR);
uart_cr = (volatile unsigned int *)(usrt_base + UART_CR); // 185PAGE
uart_lcrh = (volatile unsigned int *)(usrt_base + UART_LCRH);
return 0;
}
int uart_release(struct inode *inode, struct file *filp){
printk(KERN_ALERT "UART driver closed!!\n");
iounmap((void *)gpio_base);
return 0;
}
long uart_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
{
unsigned int txff, rxfe;
int kbuf=-1;
int i=0;
char cbuf[1024];
int writelen = 0;
char singlechar = '\0';
switch (cmd){
case IOCTL_CMD_DIRECTION:
copy_from_user(&kbuf,(const void*)arg, 4);
*gpsel1 |= (1<<14); // gpio14 takes alt0 TXD0
*gpsel1 |= (1<<17); // gpio15 takes alt0 RXD0
if(kbuf==0){
// input
*uart_cr &= ~(1<<0); // disable uart.
*uart_lcrh &= ~(1<<4); // FEN <- 0.
*uart_cr &= ~(1<<8); // TXE <- 0
*uart_cr |= (1<<9); // RXE <- 1
*uart_lcrh |= (1<<4); // FEN <- 1.
*uart_cr |= (1<<0); // enable uart.
} else if(kbuf==1){
// output
*uart_cr &= ~(1<<0); // disable uart.
*uart_lcrh &= ~(1<<4); // FEN <- 0.
*uart_cr &= ~(1<<9); // RXE <- 0
*uart_cr |= (1<<8); // TXE <- 1
*uart_lcrh |= (1<<4); // FEN <- 1.
*uart_cr |= (1<<0); // enable uart.
} else{
// error.
printk(KERN_ALERT "ERR in DIRECTION: invalid operand\n");
}
break;
case IOCTL_CMD_RECEIVE:
printk(KERN_ALERT "receive called\n");
/*
rxfe = 0;
while(!rxfe){
rxfe = (*uart_fr>>4); // read RXFE
} // now rx is not empty
*/
i=0;
//while(!rxfe){
cbuf[i] = (char) (*uart_dr); // read DATA
i++;
//if(i>1022) break;
//rxfe = (*uart_fr>>4); // read RXFE
//}
cbuf[i]='\n';
copy_to_user((const void*)arg, cbuf, 1024);
break;
case IOCTL_CMD_TRANSMIT:
printk(KERN_ALERT "transmit called\n");
copy_from_user(&cbuf,(const void*)arg, 1024);
writelen = strlen(cbuf);
for(i=0; i<writelen; i++){
singlechar = cbuf[i];
/*
txff = 1;
while(txff){
txff = (*uart_fr>>5); // read TXFF
} // now tx fifo is not full
* */
*uart_dr |= (int) singlechar; // write DATA
}
break;
}
return 0;
}
static struct file_operations uart_fops = {
.owner = THIS_MODULE,
.open = uart_open,
.release = uart_release,
.unlocked_ioctl = uart_ioctl
};
int __init uart_init(void){
if(register_chrdev(UART_MAJOR_NUMBER, UART_DEV_NAME, &uart_fops) < 0 )
printk(KERN_ALERT "UART driver initialization failed\n");
else
printk(KERN_ALERT "UART driver initialization successful\n");
return 0;
}
void __exit uart_exit(void){
unregister_chrdev(UART_MAJOR_NUMBER, UART_DEV_NAME);
printk(KERN_ALERT "UART driver exit done\n");
}
module_init(uart_init);
module_exit(uart_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Haeram");
MODULE_DESCRIPTION("des");
File added
#include <linux/build-salt.h>
#include <linux/module.h>
#include <linux/vermagic.h>
#include <linux/compiler.h>
BUILD_SALT;
MODULE_INFO(vermagic, VERMAGIC_STRING);
MODULE_INFO(name, KBUILD_MODNAME);
__visible struct module __this_module
__attribute__((section(".gnu.linkonce.this_module"))) = {
.name = KBUILD_MODNAME,
.init = init_module,
#ifdef CONFIG_MODULE_UNLOAD
.exit = cleanup_module,
#endif
.arch = MODULE_ARCH_INIT,
};
#ifdef CONFIG_RETPOLINE
MODULE_INFO(retpoline, "Y");
#endif
static const struct modversion_info ____versions[]
__used
__attribute__((section("__versions"))) = {
{ 0xf230cadf, "module_layout" },
{ 0x6bc3fbc0, "__unregister_chrdev" },
{ 0xe549e5f5, "__register_chrdev" },
{ 0xf4fa543b, "arm_copy_to_user" },
{ 0x97255bdf, "strlen" },
{ 0xdb7305a1, "__stack_chk_fail" },
{ 0x5f754e5a, "memset" },
{ 0x28cc25db, "arm_copy_from_user" },
{ 0x8f678b07, "__stack_chk_guard" },
{ 0xedc03953, "iounmap" },
{ 0x2e5810c6, "__aeabi_unwind_cpp_pr1" },
{ 0xe97c4103, "ioremap" },
{ 0x7c32d0f0, "printk" },
{ 0xb1ad28e0, "__gnu_mcount_nc" },
};
static const char __module_depends[]
__used
__attribute__((section(".modinfo"))) =
"depends=";
MODULE_INFO(srcversion, "B707601F40932A4E255B12B");
File added
dev/dev.o 0 → 100644
File added
kernel//home/pi/Workspace/project_6/dev/dev.ko
sudo rmmod dev.ko
sudo rm -rf /dev/uart_ioctl
make clean
make
sudo insmod dev.ko
sudo mknod -m 666 /dev/uart_ioctl c 504 100
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment