Mini6410驱动编译过程
Tiny6410_Uboot移植步骤详解
#include <config.h> #include <asm/arch/s3c6400.h>
.globl mem_ctrl_asm_init mem_ctrl_asm_init:
/* DMC1 base address 0x7e001000 */ ldr r0, =ELFIN_DMC1_BASE
#tar xzvf u-boot-gxb.tar.gz
二:在顶层的目录下找到 Makefile 文件,并用 gedit
打开
在 Makefile 中找到下面代码进行修改
########################################################################
else
\
echo
"RAM_TEXT
=
0xc7e00000"
$(obj)board/samsung/tiny6410/config.tmp;\
fi
@$(MKCONFIG) tiny6410 arm arm1176 tiny6410 samsung s3c64xx
@echo "CONFIG_NAND_U_BOOT = y" >> $(obj)include/config.mk
ldr r1, =DMC_DDR_t_RFC ldr r2, =DMC_DDR_schedule_RFC orr r1, r1, r2 str r1, [r0, #INDEX_DMC_T_RFC]
ldr r1, =DMC_DDR_t_RP ldr r2, =DMC_DDR_schedule_RP orr r1, r1, r2 str r1, [r0, #INDEX_DMC_T_RP]
tiny6410内核移植
Tiny6410 的内核移植(拿来主义)一、开发环境宿主机: vista+VMware+ fedoral13(win7下虚拟机)编译器: 友善自带arm-linux-gcc-4.5.1-v6-vfp-20101103.tgz开发板: tiny6410,核心板号1106 NAND 2G RAM 256M注意:移植内核时,确保引导文件为u-boot类型,否则到后面下载到开发板使会出现乱码以及不必要的错误二、移植nand_flash1 下载linux-2.6.38的源码ftp:///pub/linux/kernel/v2.6/linux-2.6.38.tar.bz22 解压#tar xvfj /mnt/ubuntu/linux-2.6.38.tar.bz2 -C .3 修改根下的Makefile#vi Makefile191行改为ARCH ?= armCROSS_COMPILE ?= arm-linux- (找到其交叉编译环境)4 生成默认配置文件#cp arch/arm/configs/s3c6400_defconfig .config(如果省略的话,后面会找不到System Type)5 修改配置项(基本配置)#make menuconfigGeneral setup->(/usr/4.5.1/bin/arm-linux-) Cross-compiler tool prefix 我将编译器解压到了/opt/Friendly/toolschain/4.5.1/bin目录(如果第三步中以修改“plier ? = arm-linux- ”此项,这步可以不作)System Type->[*] MINI6410 选上,其他的可以去掉,不确定的可以参考友善之臂的(这样编译出来的内核是可以被uboot引导的,然后是增加nand flash支持)vi arch/arm/mach-s3c64xx/mach-mini6410.c第117行struct mtd_partition mini6410_nand_part[] = {{.name = "Bootloader",.offset = 0,.size = (4 * 128 *SZ_1K),.mask_flags = MTD_CAP_NANDFLASH,},{.name = "Kernel",.offset = (4 * 128 *SZ_1K),.size = (5*SZ_1M) ,.mask_flags = MTD_CAP_NANDFLASH,},{.name = "File System",.offset = MTDPART_OFS_APPEND,.size = MTDPART_SIZ_FULL,}}; //update at 2011-8-26 经过测试发现,这里改完后根本不起作用,甚至将整个注释也无妨,估计分区已经固死在后面的s3c_nand_mlc.fo 中6 拷贝NAND FLASH驱动(将6410内核中的如下文件拷到相应的目录下)需拷贝文件:drivers/mtd/nand/s3c_nand.carch/arm/plat-samsung/include/plat/regs-nand.h 覆盖掉drivers/mtd/nand/s3c_nand_mlc.fo《s3c_nand_mlc.fo友善没有开源的一个驱动之一,所以不用研究了,拷过来就是了。
tiny6410烧写环境
1、准备SD卡uboot需要SD卡烧写器和uboot镜像下载地址为:SD卡烧写器:/detail/songlan0012/7297353sd卡uboot镜像:/detail/songlan0012/73033692、将串口转usb线硬件连接好,串口接到tiny6410开发板,usb口接到电脑,会检查到新usb硬件图一这个是串口转USB驱动没有安装,点击取消,下载安装文件:PL2303_Prolific_DriverInstaller_v110.zip(我使用的是这个硬件)。
usb转串口驱动下载地址:/detail/songlan0012/7303905安装完后在设备管理器其中查看如图(可能需要重新拔掉再插上usb接口)图二图中COM3就是了。
打开dnw(串口界面工具),下载地址:/detail/songlan0012/7297327初始状态如图:图三点击Serial Port 菜单中的Connect选项,状态如下图:图四如果如上图出现COM3,115200bps (COM3是设备管理器中的COM3可能是其他COM口编号)恭喜,至此tiny6410串口驱动安装成功。
2、制作sd卡uboot资源:需要一个大于等于4G的SD卡,格式化成FAT32格式工具:SD-Flasher.exe (SD卡烧写器)工具下载地址:/detail/songlan0012/7297353这个工具不需要安装,直接运行使用。
直接打开界面为下图:图五点击Image file to fuse输入框后面的按钮选择要烧写的superuboot镜像,镜像下载地址为:/detail/songlan0012/7303369然后点击Scan按钮,按钮左侧的显示区会显示sd卡信息,例如下图:图六这说明已经检测到了正确检测到了SD卡点击Fuse按钮烧写会出现如下图信息:图七这说明sd卡uboot烧写成功。
将sd卡插入tiny6410的sd卡插槽内,将选择sd卡或者nand启动的开关拨到SD卡启动,连接好usb转串口线,插上开发板电源线,打开DNW至图四状态,上电,DNW会显示如下图信息:图八恭喜您,sd卡中的Uboot已经启动了。
Linux字符设备驱动之Tiny6410 LED驱动编写
Linux字符设备驱动之Tiny6410 LED驱动分析摘要:驱动程序是应用程序和底层硬件之间的桥梁,非常重要。
字符设备是一种可以当做一个字节流来存取的设备,这样的设备只能一个字节一个字节的进行数据传输,这样的驱动常常至少实现open、close、read、和write系统条用,常见的有串口、LED、文本控制台等,字符设备通过文件系统节点来存取,例如/dev/tty1和/dev/lp0.在一个字符设备和一个普通文件之间唯一相关的不同就是,你可以在普通的文件中移来移去,但是大部分字符社诶仅仅是数据通道,只能顺序存取。
重要概念1.用户空间和内核空间一个驱动模块在内核空间运行,而应用程序则是在用户空间运行,这个概念是操作系统的理论基础。
Linux为这两种空间之间的数据传输定义了两个函数,分别为copy_to_user()和copy_from_user(),从字面意思可以知道函数的意义。
比如在编写驱动程序时,很显然驱动程序属于内核空间,会经常使用copy_from_user()函数,从应用程序中获取数据给驱动程序。
2.编译模块使用make xxxx modules 生成xxx.ko模块。
3.加载和卸载模块(驱动)驱动生成的模块需要加载到内核中,加载模块使用insmod指令,如:insmodxxx.ko卸载驱动则用rmmod命令。
4.所需头文件#include <linux/module.h> //包含大量加载模块所需的函数和符号定义#include<linux/init.h> //制定初始化和清理函数许可凭证指令:MODULE_LICENSE(“GPL”);5.初始化和关停初始化指令:static int __initinitialization_function(void){}module_init(initialization_function);初始化函数应声明为静态,因为他们不会再特定文件之外可见,毕竟static的重点应用是“隐藏”。
tiny 6410温度传感器驱动程序
#include <linux/module.h>#include <linux/fs.h>#include <linux/kernel.h>#include <linux/init.h>#include <linux/delay.h>#include <linux/cdev.h>#include <linux/device.h>#include <linux/gpio.h>#include <plat/gpio-cfg.h>#define DEVICE_NAME "temp"static struct cdev cdev;struct class *tem_class;static dev_t devno;static int major = 243;void tem_reset(void){s3c_gpio_cfgpin(S3C64XX_GPN(8), S3C_GPIO_SFN(1)); gpio_set_value(S3C64XX_GPN(8), 1);udelay(100);gpio_set_value(S3C64XX_GPN(8), 0);udelay(600);gpio_set_value(S3C64XX_GPN(8), 1);udelay(100);s3c_gpio_cfgpin(S3C64XX_GPN(8), S3C_GPIO_SFN(0)); }void tem_wbyte(unsigned char data){int i;s3c_gpio_cfgpin(S3C64XX_GPN(8), S3C_GPIO_SFN(1)); for (i = 0; i < 8; ++i){gpio_set_value(S3C64XX_GPN(8), 0);udelay(1);if (data & 0x01){gpio_set_value(S3C64XX_GPN(8), 1);}udelay(60);gpio_set_value(S3C64XX_GPN(8), 1);udelay(15);data >>= 1;}gpio_set_value(S3C64XX_GPN(8), 1);}unsigned char tem_rbyte(void){int i;unsigned char ret = 0;for (i = 0; i < 8; ++i){s3c_gpio_cfgpin(S3C64XX_GPN(8), S3C_GPIO_SFN(1));gpio_set_value(S3C64XX_GPN(8), 0);udelay(1);gpio_set_value(S3C64XX_GPN(8), 1);s3c_gpio_cfgpin(S3C64XX_GPN(8), S3C_GPIO_SFN(0));ret >>= 1;if (gpio_get_value(S3C64XX_GPN(8))){ret |= 0x80;}udelay(60);}s3c_gpio_cfgpin(S3C64XX_GPN(8), S3C_GPIO_SFN(1));return ret;}static ssize_t tem_read(struct file *filp, char *buf, size_t len, loff_t *offset) {unsigned char low, high;tem_reset();udelay(420);tem_wbyte(0xcc);tem_wbyte(0x44);mdelay(750);tem_reset();udelay(400);tem_wbyte(0xcc);tem_wbyte(0xbe);low = tem_rbyte();high = tem_rbyte();*buf = low / 16 + high * 16;*(buf + 1) = (low & 0x0f) * 10 / 16 + (high & 0x0f) * 100 / 16 % 10; return 0;}static struct file_operations tem_fops ={.owner = THIS_MODULE,.read = tem_read,};static int __init tem_init(void){int result;devno = MKDEV(major, 0);result = register_chrdev_region(devno, 1, DEVICE_NAME);if (result){printk("register failed\n");return result;}cdev_init(&cdev, &tem_fops);cdev.owner = THIS_MODULE;cdev.ops = &tem_fops;result = cdev_add(&cdev, devno, 1);if (result){printk("cdev add failed\n");goto fail1;}tem_class = class_create(THIS_MODULE, "tmp_class");if (IS_ERR(tem_class)){printk("class create failed\n");goto fail2;}device_create(tem_class, NULL, devno, DEVICE_NAME, DEVICE_NAME); return 0;fail2:cdev_del(&cdev);fail1:unregister_chrdev_region(devno, 1);return result;}static void __exit tem_exit(void){device_destroy(tem_class, devno);class_destroy(tem_class);cdev_del(&cdev);unregister_chrdev_region(devno, 1);}module_init(tem_init);module_exit(tem_exit);MODULE_LICENSE("GPL");MODULE_AUTHOR("nanjizhiyin@");//读#include "stdio.h"#include "sys/types.h"#include "sys/ioctl.h"#include "stdlib.h"#include "termios.h"#include "sys/stat.h"#include "fcntl.h"#include "sys/time.h"main(){int fd;unsigned char buf[2];if ((fd=open("/dev/temp",O_RDWR | O_NDELAY | O_NOCTTY)) < 0){printf("Open Device DS18B20 failed.\r\n");exit(1);}else{printf("Open Device DS18B20 successed.\r\n"); while(1){read(fd, buf, sizeof(buf));printf("%d.%dC\r\n", buf[0], buf[1]);sleep(1);}close(fd);}}。
Mini6410上最简单的LED点灯裸机程序
Mini6410上最简单的LED点灯裸机程序说明:该程序是适用于Mini6410开发板,是一个很小的裸机程序,基开发平台为ADS,主要功能是点亮LED并驱动串口输出,程序运行后,板上的LED将会出现“对对碰”显示效果,同时从串口0打印“Hello, Mini6410”, 目标可执行文件可以被烧写到Nand Flash的Block0运行,也可以烧写至普通的SD卡运行使用,可以称之为Bootloader的雏形,本程序由友善之臂制作提供,转载请注明出处。
下面是编译和使用步骤(基于WindowsXP);1.使用ADS打开mini6410‐led.mcp项目文件2.按F7或点编译按钮编译,将生成mini6410‐led.bin编译结果:最后生成mini6410‐led.bin3.烧写到Nand Flash运行要把mini6410‐led.bin烧写到Nand Flash,需要借助已经安装了Superboot的SD卡,步骤如下:把mini6410‐led.bin拷贝到SD卡的images目录下打开FriendlyARM.ini配文件,修改如下关键定义:Action=installOS= UserBinUserBin‐Image=mini6410‐led.bin4.下载到内存中运行借助已经安装了SuperbootSD卡,可以把把mini6410‐led.bin加载到内存中运行,步骤如下: 把mini6410‐led.bin拷贝到SD卡的images目录下,打开FriendlyARM.ini配文件,修改如下关键定义:Action=runOS= UserBinUserBin‐Image=mini6410‐led.binUserBin‐StartAddress=50000000附1:串口输出结果:附2: mini6410‐led主体程序代码:#include "utils.h"static void LedDelay(void){volatile unsigned int k;for(k = 0; k < 20000000; k++);}int main(void){Uart_Init();Port_Init();Uart_SendString("\r\nHello, Mini6410\r\n");for(;;) {Led_Display(0x9); // 1001 LedDelay();Led_Display(0x6); // 0110 LedDelay();}return 0;}。
Uboot_for_mini6410_移植步骤详解
这是u-boot-2010.09 针对友善之臂MINI6410移植的最基础版本,只包含了就基本的系统引导,NAND读写,DM9000网卡等等。
但是这个足够开发的方便使用。
今后会陆续添加原先我为mini2440添加的所有功能。
但是此次移植并非我的功劳,首先基本的移植是由Alex Ling <kasimling at >完成的,你可以在这里看到他提交的补丁,但是编译后无法使用,可能是因为host系统不同,对脚本的解析不同,使得spl部分的生成出现问题,只需修改一下nand_spl目录下目标板目录的中config.mk中的PAD_TO := $(shell expr $$[$(TEXT_BASE) + 4096])即可。
DM9000的驱动没有太大的问题(修改了一点可能出现问题的地方,感谢肖工指教),但是原本的u-boot并没有调整所有SROM控制器的配置(其中包括连接DM9000所使用的bank1的总线),我使用了友善带的u-boot的参数配置了一下就好了。
一:/batch.viewlink.php?itemid=1694ftp://ftp.denx.de/pub/u-boot/去这2个网站随便下载都可以下载得到最新或者你想要的u-boot。
现在我将下载u-boot-2010-09,这个也就是最新的版本啦。
下载后把它解压,然后得到u-boot-2010-09的文件夹,然后进去,并且做下面几件事情:1:进入arch这个文件夹,把出arm外的前部文件夹删掉2:进入board这个文件夹,把除samsung外前部文件夹删掉3:进入include/configs,把除smdk6400.h外的所有文件删除。
4: 把顶层目录下有一个叫onenand_ipl的文件夹删除掉,因为没有用到。
5:进入nand_spl/board,把除samsung外全部文件删除掉。
6:再进入arch/arm/cpu文件夹,把除arm1176外其他文件夹删除掉。
mini6410中断控制器-VIC中断控制器
#define INT_EINT0_BIT 0
#define INT_TIMER0_BIT 23
////////////////////////////////////////////////////////////////////////////
//////
extern void asm_handle_k1_irq(void);
#define GPNCON (*(volatile unsigned long *)0x7F008830) #define GPNPUD (*(volatile unsigned long *)0x7F008838) #define EINT0CON0 (*(volatile unsigned long *)0x7F008900) #define EINT0MASK (*(volatile unsigned long *)0x7F008920) #define VIC0IRQSTATUS (*(volatile unsigned long *)0x71200004 ) #define VIC0INTSELECT (*(volatile unsigned long *)0x7120000C) #define VIC1INTSELECT (*(volatile unsigned long *)0x7130000C) #define VIC0INTENABLE (*(volatile unsigned long *)0x71200010) #define VIC1INTENABLE (*(volatile unsigned long *)0x71300010) #define VIC0INTENCLEAR (*(volatile unsigned long *)0x71200014) #define VIC1INTENCLEAR (*(volatile unsigned long *)0x71300014) #define VIC0VECTADDR (*(volatile unsigned long *)0x71200100)
【转载】Mini6410启动过程
【转载】Mini6410启动过程 这段时间在尝试使⽤uBoot来替代友善的Superboot,让板⼦⽀持从SD卡启动,所以就仔细研究了⼀下友善提供的内核和它的启动参数,发现友善真的蛮聪明,把电脑的启动⽅式借鉴到它们⾃⼰的开发板上了。
现在就把6410启动的过程分享出来,可能还有不完善的地⽅,希望了解的⼈也能指出我⽂章⾥⾯的不⾜。
initramfs启动以前在X86平台上做过⼀个最⼩的U盘启动⼩系统,⽤的就是initramfs的⽅式,只是在最后阶段不要让它切换根⽬录。
对于initramfs 的启动⽅式⽹上有很多相关的⽂章,Linux内核的⽂档也有相应的介绍。
这⾥只简单说⼀下它的原理,initramfs将归档好的⽂件系统添加到img 中,在启动的时候就只需要指定少量的内核启动参数,在启动过程中的临时⽂件系统所运⾏的脚本都是此⽂件系统中的程序和脚本,当然,这个⽂件系统其实就是⼀个简单的linux系统,可以进⾏简单的操作,如果要扩展功能⼜不想把img做得很⼤,可以考虑⽤mount⽂件系统然后转换的⽅式来做。
这样就将启动过程分成两个阶段,第⼀阶段就是⽤编⼊内核的⽂件系统做初始化,然后⽤定制的⽂件系统来跑应⽤程序。
不仅减少了更新内核的负担,⽽且在更新的时候不需要更新应⽤程序的⽂件系统,⽂件系统和内核的更新可以分开来做,提⾼了效率。
init脚本Linux启动后执⾏的第⼀个程序就根⽬录下的ini,友善通过init脚本来完成启动过程。
其主要⼯作就是声明⼀些环境,加载要运⾏的⽂件系统,然后做⽂件系统的切换。
因为不像X86下那么复杂,所以设备的初始化相对⽽⾔较为简单。
启动脚本和注释如下:001 #! /bin/sh002003 #初始化环境变量004 PATH=/sbin:/bin:/usr/sbin:/usr/bin005 runlevel=S006 prevlevel=N007 umask 022008 export PATH runlevel prevlevel009010 #011 # Trap CTRL-C &c only in this shell so we can interrupt subprocesses.012 #013 trap ":" INT QUIT TSTP014 #设置主机名015 /bin/hostname FriendlyARM016 #mount proc⽂件系统017 /bin/mount -n -t proc proc /proc018019 #获取U-boot启动参数,主要设置⽂件系统内型、根⽬录、init等020 cmdline=`cat /proc/cmdline`021022 #声明初始化启动相关参数,并设置默认值023 ROOT=none024 ROOTFLAGS=025 ROOTFSTYPE=026 NFSROOT=027 IP=028 INIT=/sbin/init029030 #从获取的命令中获取启动参数031for x in $cmdline ; do032case $x in033 root=*)034 ROOT=${x#root=}035 ;;036 rootfstype=*)037 ROOTFSTYPE="-t ${x#rootfstype=}"038 ;;039 rootflags=*)040 ROOTFLAGS="-o ${x#rootflags=}"041 ;;042 init=*)043 INIT=${x#init=}044 ;;045 nfsroot=*)046 NFSROOT=${x#nfsroot=}047 ;;048 ip=*)049 IP=${x#ip=}050 ;;051052esac053done054055if [ ! -z $NFSROOT ] ; then056 #⽹络⽂件系统启动057echo $NFSROOT | sed s/:/\ /g > /dev/x ; read sip dir < /dev/x echo $IP | sed s/:/\ /g > /dev/x; read cip sip2 gip netmask hostname device autoconf < /dev/x058rm /dev/x059060mount -t nfs $NFSROOT /r -o nolock,proto=tcp061062elif [ ! -z $run_fs_image ] ; then063 #制定的⽂件系统启动,这个环境变量还不知道是如何导出的,所以还需要了解,064 #看到友善提供的配置⽂件需要制定启动的⽂件系统,感觉应该是和那个地⽅相关,065 #但是⼜不能确定,⾼⼿可以指点⼀下066 ROOTFSTYPE="-t ext3" #设置⽂件系统类型067 #重复加载SD卡,重复尝试5次068for i in12345 ; do069 /bin/mount -n -o sync -o noatime -o nodiratime -t vfat /dev/mmcblk0p1 /sdcard && break070echo Waiting for SD Card...071sleep1072done073 #加载⽂件系统074 /sbin/losetup /dev/loop0 /sdcard/$run_fs_image075 /bin/mount $ROOTFSTYPE /dev/loop0 /r076mount -o move /sdcard /r/sdcard077else078 #直接⽤指定的启动参数加载⽂件系统079 /bin/mount -n $ROOTFLAGS $ROOTFSTYPE $ROOT /r080fi081082 #检测并设置触摸屏的校正参数,可⽆083 ONE_WIRE_PROC=/proc/driver/one-wire-info084 ETC_BASE=/r/etc085 [ -d /r/system/etc ] && ETC_BASE=/r/system/etc086 [ -e $ETC_BASE/ts.detected ] && . $ETC_BASE/ts.detected087 [ -z $CHECK_1WIRE ] && CHECK_1WIRE=Y088if [ $CHECK_1WIRE = "Y" -a -e $ONE_WIRE_PROC ] ; then089if read lcd_type fw_ver tail < $ONE_WIRE_PROC ; then if [ x$lcd_type = "x0" -a x$fw_ver = "x0" ] ; then TS_DEV=/dev/touchscreen else TS_DEV=/dev/touchscreen-1wire 090mv $ETC_BASE/ts-autodetect.conf $ETC_BASE/friendlyarm-ts-input.conf -f091echo"CHECK_1WIRE=N" > $ETC_BASE/ts.detected092sync093fi094fi095fi096097 [ -e /r/etc/friendlyarm-ts-input.conf ] && . /r/etc/friendlyarm-ts-input.conf098 [ -e /r/system/etc/friendlyarm-ts-input.conf ] && . /r/system/etc/friendlyarm-ts-input.conf099 export TSLIB_TSDEVICE100101 #exec /bin/sh102103 #⽂件系统替换104umount /proc105 exec switch_root /r $INIT /r/dev/console 2>&1被“欺骗”的脚本当初以为ext3的⽂件系统就是实际启动时执⾏的操作,但是那个却是⼀个错误的认识,之所以认为那个是启动的⽂件系统,是因为内核的⼀个配置参数和此⽂件系统包含了⼀些脚本,所以在启动时⾛了不少的弯路。
Tiny-S3C6410_Linux下LED灯驱动移植过程
UT-S3C6410 ARM11 Linux 下的LED驱动一、实验环境操作系统:fedora13交叉编译环境:arm-Linux-gcc 或以上,6410板子内核源码路径在:忘了,需要厂家给的内核源代码硬件平台:S3C6410开发板(其他类型的开发板也可以注意配置GPIO)注:交叉编译环境一定要装好,一般的开发板给的配套资料中都会有,安装过程也都有详细的过程,如果没有,亲,你只有自己解决了。
也可以联系我(****************),泪奔支持你们。
二、实验原理控制LED是最简单的一件事情,就像学C语言时候写的“hello world”程序一样,是一个入门的程序。
首先来了解一下相关的硬件知识:UT-S3C6410LED原理图UT-S3C6410LED外部引脚图从上面的原理图可以得知,LED与CPU引脚的连接方法如下,高电平点亮。
LED1 -GPM0LED2 -GPM1LED3 -GPM2LED4 -GPM3从数据手册可以找到相应的控制方法。
这里我们以LED1为例,介绍一下LED1的操作方法,其他的类似,请大家自行分析。
通过上面可以得知,需要先将GPM0设置为输出方式。
将寄存器GPMCON低四位配置成0001。
然后将GPMDAT寄存器的第0位置1灯亮,置LED0灯亮,开发板上有四个LED所以要对GPMDAT的低四位进行操作,就可以实现对灯的亮灭操作了。
三、实验步骤1、编写驱动程序mini6410_leds.c#include <linux/miscdevice.h>#include <linux/delay.h>#include <asm/irq.h>//#include <mach/regs-gpio.h>#include <mach/hardware.h>#include <linux/kernel.h>#include <linux/module.h>#include <linux/init.h>#include <linux/mm.h>#include <linux/fs.h>#include <linux/types.h>#include <linux/delay.h>#include <linux/moduleparam.h>#include <linux/slab.h>#include <linux/errno.h>#include <linux/ioctl.h>#include <linux/cdev.h>#include <linux/string.h>#include <linux/list.h>#include <linux/pci.h>#include <asm/uaccess.h>#include <asm/atomic.h>#include <asm/unistd.h>#include <mach/map.h>#include <mach/regs-clock.h>#include <mach/regs-gpio.h>#include <plat/gpio-cfg.h>#include <mach/gpio-bank-e.h>#include <mach/gpio-bank-k.h>#define DEVICE_NAME "leds"static long sbc2440_leds_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) {switch(cmd) {unsigned tmp;case 0:case 1:if (arg > 4) {return -EINVAL;}tmp = readl(S3C64XX_GPKDAT);tmp &= ~(1 << (4 + arg));tmp |= ( (!cmd) << (4 + arg) );writel(tmp, S3C64XX_GPKDAT);//printk (DEVICE_NAME": %d %d\n", arg, cmd); return 0;default:return -EINVAL;}}static struct file_operations dev_fops = {.owner = THIS_MODULE,.unlocked_ioctl = sbc2440_leds_ioctl,};static struct miscdevice misc = {.minor = MISC_DYNAMIC_MINOR,.name = DEVICE_NAME,.fops = &dev_fops,};static int __init dev_init(void){int ret;{unsigned tmp;tmp = readl(S3C64XX_GPKCON);tmp = (tmp & ~(0xffffU<<16))|(0x1111U<<16); writel(tmp, S3C64XX_GPKCON);tmp = readl(S3C64XX_GPKDAT);tmp |= (0xF << 4);writel(tmp, S3C64XX_GPKDAT);}ret = misc_register(&misc);printk (DEVICE_NAME"\tinitialized\n");return ret;}static void __exit dev_exit(void){misc_deregister(&misc);}module_init(dev_init);module_exit(dev_exit);MODULE_LICENSE("GPL");MODULE_AUTHOR("FriendlyARM Inc.");(1)把Hello,Module 加入内核代码树,并编译一般编译2.6 版本的驱动模块需要把驱动代码加入内核代码树,并做相应的配置,如下步骤(注意:实际上以下步骤均已经做好,你只需要打开检查一下直接编译就可以了):Step1:编辑配置文件Kconfig,加入驱动选项,使之在make menuconfig 的时候出现打开linux-2.6.38/drivers/char/Kconfig 文件,添加如图所示:#====================cgf add===================================== config MINI6410_LEDStristate "LED Support for Mini6410 GPIO LEDs"depends on CPU_S3C6410default yhelpThis option enables support for LEDs connected to GPIO lineson Mini6410 boards.#================================================================== 保存退出,这时在linux-2.6.38 目录位置运行一下make menuconfig 就可以在DeviceDrivers Character devices 菜单中看到刚才所添加的选项了,按下空格键将会选择为<M>,此意为要把该选项编译为模块方式;再按下空格会变为<*>,意为要把该选项编译到内核中,在此我们选择<M>,如图,如果没有出现,请检查你是否已经装载了缺省的内核配置文件,(2)Makefile文件Step2:通过上一步,我们虽然可以在配置内核的时候进行选择,但实际上此时执行编译内核还是不能把mini6410_leds.c编译进去的,还需要在Makefile 中把内核配置选项和真正的源代码联系起来,打开linux-2.6.38-cgf/drivers/char/Makefile,obj-$(CONFIG_MINI6410_LEDS) += mini6410_leds.o添加并保存退出Step3:这时回到linux-2.6.38 源代码根目录位置,执行make modules,就可以生成我们所需要的内核模块文件drivers/char/mini6410_leds.ko 了,注意:执行make modules 之前,必须先执行make zImage,只需一次就可以了。
Mini6410 Android2.3编程开发指南-20110322
Mini6410 Android2.3编程开发指南2011-03-22(本手册适用于Mini6410/Tiny6410)Copyright © 2007-2010 FriendlyARMAll rights reserved.简介本手册由广州友善之臂计算机科技有限公司(简称“友善之臂”)创建和维护,并作为标准用户手册的一个补充,仅供嵌入式爱好者学习参考使用,友善之臂目前并不对本手册的内容提供任何解释和解答服务,用户可以在论坛中反馈你所遇到的问题和疑问,我们将在以后的更新中修正或者采纳您的建议,本手册主要以首页日期为版本标志。
本手册由友善之臂软件开发工程师编写制作,以Mini6410和Tiny6410作为开发平台,讲解如何建立Android开发环境,包括Android SDK和Eclipse集成开发环境的下载及安装,以及如何使用Mini6410和Tiny6410开发板作为真机调试程序,非常适合Android初学者学习和参考。
Mini6410是一款十分精致的低价高品质一体化ARM11开发板,由广州友善之臂设计、生产和发行销售。
它采用三星S3C6410作为主处理器,在设计上承袭了Mini2440“精于心,简于形”的风格,而且布局更加合理,接口更加丰富,十分适用于开发MID、汽车电子、工业控制、导航系统、媒体播放等终端设备;也可适用于高校教学、嵌入式培训、个人研究学习和DIY等。
Tiny6410是由友善之臂出品的一款以ARM11芯片(三星S3C6410)作为主处理器的嵌入式核心板,它采用高密度6层板设计,尺寸为64 x 50mm,它集成了128M DDR RAM,256M/1GB SLC Nand Flash存储器,采用5V供电,在板实现CPU必需的各种核心电压转换,还带有专业复位芯片,通过2.0mm间距的排针,引出各种常见的接口资源,以供不打算自行设计CPU 板的开发者进行快捷的二次开发使用。
【实践】tiny6410+RVDS+J_link调试裸机程序
%Install Path%\RVD\Core\1.8\734\win_32-pentium\bin\xry100.dll %Install Path%\RVARMulator\ARMulator\1.4.1\206\win_32-pentium\armiss.sdi %Install Path%\RVARMulator\ARMulator\1.4.1\206\win_32-pentium\armulate.sdi %Install Path%\RVARMulator\ARMulator\1.4.1\206\win_32-pentium\v6armiss.sdi %Install Path%\RVARMulator\v6ARMulator\1.4.1\238\win_32-pentium\v6thumb2.sdi %Install Path%\RVARMulator\v6ARMulator\1.4.1\238\win_32-pentium\v6trustzone.sdi RVDS 支持的 ARM11
如果出现下述窗口提示找不到 nkARM.dll 文件 , 请将 J_link ARM v4.10i 安装目录中 JLinkARM.dll 文件 copy 到下述提示目录 .
重新启动 AXD,J-RDI,J-Link 会一起启动.
在 AXD 中调试程序 .
ARM 程序
下述代码控制 tiny6410 开发板上四个 LED 灯闪亮. area ledtest,code,readonly
entry start ldr r0,=0x7f008800 ;设置 LED 接口为输出模式 ldr r1,=0x11112222;GPK4-GPK7 str r1,[r0] loop ldr r0,=0x7f008808 ;设置 LED 的初始状态为灭 mov r1,#0xF0 str r1,[r0] bl delay ldr r0,=0x7f008808 ;设置 LED 的初始状态为亮 mov r1,#0x00 str r1,[r0] bl delay b loop delay de mov r2,#0x0 add r2,r2,#1 cmp r2,#0xf00000 bne de mov pc,lr end
在Tiny6410上安装Android系统的详细说明文档
在Tiny6410上安装Android系统的详细说明文档2011年8月1日一.SD卡Bootloader的制造1.Bootloader的简介在这就不多说了这个是开源的的,在移植启动引导程序时,我们会用到,现在只要了解即可。
想了解详情的可以进入下面的网站:/view/1223454.htm1.1 U-boot三星公司为6410 系统提供了带有 USB下载功能的U-boot,有善之臂公司在此基础上增强和改进了它的功能,并把它完全开源出来,以供广大嵌入式爱好者学习研究使用,主要特性如下:1. 增加了下载菜单,类似 Superboot 的 USB下载菜单2. 增加了 SD卡启动配置3. 支持直接下载烧写 yaffs2 文件系统映像4. 支持烧写WindowsCE BootLoader之 Nboot5. 支持烧写WindowsCE映像的功能6. 支持烧写单文件映像文件,就是通常所说的裸机程序7. 支持返回原始shell说明:大部分声称完全开源 Bootloader 的 6410 开发板,也都是从三星提供的 U-boot稍作改动而来的,所有开源的 U-boot 目前均无法烧写到 SDHC 卡(超过 2G 的大容量 SD 卡)中使用。
1.2 Superboot除了完全开源的 U-boot,友善之臂还为企业用户设计了功能超强的Superboot,它需要被烧写入 SD 卡中使用,关于它的 USB 下载功能,如果你使用过 mini2440,那么在 mini6410开发板上,你也会得心应手,因为它们的功能菜单和命令都几乎是完全相同的,你甚至不用重新安装 USB下载驱动和 dnw下载软件。
2. SD卡Bootloader的制造Step1: 打开光盘\tools\中的 SD-Flasher.exe 烧写软件,如图请注意,此时软件中的eLayout”和“ReFormat”按钮是失效的,因为我们特意在 WindowsXP 系统中关闭了此功能。
06- Tiny6410 WindowsCE开发指南
copyright@2010更新说明:3.3.5创建SDK .................................................................................................................................... - 90 -Nand Flash启动系统,系统启动时的画面如图(请以实物为准)。
触摸屏校正缺省安装的wince系统的触摸屏校正参数一般适用于NEC 4.3”LCD屏的物理特性不同,有时可能不太准确,特别是不同尺寸的时候,这时就需要重新校正,如根据系统提示,使用五点校正法用触摸笔开始校正,校正完毕,将会跳出如下窗口,这时随便点一个位置即可返回“笔针属性”窗口,点“OK”保存退出。
如果您想保存本次校准的参数,请点“开始->屏幕旋转系统,桌面上有个小画笔的程序:Painter,你可以使用它来测试设置实时时钟并保存用户存储空间使用优盘和SD卡播放mp3测试按键测试PWM控制蜂鸣器录音测试根据提示,点“录音”按钮开始录音,这时对着板上的麦克风说话,程序开始录音,点“停止”按钮结束录音,如图:此时可以点“播放”按钮会循环播放刚才的录音。
说明:该录音程序并不保存录音结果。
的普通串口功能驱动尚不可用,要测试这三个串口,需要请使用交叉串口线连接开发板的点“设置”按钮,打开设置窗口,设置串口号为右上),点确定返回主窗口。
同时,连接好扩展板的COM2到PC一端,并在然后,在串口调试助手的主窗口点“接收”按钮(该按钮会改变为“不接收”端的串口终端输入一些字符(通过超级终端是无法看到的的字符会在开发板串口调试助手的接收区显示,如图:我们还可以使用同样的方法测试硬解码播放器点“文件”->“打开文件”找到SD卡或你自己的其他视频文件,如图选中文件,就可以观看硬解码播放的电影了。
使用注意事项:因为6410最大仅支持720x480的硬解码播放,所以在稍微有点卡,此时可以点“选项”->"缩放“->"100%"和“选项"->"此时把电视输入设置为CVBS,并与目标板之间使用黄色的视频线连接好,上的输出消失,画面转到了TV,如图。
6410网关烧录过程
1.检查(1)虚拟机时间是否与物理机一致,不一致可能会出现扯蛋的错误(2)驱动是否安装:计算机->设备管理器->更新驱动程序软件->浏览计算机以查询驱动程序软->【ZTEK-USB 2.0 TO RS232\driver\windows 7.0_x86_x64】(3)IP地址是否正确:系统管理->网络工具->以太网卡(eth0)要与159个字符中输入的IP地址一致,配置->自动以太网->IPv4设置修改(4)路径是否一致:路径:/6410/root_qtopia_qt4/bin/qt4用文本编辑器打开,在最后加上【/mnt/zdd/【文件名】–qws】2.烧录(1)SDBOOT模式启动6410Spt命令v、k分别烧录Uboot和内核【u-boot_nand-ram256】、【zImage(新版为zImage-slc)】终端【sudo –i】输入密码123,将权限提升到超级用户【gedit /etc/exports】打开exports文件,在最后输入【/6410*(rw,sync,no_root_squash)】启动nfs服务【/etc/init.d/portmap restart】【/etc/init.d/nfs-kernel-server restart】关闭防火墙【ufw disable】Spt命令s,输入159个字符console=ttySAC0空格root=/dev/nfs空格nfsroot=192.168.1.111:/6410/root_qtopia_qt4空格ip=192.168.1.70:192.168.1.111:192.168.1.111:255.255.255.0:mini6410.arm9.n et:eth0:off【此处有截图】项目Qt版本:Qt 4.7.0 在 PATH (系统)【路径:/6410/arm-qte-4.7.0/qt-everywhere-opensource-4.7.0/bin/qmake】工具链:GCCE【路径:系统文件/opt/FriendlyARM/toolschain/4.5.1/bin/arm-linux-g++】工程文件配置目录:改为存放lib-ARM.so的文件夹contorl.pro中lib-X86.so改为lib-ARM.so;serialthread.cpp "ttyUSB0"改为"ttySAC3"终端,复制文件【cp /home/zdd/桌面/【文件夹名】/contorl/b/contorl空格/6410/root_qtopia_qt4/mnt/zdd】【cp /home/zdd/桌面/【文件夹名】/contorl/b/lib-ARM.so空格/6410/root_qtopia_qt4】(2)NAND模式启动6410终端,挂载【mount -t nfs -o nolock 192.168.1.111:/6410/root_qtopia_qt4空格/mnt】【挂载后分别在终端和Spt上显示挂载目录下的文件,截图】cd /6410进入6410,【/usr/sbin/mkubimage-mlc2 root_qtopia_qt4空格【名字】.ubi】生成镜像(3)SDBOOT模式启动6410Spt命令v、k再烧一次Uboot和内核,命令u烧录镜像【名字】.ubi。
基于Mini6410的Linux驱动学习总结
基于Mini6410的Linux驱动学习总结基于Mini6410的Linux驱动学习总结基于mini6410的linux驱动学习总结(一驱动程序介绍)1、什么是驱动程序?使硬件工作的软件。
2、驱动分类1)字符设备驱动2)网络接口驱动3)块设备驱动2.1 字符设备字符设备是一种按字节来访问的设备,字符驱动则负责驱动字符设备,这样的驱动通常实现open, close,read和write 系统调用。
2.2块设备1)在大部分的Unix 系统, 块设备不能按字节处理数据,只能一次传送一个或多个长度是5 12字节( 或一个更大的2 次幂的数)的整块数据。
2)而Linux则允许块设备传送任意数目的字节。
因此, 块和字符设备的区别仅仅是驱动的与内核的接口不同。
2.3 网络接口任何网络事务都通过一个接口来进行, 一个接口通常是一个硬件设备(eth0), 但是它也可以是一个纯粹的软件设备, 比如回环接口(lo)。
一个网络接口负责发送和接收数据报文。
3、驱动程序安装1)模块方式(已知J)2)直接编译进内核直接编译进内核1)Kconfig2)Makefile例:将helloWorld编译进内核在类unix系统中,字符设备和主要有以下3点不同:1、字符设备是以字节为单位进行访问。
块设备是以块为最小单位进行访问。
块可以是512字节或一个更大的2次幂的数。
2、在linux系统中,字符设备和块设备都可以以字节为单位进行访问,区别仅仅是二者访问的接口函数不同。
3、块设备与字符设备访问的顺序不同,字符设备只能顺序访问,而块设备可以随机访问。
基于mini6410的linux驱动学习总结(三使用驱动程序)Linux用户如何使用驱动程序?Linux用户程序通过设备文件(又名:设备节点)来使用驱动程序操作字符设备和块设备下图是linux系统中应用程序、驱动、硬件之间的关系图。
设备(字符、块)文件在何处?设备文件存放在dev目录下。
背景:阅读新闻基于Mini6410的Linux驱动学习总结[日期:2012-04-28] 来源:Linux社区作者:yinjiabin [字体:大中小] 基于mini6410的linux驱动学习总结(四设计字符设备驱动程序)涉及的知识点1、设备号2、创建设备文件3、重要数据结构4、设计字符设备驱动的步骤设备号用来做什么?设备号作用:主设备号用来标识与设备文件相连的驱动程序。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Mini6410开发板Android系统驱动编译步骤(linux系统环
境)
1.准备编译工具
a)开发板自带的Android系统源码一份
(android-kernel-2.6.28-20100812.tar.gz)。
b)交叉编译工具(arm-gcc-4.4.1-20100409.tar.gz)
用命令: tar –zxvf arm-gcc-4.4.1-20100409.tar.gz -C /
将其解压到根目录。
c)驱动程序源码一份,这里已Led驱动为例,源码为mini6410_leds.c
2.配置编译环境
这里假设Android系统源码解压在/home/iotek/linux-2.6.28.6-android中
a)进入系统源码目录,将驱动源码mini6410_leds.c拷贝到系统源码目录下
的drivers/char中
b)打开drivers/char中Kconfig文件,添加如下配置
config LEDS_MINI6410
tristate “LED Support for Mini6410”
depends on CPU_S3C6410
default y
help
This option enables support for LEDS connected to GPIO lines on board.
关于以上各项的含义,见附录
c)打开drivers/char中的Makefile文件,添加如下配置
obj-$(CONFIG_LEDS_MINI6410) += mini6410_leds.o
注意:上式中CONFIG_的后半部分需与上一步中config所带部分相一
致,都是LEDS_MINI6410。
d)进入系统源码根目录,执行cp config_android_n43 .config,然后执行
make menuconfig出现配置界面,依次选择Device Drivers —> Character
devices —> LED Support for Mini6410,然后,输入m,在该选项前面的尖
括号中会出现一个大写的M,M表示将该驱动编译成模块(如果要将驱动
编译进内核,这步输入y,尖括号中出现*),最后退出,保存。
3.执行编译
a)进入系统源码根目录,执行make zImage生成系统内核,这步可能要花几
分钟。
b)在源码根目录执行make modules,在drivers/char目录下会得到,驱动模
块目标文件mini6410_leds.ko
4.用insmod动态加载驱动
a)将mini6410_leds.ko拷贝到mini6410开发板上,执行insmod
mini6410_leds.ko加载驱动,加载成功后会在/de下出现LED设备对应的
设备文件leds,lsmod和rmmod 命令用来查看和卸载动态驱动模块。
b)用chmod命令给设备文件添加访问权限,执行: chmod 777 /dev/leds。
5.附录
语法:
config symbol
options
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->
symbol就是新的菜单项,options是在这个新的菜单项下的属性和选项
其中options部分有:
1、类型定义:
每个config菜单项都要有类型定义,bool:布尔类型,tristate三态:内建、模块、移除,string:字符串,hex:十六进制,integer:整型
例如config HELLO_MODULE
bool "hello test module"
bool类型的只能选中或不选中,tristate类型的菜单项多了编译成内核模块的选项,假如选择编译成内核模块,则会在.config中生成一个CONFIG_HELLO_MODULE=m的配置,假如选择内建,就是直接编译成内核影响,就会在.config中生成一个CONFIG_HELLO_MODULE=y的配置.
2、依赖型定义depends on或requires
指此菜单的出现是否依赖于另一个定义
config HELLO_MODULE
bool "hello test module"
depends on ARCH_PXA
这个例子表明HELLO_MODULE这个菜单项只对XScale处理器有效,即只有在选择了ARCH_PXA,该菜单才可见(可配置)。
3、帮助性定义
只是增加帮助用关键字help或---help---
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->。