自己建立最简单的系统(基于ok6410的)

 

这里包括两部分:首先建立最简单的板文件+让板文件挂在文件系统+启动系统。

 

 

声明:本文是之前写的了,在飞凌论坛发表,现在拿在这里共享一下。

 

转载请标明来源:http://blog.csdn.net/l_d_d/article/details/8302527

 

一、在arch/arm/mach-s3c64xx/目录下建立ok6410.c文件
1、添加头文件:
把mach_smdk6410里的头文件复制过来;

2、添加一个串口(飞凌只是用一个串口,其他三个做扩展,所以我们定义一个):
#define UCON S3C2410_UCON_DEFAULT | S3C2410_UCON_UCLK
#define ULCON S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB
#define UFCON S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE
static struct s3c2410_uartcfg smdk6410_uartcfgs[] __initdata = {
[0] = {
  .hwport      = 0,
  .flags      = 0,
  .ucon      = UCON,
  .ulcon      = ULCON,
  .ufcon      = UFCON,
},
};

3、添加用来映射LCD寄存器的结构体:
static struct map_desc smdk6410_iodesc[] =
{
{
  /* LCD support */
  .virtual    = (unsigned long)S3C_VA_LCD,
  .pfn        = __phys_to_pfn(S3C_PA_FB),
  .length     = SZ_16K,
  .type       = MT_DEVICE,
},
};
(如果暂时没有使用,可以不写smdk6410_iodesc,这时候,也要把接下来的:
s3c64xx_init_io(smdk6410_iodesc, ARRAY_SIZE(smdk6410_iodesc));
改为:
s3c64xx_init_io(NULL,0);//但是这句话不可以省略,由于他不单单映射lcd寄存器


4、添加平台设备(暂时为空):
static struct platform_device *smdk6410_devices[] __initdata = {
};


5、实现smdk6410_map_io函数:
static void __init smdk6410_map_io(void)
{
u32 tmp;
s3c64xx_init_io(smdk6410_iodesc, ARRAY_SIZE(smdk6410_iodesc));//映射寄存器
s3c24xx_init_clocks(12000000); //初始化时钟
s3c24xx_init_uarts(smdk6410_uartcfgs, ARRAY_SIZE(smdk6410_uartcfgs)); //添加串口设备
/* set the LCD type */
tmp = __raw_readl(S3C64XX_SPCON);  //0x7F0081A0
tmp &= ~S3C64XX_SPCON_LCD_SEL_MASK;
tmp |= S3C64XX_SPCON_LCD_SEL_RGB;
__raw_writel(tmp, S3C64XX_SPCON);
/* remove the lcd bypass */
tmp = __raw_readl(S3C64XX_MODEM_MIFPCON);
tmp &= ~MIFPCON_LCD_BYPASS;
__raw_writel(tmp, S3C64XX_MODEM_MIFPCON);

}

6、实现:smdk6410_machine_init函数:
static void __init smdk6410_machine_init(void)
{
u32 cs1;

/*设置SROM BANK 1*/
cs1 = __raw_readl(S3C64XX_SROM_BW) &
      ~(S3C64XX_SROM_BW__CS_MASK << S3C64XX_SROM_BW__NCS1__SHIFT);
cs1 |= ((1 << S3C64XX_SROM_BW__DATAWIDTH__SHIFT) |
  (1 << S3C64XX_SROM_BW__WAITENABLE__SHIFT) |
  (1 << S3C64XX_SROM_BW__BYTEENABLE__SHIFT)) <<
         S3C64XX_SROM_BW__NCS1__SHIFT;
__raw_writel(cs1, S3C64XX_SROM_BW);
/* set timing for nCS1 suitable for ethernet chip */
__raw_writel((0 << S3C64XX_SROM_BCX__PMC__SHIFT) |
       (6 << S3C64XX_SROM_BCX__TACP__SHIFT) |
       (4 << S3C64XX_SROM_BCX__TCAH__SHIFT) |
       (1 << S3C64XX_SROM_BCX__TCOH__SHIFT) |
       (0xe << S3C64XX_SROM_BCX__TACC__SHIFT) |
       (4 << S3C64XX_SROM_BCX__TCOS__SHIFT) |
       (0 << S3C64XX_SROM_BCX__TACS__SHIFT), S3C64XX_SROM_BC1);
platform_add_devices(smdk6410_devices, ARRAY_SIZE(smdk6410_devices)); //添加smdk6410_devices里的平台设备
}

7、添加自己的板初始化结构体:
MACHINE_START(SMDK6410, "OK6410")
.boot_params = S3C64XX_PA_SDRAM + 0x100,
.init_irq = s3c6410_init_irq,
.map_io  = smdk6410_map_io,
.init_machine = smdk6410_machine_init,
.timer  = &s3c24xx_timer,
MACHINE_END

8、如何让内核去使用这个板文件?
修改:
arch/arm/mach-s3c64xx/Makefile:54:
在obj-$(CONFIG_MACH_SMDK6410) += mach-smdk6410.o
改为
obj-$(CONFIG_MACH_SMDK6410) += ok6410.o

这样,最简单的板文件就完成了,由于没有添加nand驱动,所以只能挂在nfs文件系统(如果先挂在其他文件系统,只需添加移植nand驱动就好了)。

 

 

 

二、现在挂载网络文件系统:

1设置,PC机上的linux系统支持nfs服务:
在/etc/export文件添加:
启动nfs服务:service nfs restart
2、uboot命令行设置:
setenv bootargs "root=/dev/nfs nfsroot=192.168.0.101:/root/rootfs/rootfs ip=192.168.0.100:192.168.0.101:192.168.0.255:255.255.255.0::eth0ff console=ttySAC0,115200"

3、内核网卡驱动移植:
确认drivers/net/下有DM9000的文件(一般都有);

修改arch/arm/mach-s3c6410/ok6410.c:
  添加头文件#incude <linux/dm9000.h>
  添加dm9000 结构体:
/* Ethernet */  
#define S3C64XX_PA_DM9000   (0x18000000)   
#define S3C64XX_SZ_DM9000   SZ_1M   
#define S3C64XX_VA_DM9000   S3C_ADDR(0x03b00300)   
  
  
static struct resource dm9000_resources[] = {  
    [0] = {  
        .start      = S3C64XX_PA_DM9000,  
        .end        = S3C64XX_PA_DM9000 + 3,  
        .flags      = IORESOURCE_MEM,  
    },  
    [1] = {  
        .start      = S3C64XX_PA_DM9000 + 4,  
        .end        = S3C64XX_PA_DM9000 + S3C64XX_SZ_DM9000 - 1,  
        .flags      = IORESOURCE_MEM,  
    },  
    [2] = {  
        .start      = IRQ_EINT(7),  
        .end        = IRQ_EINT(7),  
        .flags      = IORESOURCE_IRQ | IRQF_TRIGGER_HIGH,  
    },  
};  
  
  
static struct dm9000_plat_data dm9000_setup = {  
    .flags          = DM9000_PLATF_16BITONLY,  
    .dev_addr       = { 0x08, 0x90, 0x00, 0xa0, 0x90, 0x90 },  
};  
  
  
static struct platform_device s3c_device_dm9000 = {  
    .name           = "dm9000",  
    .id             = 0,  
    .num_resources  = ARRAY_SIZE(dm9000_resources),  
    .resource       = dm9000_resources,  
    .dev            = {  
        .platform_data = &dm9000_setup,  
    }  
};  
在smdk6410_devices添加s3c_device_dm9000:

&s3c_device_dm9000,   // dm9000 driver add by acanoe


4、配置编译内核
-> Device Drivers
          -> Network device support (NETDEVICES [=y])
                    -> Ethernet (10 or 100Mbit) (NET_ETHERNET [=y])
                                 -> DM9000 support (DM9000 [=y])   
还要使内核支持网络文件系统:
如果是全新内核,那么要先
打开第一级菜单下的Networking support -> Networking options -> TCP/IP networking -> IP: kernel level autoconfiguration。如果NFS要使用DHCP,还得选上 IP: DHCP support。这样才有NFS相关选项

File systems  --->
            Network File Systems  --->
                      <*>   NFS client support
                         Root file system on NFS
                      <*>   Secure RPC: Kerberos V mechanism

5、确保PC机上共享目录有根文件系统
6、把内核烧到开发板;

 

三、测试:

启动内核:
Starting kernel ...
Uncompressing Linux... done, booting the kernel.
.......
Machine: OK6410
......
S3C NAND Driver is using hardware ECC.
NAND device: Manufacturer ID: 0xec, Chip ID: 0xd5 (Samsung NAND 2GiB 3,3V 8-bit)
Creating 4 MTD partitions on "NAND 2GiB 3,3V 8-bit":
0x000000000000-0x000000100000 : "Bootloader"
0x000000100000-0x000000600000 : "Kernel"
0x000000600000-0x000007e00000 : "User"
0x000007e00000-0x000080000000 : "File System"
......
eth0: link down
eth0: link up, 100Mbps, full-duplex, lpa 0x45E1
IP-Config: Cannot add default route (-101).
VFS: Mounted root (nfs filesystem) on device 0:11.
Freeing init memory: 116K
etc/init.d/rcS: line 10: alsactl: not found
Please press Enter to activate this console.
#

 

 

 

你好,我是C知道,一个AI语言模型,很高兴能够回答你的问题。 以下是一个简单的C语言服务器框架的示例代码,可以用于建立一个基本的HTTP服务器: ```c #include <stdio.h> #include <stdlib.h> #include <sys/socket.h> #include <netinet/in.h> #include <string.h> #include <unistd.h> #define PORT 8080 #define BUF_SIZE 1024 int main(int argc, char const *argv[]) { int server_fd, new_socket, valread; struct sockaddr_in address; int opt = 1; int addrlen = sizeof(address); char buffer[BUF_SIZE] = {0}; char *response = "HTTP/1.1 200 OK\nContent-Type: text/plain\nContent-Length: 12\n\nHello world!"; // Creating socket file descriptor if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) { perror("socket failed"); exit(EXIT_FAILURE); } // Forcefully attaching socket to the port 8080 if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) { perror("setsockopt"); exit(EXIT_FAILURE); } address.sin_family = AF_INET; address.sin_addr.s_addr = INADDR_ANY; address.sin_port = htons( PORT ); // Forcefully attaching socket to the port 8080 if (bind(server_fd, (struct sockaddr *)&address, sizeof(address))<0) { perror("bind failed"); exit(EXIT_FAILURE); } if (listen(server_fd, 3) < 0) { perror("listen"); exit(EXIT_FAILURE); } while (1) { if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen))<0) { perror("accept"); exit(EXIT_FAILURE); } valread = read(new_socket, buffer, BUF_SIZE); printf("%s\n",buffer ); write(new_socket, response, strlen(response)); printf("Response sent\n"); close(new_socket); } return 0; } ``` 这个框架创建了一个基于TCP协议的套接字,并将其绑定到本地IP地址和端口号。然后,该服务器进入一个无限循环中,等待客户端连接请求。每当有一个客户端连接请求到来时,服务器就会接受该请求,并读取客户端发送的数据。在本例中,服务器会简单地返回一个“Hello world!”消息给客户端。最后,服务器关闭连接,等待下一个客户端连接请求。 请注意,这只是一个非常简单的服务器框架示例,需要根据具体需求进行更改和扩展。此外,安全性也是一个重要的问题,需要在代码中实现相应的安全性措施来防止潜在的攻击。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值