2440 usb过程
tq2440开发板使用手册
TQ2440开发板使用手册包含以下内容:一、硬件概述1. 开发板简介:TQ2440是一款基于Samsung S3C2440A处理器的ARM9开发板,配备了丰富的外围接口和扩展资源,适用于嵌入式系统学习和开发。
2. 硬件资源:TQ2440开发板提供了多种硬件资源,包括存储器、GPIO、UART、I2C、SPI、ADC、PWM、SD卡接口等。
3. 开发板结构:介绍了开发板的布局、主要芯片和接口的位置及功能。
二、开发环境搭建1. 开发工具:介绍了用于TQ2440开发板的开发工具,如交叉编译器、调试器等。
2. 开发环境配置:详细说明了如何配置开发环境,包括安装交叉编译器、设置环境变量等。
3. 编译和烧写程序:介绍了如何编译和烧写程序到TQ2440开发板上。
三、基础实验1. LED实验:通过控制GPIO口实现LED灯的亮灭。
2. UART实验:通过UART接口实现串口通信,可以与其他设备或电脑进行数据传输。
3. ADC实验:通过ADC接口采集模拟信号,并将其转换为数字信号进行处理。
4. PWM实验:通过PWM接口生成脉冲宽度调制信号,可用于电机控制等应用。
5. I2C实验:通过I2C接口实现与I2C设备的通信,如EEPROM、温度传感器等。
6. SPI实验:通过SPI接口实现与SPI设备的通信,如SD卡、FLASH等。
7. 中断实验:介绍了如何使用中断服务程序处理外部事件或定时任务。
8. SDRAM实验:通过操作SDRAM实现大容量数据的存储和访问。
9. FLASH实验:通过操作FLASH实现程序的固化和数据的非易失性存储。
四、高级应用1. Linux系统移植:介绍了如何在TQ2440开发板上移植Linux 操作系统。
2. 文件系统操作:介绍了如何在TQ2440开发板上实现文件系统的挂载和操作。
3. 网络通信:介绍了如何在TQ2440开发板上实现网络通信功能,包括以太网和WIFI等。
4. USB设备驱动:介绍了如何在TQ2440开发板上实现USB设备的驱动和应用。
SPI驱动程序(S3C2440)
2410_SPI接口与linux驱动以下先从下到上的进行分析:driver/spi下有两个底层相关的spi驱动程序:spi_s3c24xx.c和spi_s3c24xx_gpio.c其中spi_s3c24xx.c是基于s3c24xx下相应的spi接口的驱动程序,spi_s3c24xx_gpio.c允许用户指定3个gpio口接口,模拟标准的spi总线。
s3c2410自带了两个spi接口(spi0和spi1),在此我只研究基于s3c2410下spi接口的驱动程序spi_s3c24xx.c。
首先从spi驱动的检测函数进行分析:static int s3c24xx_spi_probe(struct platform_device *pdev){struct s3c24xx_spi *hw;struct spi_master *master;struct spi_board_info *bi;struct resource *res;int err = 0;int i;master = spi_alloc_master(&pdev->dev, sizeof(struct s3c24xx_spi)); if (master == NULL) {dev_err(&pdev->dev, "No memory for spi_master\n");err = -ENOMEM;goto err_nomem;}hw = spi_master_get_devdata(master);memset(hw, 0, sizeof(struct s3c24xx_spi));hw->master = spi_master_get(master);hw->pdata = pdev->dev.platform_data;hw->dev = &pdev->dev;if (hw->pdata == NULL) {dev_err(&pdev->dev, "No platform data supplied\n");err = -ENOENT;goto err_no_pdata;}platform_set_drvdata(pdev, hw);//dev_set_drvdata(&pdev->dev, hw) init_completion(&hw->done);hw->bitbang.master = hw->master;hw->bitbang.setup_transfer = s3c24xx_spi_setupxfer;hw->bitbang.chipselect = s3c24xx_spi_chipsel;hw->bitbang.txrx_bufs = s3c24xx_spi_txrx;hw->bitbang.master->setup = s3c24xx_spi_setup;dev_dbg(hw->dev, "bitbang at %p\n", &hw->bitbang);res = platform_get_resource(pdev, IORESOURCE_MEM, 0);if (res == NULL) {dev_err(&pdev->dev, "Cannot get IORESOURCE_MEM\n");err = -ENOENT;goto err_no_iores;}hw->ioarea = request_mem_region(res->start, (res->end - res->start)+1, pdev->name);if (hw->ioarea == NULL) {dev_err(&pdev->dev, "Cannot reserve region\n");err = -ENXIO;goto err_no_iores;}hw->regs = ioremap(res->start, (res->end - res->start)+1);if (hw->regs == NULL) {dev_err(&pdev->dev, "Cannot map IO\n");err = -ENXIO;goto err_no_iomap;}hw->irq = platform_get_irq(pdev, 0);if (hw->irq < 0) {dev_err(&pdev->dev, "No IRQ specified\n");err = -ENOENT;goto err_no_irq;}err = request_irq(hw->irq, s3c24xx_spi_irq, 0, pdev->name, hw);if (err) {dev_err(&pdev->dev, "Cannot claim IRQ\n");goto err_no_irq;}hw->clk = clk_get(&pdev->dev, "spi");if (IS_ERR(hw->clk)) {dev_err(&pdev->dev, "No clock for device\n");err = PTR_ERR(hw->clk);goto err_no_clk;}clk_enable(hw->clk);writeb(0xff, hw->regs + S3C2410_SPPRE);writeb(SPPIN_DEFAULT, hw->regs + S3C2410_SPPIN);writeb(SPCON_DEFAULT, hw->regs + S3C2410_SPCON);s3c2410_gpio_setpin(S3C2410_GPE13, 0);s3c2410_gpio_setpin(S3C2410_GPE12, 0);s3c2410_gpio_cfgpin(S3C2410_GPE13, S3C2410_GPE13_SPICLK0); s3c2410_gpio_cfgpin(S3C2410_GPE12, S3C2410_GPE12_SPIMOSI0); s3c2410_gpio_cfgpin(S3C2410_GPE11, S3C2410_GPE11_SPIMISO0);if (!hw->pdata->set_cs) {s3c2410_gpio_setpin(hw->pdata->pin_cs, 1);s3c2410_gpio_cfgpin(hw->pdata->pin_cs, S3C2410_GPIO_OUTPUT); }err = spi_bitbang_start(&hw->bitbang);if (err) {dev_err(&pdev->dev, "Failed to register SPI master\n");goto err_register;}dev_dbg(hw->dev, "shutdown=%d\n", hw->bitbang.shutdown);bi = &hw->pdata->board_info[0];for (i = 0; i < hw->pdata->board_size; i++, bi++) {dev_info(hw->dev, "registering %s\n", bi->modalias);bi->controller_data = hw;spi_new_device(master, bi);}return 0;err_register:clk_disable(hw->clk);clk_put(hw->clk);err_no_clk:free_irq(hw->irq, hw);err_no_irq:iounmap(hw->regs);err_no_iomap:release_resource(hw->ioarea);kfree(hw->ioarea);err_no_iores:err_no_pdata:spi_master_put(hw->master);;err_nomem:return err;}struct spi_master * __init_or_modulespi_alloc_master(struct device *dev, unsigned size) {struct spi_master *master;if (!dev)return NULL;master = kzalloc(size + sizeof *master, SLAB_KERNEL); if (!master)return NULL;class_device_initialize(&master->cdev);master->cdev.class = &spi_master_class;master->cdev.dev = get_device(dev);spi_master_set_devdata(master, &master[1]);return master;}int spi_bitbang_start(struct spi_bitbang *bitbang){int status;if (!bitbang->master || !bitbang->chipselect)return -EINVAL;INIT_WORK(&bitbang->work, bitbang_work, bitbang);spin_lock_init(&bitbang->lock);spi_new_device INIT_LIST_HEAD(&bitbang->queue);if (!bitbang->master->transfer)bitbang->master->transfer = spi_bitbang_transfer;//spi数据的传输就是通过调用这个方法来实现的if (!bitbang->txrx_bufs) {bitbang->use_dma = 0;bitbang->txrx_bufs = spi_bitbang_bufs;if (!bitbang->master->setup) {if (!bitbang->setup_transfer)bitbang->setup_transfer =spi_bitbang_setup_transfer;bitbang->master->setup = spi_bitbang_setup;bitbang->master->cleanup = spi_bitbang_cleanup;}} else if (!bitbang->master->setup)return -EINVAL;bitbang->busy = 0;bitbang->workqueue = create_singlethread_workqueue(bitbang->master->cdev.dev->bus_id);if (bitbang->workqueue == NULL) {status = -EBUSY;goto err1;}status = spi_register_master(bitbang->master);if (status < 0)goto err2;return status;err2:destroy_workqueue(bitbang->workqueue);err1:return status;}int __init_or_modulespi_register_master(struct spi_master *master){static atomic_t dyn_bus_id = ATOMIC_INIT((1<<16) - 1);struct device *dev = master->cdev.dev;int status = -ENODEV;int dynamic = 0;if (!dev)return -ENODEV;if (master->bus_num < 0) {master->bus_num = atomic_dec_return(&dyn_bus_id); dynamic = 1;}snprintf(master->cdev.class_id, sizeof master->cdev.class_id, "spi%u", master->bus_num);status = class_device_add(&master->cdev);//注册设备if (status < 0)goto done;dev_dbg(dev, "registered master %s%s\n", master->cdev.class_id, dynamic ? " (dynamic)" : "");scan_boardinfo(master);status = 0;done:return status;}static void __init_or_modulescan_boardinfo(struct spi_master *master){struct boardinfo *bi;struct device *dev = master->cdev.dev;down(&board_lock);list_for_each_entry(bi, &board_list, list) {struct spi_board_info *chip = bi->board_info;unsigned n;for (n = bi->n_board_info; n > 0; n--, chip++) {if (chip->bus_num != master->bus_num)continue;if (chip->chip_select >= master->num_chipselect&& master->num_chipselect) {dev_dbg(dev, "cs%d > max %d\n",chip->chip_select,master->num_chipselect);continue;}(void) spi_new_device(master, chip);}}up(&board_lock);}int __initspi_register_board_info(struct spi_board_info const *info, unsigned n)struct boardinfo *bi;bi = kmalloc(sizeof(*bi) + n * sizeof *info, GFP_KERNEL);if (!bi)return -ENOMEM;bi->n_board_info = n;memcpy(bi->board_info, info, n * sizeof *info);down(&board_lock);list_add_tail(&bi->list, &board_list);up(&board_lock);return 0;}struct spi_device *__init_or_modulespi_new_device(struct spi_master *master, struct spi_board_info *chip){struct spi_device *proxy;//这个结构很重要,以后就是通过这个结构来操作实际的spi设备的struct device *dev = master->cdev.dev;int status;if (!spi_master_get(master))return NULL;proxy = kzalloc(sizeof *proxy, GFP_KERNEL);if (!proxy) {dev_err(dev, "can't alloc dev for cs%d\n",chip->chip_select);goto fail;}proxy->master = master;proxy->chip_select = chip->chip_select;proxy->max_speed_hz = chip->max_speed_hz;proxy->mode = chip->mode;proxy->irq = chip->irq;proxy->modalias = chip->modalias;snprintf(proxy->dev.bus_id, sizeof proxy->dev.bus_id,"%s.%u", master->cdev.class_id,chip->chip_select);proxy->dev.parent = dev;proxy->dev.bus = &spi_bus_type;proxy->dev.platform_data = (void *) chip->platform_data; proxy->controller_data = chip->controller_data;proxy->controller_state = NULL;proxy->dev.release = spidev_release;status = master->setup(proxy);if (status < 0) {dev_dbg(dev, "can't %s %s, status %d\n","setup", proxy->dev.bus_id, status);goto fail;}status = device_register(&proxy->dev);//真正注册原始设备if (status < 0) {dev_dbg(dev, "can't %s %s, status %d\n","add", proxy->dev.bus_id, status);goto fail;}dev_dbg(dev, "registered child %s\n", proxy->dev.bus_id); return proxy;fail:spi_master_put(master);kfree(proxy);return NULL;}static int s3c24xx_spi_setup(struct spi_device *spi){int ret;if (!spi->bits_per_word)spi->bits_per_word = 8;if ((spi->mode & SPI_LSB_FIRST) != 0)return -EINVAL;ret = s3c24xx_spi_setupxfer(spi, NULL);if (ret < 0) {dev_err(&spi->dev, "setupxfer returned %d\n", ret);return ret;}dev_dbg(&spi->dev, "%s: mode %d, %u bpw, %d hz\n",__FUNCTION__, spi->mode, spi->bits_per_word,spi->max_speed_hz);return 0;}static int s3c24xx_spi_setupxfer(struct spi_device *spi,struct spi_transfer *t){struct s3c24xx_spi *hw = to_hw(spi);unsigned int bpw;unsigned int hz;unsigned int div;bpw = t ? t->bits_per_word : spi->bits_per_word;hz = t ? t->speed_hz : spi->max_speed_hz;if (bpw != 8) {dev_err(&spi->dev, "invalid bits-per-word (%d)\n", bpw);return -EINVAL;}div = clk_get_rate(hw->clk) / hz;div = (div / 2) - 1;//求出预分频值if (div < 0)div = 1;if (div > 255)div = 255;dev_dbg(&spi->dev, "setting pre-scaler to %d (hz %d)\n", div, hz);writeb(div, hw->regs + S3C2410_SPPRE);//设置预分频值spin_lock(&hw->bitbang.lock);if (!hw->bitbang.busy) {hw->bitbang.chipselect(spi, BITBANG_CS_INACTIVE);//修改时钟,先禁用spi}spin_unlock(&hw->bitbang.lock);return 0;}static void s3c24xx_spi_chipsel(struct spi_device *spi, int value){struct s3c24xx_spi *hw = to_hw(spi);unsigned int cspol = spi->mode & SPI_CS_HIGH ? 1 : 0;unsigned int spcon;switch (value) {case BITBANG_CS_INACTIVE:if (hw->pdata->set_cs)hw->pdata->set_cs(hw->pdata, value, cspol);elses3c2410_gpio_setpin(hw->pdata->pin_cs, cspol ^ 1);break;case BITBANG_CS_ACTIVE:spcon = readb(hw->regs + S3C2410_SPCON);if (spi->mode & SPI_CPHA)spcon |= S3C2410_SPCON_CPHA_FMTB;elsespcon &= ~S3C2410_SPCON_CPHA_FMTB;if (spi->mode & SPI_CPOL)spcon |= S3C2410_SPCON_CPOL_HIGH;elsespcon &= ~S3C2410_SPCON_CPOL_HIGH;spcon |= S3C2410_SPCON_ENSCK;writeb(spcon, hw->regs + S3C2410_SPCON);if (hw->pdata->set_cs)hw->pdata->set_cs(hw->pdata, value, cspol);elses3c2410_gpio_setpin(hw->pdata->pin_cs, cspol);break;}}好了,至此spi主控制器(驱动)和板上spi设备注册完毕,以后要使用spi来传输数据的话,只要先获得spi设备交道了(就好像你要操作一个文件,先要获取文件句柄一样,明白吧^_^)原文地址/luofuchong/archive/2007/09/24/33942.html~~~~~~~~~~~~~~~~~~``任何SPI都有4种模式2008-11-06 22:17void McBSPObj::McBSP0Init(void)//McBSP从设备SPI硬件配置{//PCR设置过程(FSM=0,CLKM=0)McBSP0->SPSA = PCR;McBSP1->SPSD = (0 << PCR_XIOEN) //发送非通用I/O模式位| (0 << PCR_RIOEN) //接收非通用I/O模式位| (0 << PCR_FSXM) //外部发送帧同步脉冲(外部片选)| (0 << PCR_FSRM) //外部接收帧同步脉冲(外部片选)| (0 << PCR_CLKXM) //外部发送时钟(外部时钟源)| (0 << PCR_CLKRM) //外部接收时钟(外部时钟源)#if SPIMODE == 0//SPI设置过程00(0--FS高电平有效,0--CLK上升沿收发数据)| (0 << PCR_FSXP) //发送帧同步脉冲极性(高电平有效)| (0 << PCR_FSRP) //接收帧同步脉冲极性(高电平有效)| (0 << PCR_CLKXP) //发送时钟极性(上升沿发送数据)| (0 << PCR_CLKRP);//接收时钟极性(上升沿接收数据)#endif#if SPIMODE == 1//SPI设置过程01(0--FS高电平有效,1--CLK下降沿收发数据)| (0 << PCR_FSXP) //发送帧同步脉冲极性(高电平有效)| (0 << PCR_FSRP) //接收帧同步脉冲极性(高电平有效)| (1 << PCR_CLKXP) //发送时钟极性(下降沿发送数据)| (1 << PCR_CLKRP);//接收时钟极性(下降沿接收数据)#endif#if SPIMODE == 2//SPI设置过程10(1--FS低电平有效,0--CLK上升沿收发数据)| (1 << PCR_FSXP) //发送帧同步脉冲极性(低电平有效)| (1 << PCR_FSRP) //接收帧同步脉冲极性(低电平有效)| (0 << PCR_CLKXP) //发送时钟极性(上升沿发送数据)| (0 << PCR_CLKRP);//接收时钟极性(上升沿接收数据)#endif#if SPIMODE == 3//SPI设置过程11(1--FS低电平有效,1--CLK下降沿收发数据)| (1 << PCR_FSXP) //发送帧同步脉冲极性(低电平有效)| (1 << PCR_FSRP) //接收帧同步脉冲极性(低电平有效)| (1 << PCR_CLKXP) //发送时钟极性(下降沿发送数据)| (1 << PCR_CLKRP);//接收时钟极性(下降沿接收数据)#endif//MCR1设置过程(RMCM=0)McBSP0->SPSA = MCR1;//McBSP0->SPSD = (0 << MCR1_RMCM) //允许接收多通道选择(0)| (0x00 << MCR1_RPBBLK)| (0x00 << MCR1_RPABLK)| (0x00 << MCR1_RCBLK);//MCR2设置过程(XMCM=0)McBSP0->SPSA = MCR2;//McBSP0->SPSD = (0x00 << MCR2_XMCM) //允许发送多通道选择(00b) | (0x00 << MCR2_XPBBLK)| (0x00 << MCR2_XPABLK)| (0x00 << MCR2_XCBLK);//RCERA设置过程McBSP0->SPSA = RCERA;//McBSP0->SPSD = 0;//RCERB设置过程McBSP0->SPSA = RCERB;//McBSP0->SPSD = 0;//XCERA设置过程McBSP0->SPSA = XCERA;//McBSP0->SPSD = 0;//XCERB设置过程McBSP0->SPSA = XCERB;//McBSP0->SPSD = 0;//XCR1设置过程McBSP0->SPSA = XCR1;//McBSP0->SPSD = (0x00 << XCR1_XFRLEN1) //每帧1个字(每帧中断的次数1!!!) // | (0x02 << XCR1_XWDLEN1);//每字16位长(每次中断的字节数2!!!)| (0x00 << XCR1_XWDLEN1);//每字8位长(每次中断的字节数2!!!)//XCR2设置过程McBSP0->SPSA = XCR2;McBSP0->SPSD = (0 << XCR2_XPHASE) //单相帧(其他设置都为0)| (0x00 << XCR2_XCOMPAND)//发送数据从最高位(MSB)开始| (0x00 << XCR2_XDATDLY);//同步后延迟0位数据//RCR1设置过程McBSP0->SPSA = RCR1;McBSP0->SPSD = (0x00 << RCR1_RFRLEN1) //每帧1个字(每帧中断的次数1!!!) // | (0x02 << RCR1_RWDLEN1);//每字16位长(每次中断的字节数2!!!)| (0x00 << RCR1_RWDLEN1);//每字8位长(每次中断的字节数2!!!)//RCR2设置过程McBSP0->SPSA = RCR2;McBSP0->SPSD = (0 << RCR2_RPHASE) //单相帧(其他设置都为0)| (0x00 << RCR2_RCOMPAND)//接收数据从最高位(MSB)开始| (0x00 << RCR2_RDATDLY);//同步后延迟0位数据//SRGR1设置过程McBSP0->SPSA = SRGR1;McBSP0->SPSD = (0x00 << SRGR1_CLKGDV);//1//SRGR2设置过程McBSP0->SPSA = SRGR2;McBSP0->SPSD = (0 << SRGR2_FSGM)| (1 << SRGR2_CLKSM)//由CPU时钟产生的采样率时钟1| (0 << SRGR2_CLKSP)//0| (1 << SRGR2_GSYNC)//| (0x0f << SRGR2_FPER);//0x0f//SPCR1设置过程(CLKSTP=1Xb,RINTM=00b)McBSP0->SPSA = SPCR1;McBSP0->SPSD = (0x00 << SPCR1_RINTM) //接收中断模式00(每帧接收1次中? | (0 << SPCR1_DLB) //禁止回送| (1 << SPCR1_DXENA) //DX使能| (0x00 << SPCR1_RJUST) //接收符号不扩展| (0x02 << SPCR1_CLKSTP);//SPI模式时钟开始于上升沿(无延迟)//SPCR2设置过程(XINTM=02b)McBSP0->SPSA = SPCR2;McBSP0->SPSD = (0x02 << SPCR2_XINTM)//发送中断模式02| (1 << SPCR2_XEMPTY) //发送移位寄存器空| (1 << SPCR2_XRDY); //发送准备好//SPCR1复位过程McBSP0->SPSA = SPCR1;McBSP0->SPSD|= (1 << SPCR1_RRST);//接收器复位//SPCR2复位过程McBSP0->SPSA = SPCR2;McBSP0->SPSD|= (1 << SPCR2_XRST)//发送器复位| (1 << SPCR2_GRST)//采样率发生器复位| (1 << SPCR2_FRST);//帧同步发生器复位//清除允许BXINT0中断过程// SREG->IFR = (1 << IFR_BXINT0);//清除BXINT0中断标志// SREG->IMR |= (1 << IMR_BXINT0);//允许BXINT0中断//清除允许BRINT0中断过程SREG->IFR = (1 << IFR_BRINT0);//清除BRINT0中断标志SREG->IMR |= (1 << IMR_BRINT0);//允许BRINT0中断}void McBSPObj::McBSP1Init(void)//GPIO配置{McBSP1->SPSA = SPCR1;McBSP1->SPSD = 0;McBSP1->SPSA = SPCR2;McBSP1->SPSD = 0;McBSP1->SPSA = PCR;//设置收发。
使用JLink间接烧写S3C2410、S3C2440开发板Nor、Nand Flash的方法
nand write.jffs2 30000000 0 30000 // 把前面下载到 0x30000000 的程序烧写到 Nand 去
注意,上面用的 2ffff、30000 等数字是 192K,如果你的程序比较小,请自行设置。
本贴被 juedi 编辑过,最后修改时间:2009-03-04,14:30:34.
3. 下载特制的 uboot: h loadbin e:\u-boot.bin 0x33f80000 setpc 0x33f80000 g 上述操作命令可以参考图 5。
(原文件名:使用 jlink 下载运行 uboot.JPG) 现在,u-boot 已经启动了,在串口工具上可以看到如图 6 所示界面,以后就可以通过网络、串口下载文件,然后使用 u-boot 里 的命令进行烧写。
1. speed 12000
//设置 TCK 为 12M,下载程序时会很快
2. 下载并运行 init.bin,这是用来初始化 SDRAM 的 2.1 如果是 NAND 启动: loadbin e:\init.bin 0 setpc 0 g 2.2 如果是 Nor 启动: loadbin e:\init.bin 0x40000000 setpc 0x40000000 g
编辑 删除 编辑 删除
积分:287 派别: 等级:-----来自:广东佛山
__________________________ suffering from C library
2009-03-04,14:38: 19
资料 邮件
编辑 删除
【3 楼】 yangsen 积分:1199 派别: 等级:-----来自:
顶一个,好东东
2009-03-04,14:49: 02
ARM9 GT2440
GT2440 简要评测昨天笔者收到了由GT 工作室寄来的arm9开发板样品,型号为GT2440。
此款配置为S3C2440 400MHz主控器,2MB Norflash,64MB Nand flash和64MB SDRAM。
由于笔者是电子爱好者,喜欢自己动手做些东西,因此用过不少开发板。
现在就让我们看看这款名为GT2440的arm9开发板有什么特别之处。
一外观篇先来看看包装盒,这是专门为这款型号设计的打开包装,里面的开发套件及配件取出开发套件。
此开发套件自带一个3.5寸的触摸液晶屏,并配有白色透明液晶面板,颇有时尚感。
再来看一下附件,USB线,串口线,网线,电源,JTAG板,光盘及触摸笔。
由图片中可以看到,GT2440所带的数据线均为一性压铸而成的,保证了质量。
同时USB也采用了2.0的高速数据线。
在竞争日益激烈的市场环境下,不少开发板厂商都在配件上压缩成本,从此款开发套件所带的附件,可以看出该厂商一贯宣称的品质路线。
二软件篇看完了硬件,再看一下软件。
此开发套件支持linux和wince5.0操作系统,与市面上其他的开发板类似,在此就不多加介绍,以下为运行画面。
在拿到开发板之前,笔者就听厂商介绍此款开发套件有区别与其他开发套件的独门绝技,下面就让我们来看一看到底有何独特之处?从宣传资料上了解到,厂商为这款开发套件开发了一个特有的SPS游戏系统。
根据手册上的操作,笔者为这款开发板装上了该游戏系统。
在烧写过程中,笔者留意到这样一个小细节。
用过arm9开发板的人都知道,开发板一般带有Nor flash和Nand flash,通过跳线在二者之间切换启动,此款开发板也不例外,值得注意的是,此款开发板已经用导线将开发板上的跳线引至液晶驱动板底面的微型拨动开关,这样,不用拆下液晶就能在二者之间切换。
这样的人性化设计还是值得肯定的。
开机画面系统启动后,画面提示插入游戏卡。
根据说明手册,将光盘中的游戏目录拷贝至SD卡,插入开发板上的SD卡插。
用JLink(V8) + AXD烧写FL2440开发板的BootLoader并利用USB线下载WinCE和Linux(V1.0)
在打开的 AXD 界面中,点 OptionConfigure Target… 后,在出现的对话框 中 选 JLinkRDI.dll 。 初次点 OptionConfigure Target…时没有此项,点 Add,在 JLink 安装目录下找到 JLinkRDI.dll ,如“C:\Program Files\SEGGER\JLinkARM_V408l\JLinkRDI.dll” 注意下图中的蓝色框所示,表示 JLink 尚未找到开发板的 MPU。
-7-
找到 2440init.s 文件并打开后,如下图。按 F5 或在菜单栏中点 ExecuteGo,运行之。
运行 2440init.s 几秒钟后,按 Shift + 2440init.s 运行。 此时,这个 2440init.s 关闭与否都没关系。
F5 或在菜单栏中点 ExecuteStop,停止
-2-
图中红色小板是三口转接板。 注意: 记得要在上图红框所示 USB 插口 (在开发板电源插孔旁边) 与笔记本电脑之间连 USB 线。 但不必在烧写 BootLoader 时就连上。 二、基本过程 1、先利用 JLink 将 BootLoader 烧写到开发板上。 2、 BootLoader 烧写成功后, 开发板断电, 并将 JLink 与开发板的连接断开。 这点很重要。 不熟悉的人或初学者常常在这一步发生问题。 3、开发板重启,将 USB 线与开发板连接。 4、先下载 WinCE6.0 操作系统——开发板使用手册等资料上说,下载 WinCE6.0 之前, 要先将 Linux 的文件系统擦除!一定要记得这个提示。否则先下载了 Linux 操作系统之后,再 下载 WinCE6.0 操作系统时,就会出问题,而且还不知道为什么! ! ! 注意: 这里“操作系统”是指 Linux = 内核 + 文件系统; 或 WinCE6.0 = 内核 + EBoot 本人没有试过只下载了 Linux 内核而没有下载其文件系统时, 下载 WinCE6.0 操作系统的 后果。上面的提示没包括 Linux 内核在内,那么这样做应该没问题吧。 5、然后下载 Linux 操作系统。 注意:随板光盘上有 2.6.12 和 2.6.28 两个内核,区别只在于触摸屏驱动不同。在开发板 光盘上的文件夹 Linux2.6.12 和文件夹 Linux2.6.28 里有说明。 而且在文件夹 Linux2.6.12 中有 zImage1 和 zImage2 两个内核映像文件,分别适用于 不同尺寸的触摸屏。 本人开发板是 3.5 寸的触摸屏。 所以选用文件夹 Linux2.6.12 中 zImage1 和 qte_touch.yaffs 来下载。这样可以保证下载成功后,初次启动 Linux 时,在 QTopia 下对 触摸屏校准一次性通过。
S3C2440外部中断操作
1
20100831
编写:小龍
吧把 INTPND 中相应位置 1,所以同一时间只有一位是 1。也就是说前面的寄存 器置 1 是表示发生了,只有 INTPND 置 1,CPU 才会处理。 INTOFFSET :用来表示 INTPND 中哪一位置 1 了,好让你查询,普 通中断跳转时查询用。清除 INTPND、SRCPND 时自动清除。 4.各寄存器关系:
5
20100831 case 0x2000: if(rGPBDAT & 0x80) LED3_ON(); else LED3_OFF(); break; case 0x4000: if(rGPBDAT & 0x100) LED4_ON(); else LED4_OFF(); break; case 0x8000: LED_ON(); break; case 0x80000: LED_OFF(); break;
下面看图说明: 5.中断过程。 a 如果是不带子中断的内部中断:发生后 SRCPND 相应位置 1,如果没有被 INTMSK 屏蔽,那么等待进一步处理。 b 如果是带子中断的内部中断:发生后 SUBSRCPND 相应位置 1,如果没有被 INTSUBMSK 屏蔽,那么 SRCPND 相应位置 1,等待进一步处理,几个 SUBSRCPND 可能对应同一个 SRCPND,对应表如下: SRCPND SUBSRCPND INT_UART0 INT_RXD0,INT_TXD0,INT_ERR0 INT_UART1 INT_RXD1,INT_TXD1,INT_ERR1 INT_UART2 INT_RXD2,INT_TXD2,INT_ERR2 INT_ADC INT_ADC_S, INT_TC INT_CAM INT_CAM_C, INT_CAM_P INT_WDT_AC97 INT_WDT, INT_AC97
2440超详细U-BOOT(UBoot介绍+H-jtag使用+Uboot使用)
凌FL2440超详细U-BOOT作业(UBoot介绍+H-jtag使用+Uboot使用)Bootloader是高端嵌入式系统开发不可或缺的部分。
它是在操作系统内核启动之前运行的一段小程序。
通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。
现在主流的bootloader有U-BOOT、vivi、Eboot等。
本次作业先做Uboot的烧写吧。
希望通过这个帖子,能让更多的初学者朋友了解一些UBoot的知识,也希望高手朋友对我的不足予以斧正。
首先说一下什么是Uboot:U-Boot,全称Universal Boot Loader,是遵循GPL条款的开放源码项目。
从FAD SROM、8xxROM、PPCBOOT逐步发展演化而来。
其源码目录、编译形式与Linux内核很相似,事实上,不少U-Boot源码就是相应的Linux内核源程序的简化,尤其是一些设备的驱动程序,这从U-Boot源码的注释中能体现这一点。
但是U-Boot不仅仅支持嵌入式Linu x系统的引导,当前,它还支持NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS嵌入式操作系统。
其目前要支持的目标操作系统是OpenBSD, NetBSD, FreeBSD,4.4BSD, Linux, SVR4, Esix, Solaris, Irix, SCO, Dell, NCR, VxWorks, LynxOS, pSOS, QNX, RTEMS, ARTOS。
这是U-Boot中Universal的一层含义,另外一层含义则是U-Boot除了支持PowerPC系列的处理器外,还能支持MIPS、x86、ARM、NIOS、XScale等诸多常用系列的处理器。
这两个特点正是U-Boot项目的开发目标,即支持尽可能多的嵌入式处理器和嵌入式操作系统。
T1_MINI2440开发板的使用入门资料
T1_MINI2440开发板的使用入门资料T1_MINI2440开发板是一款嵌入式开发板,基于三星ARM9微处理器S3C2440A,适用于学习嵌入式系统开发、嵌入式Linux开发和嵌入式应用开发等领域。
本文将介绍T1_MINI2440开发板的使用入门资料,让你快速上手。
T1_MINI2440开发板主要包括核心模块和扩展模块两部分。
核心模块包括三星ARM9微处理器S3C2440A、SDRAM、NAND Flash等主要芯片组成,扩展模块包括串口、以太网口、USB接口等扩展接口。
开发板还配备了丰富的外设接口,如LCD接口、摄像头接口、触摸屏接口等。
了解开发板的硬件架构是使用开发板的第一步。
为了让你更好地了解T1_MINI2440开发板的使用方法,我们提供一个简单的入门案例。
案例名:LED闪烁案例描述:使用T1_MINI2440开发板上的GPIO接口控制LED灯的闪烁。
实施步骤:1.搭建好T1_MINI2440开发板的硬件环境,并连接好LED灯。
2.配置GPIO接口为输出模式。
3.循环发送高低电平信号,控制LED的闪烁。
可以使用延时函数来控制LED闪烁的速度。
4.编译、烧写并运行程序,观察LED是否闪烁。
以上是一个简单的LED闪烁案例,通过这个案例你可以学会使用T1_MINI2440开发板的GPIO接口控制外设。
随着你对开发板的熟悉程度提高,你可以尝试更复杂的案例,如使用LCD接口显示图像、使用摄像头接口进行图像采集等。
总结:T1_MINI2440开发板是一款适用于嵌入式开发的嵌入式系统板,通过了解开发板的硬件架构和搭建相应的软件环境,你可以迅速上手使用该开发板。
通过实践案例,你能够掌握使用开发板的基本技能,为进一步深入学习嵌入式系统开发打下基础。
希望这份资料可以帮助到你。
2440启动串口输出乱码问题
2440 移植2.6.30 (转)解压缩内核压缩文件后进入到目录中,然后修改Makefile,找到ARCH ?=CROSS_COMPILE ?=这两项,不修改这两项的话将会默认使用x86的配置,这里修改为ARCH ?= armCROSS_COMPILE ?= arm-linux-arm-linux- 是交叉编译器~ 这里我使用的交叉编译器为友善送的arm-linux-gcc-4.3.2.tgz,带EABI然后执行make menuconfig,然后进入System Type中看看是否为ARM体系~第一行为ARM system type 说明没错~ 然后在ARM system type中选择SamSung“S3C2410...”随后在下面出现的S3C2440 Machines中选择SMDK2440退出保存~ 执行make zImage出现ERRORdrivers/video/console/vgacon.c:510:error “PCIMEM_BASE undeclared”是在vgacon_startup中,vgacon是啥?~ 不认识~ 应该是不必要的东西~ 去掉它~vim drivers/video/console/Makefile在里面看见了这句obj-$(CONFIG_VGA_CONSOLE) += vgacon.o然后执行find ./ -name “Kconfig” | xargs grep “VGA_CONSOLE”看见config VGA_CONSOLE 在driver/video/console/Kconfig中也就是说在驱动->视频->终端中,执行make menuconfig在Device Drivers->Graphics Support->Console display driver support中发现了VGA text console去掉它,保存设置后再编译编译完成后将在arch/arm/boot中得到zImage文件使用SuperVivi的USB加载功能启动这个内核文件~ 得到下列输出zImage magic = 0x016f2818Setup linux parameters at 0x30000100linux command line is: "noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0" MACH_TYPE = 1999NOW, Booting Linux......Uncompressing Linux........................................................................................................ done, booting the kernel.失败信息不够丰富~ 根据kasim大大的指点,在配置中进入Kernel hacking打开Kernel debugging和Kernel low-level debugging functions 还有Kernel low-level debugging messages via S3C UART保存后再编译运行zImage后得下列输出zImage magic = 0x016f2818Setup linux parameters at 0x30000100linux command line is: "noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0" MACH_TYPE = 1999NOW, Booting Linux......Uncompressing Linux........................................................................................................ done, booting the kernel.Error: unrecognized/unsupported machine ID (r1 = 0x000007cf).Available machine support:ID (hex) NAME0000016a SMDK2440Please check your kernel config and/or bootloader.失败原来是machine的ID和Supervivi传递进来的ID不匹配~关于machine ID,可以参考一下这篇文章<2.6.18-2内核中对S3C2440的引导启动分析>虽然版本老了点,但是核心思想还是没有变vim arch/arm/mach-s3c2440/mach-smdk2440.c在最后一段有这句MACHINE_START(S3C2440 , ”SMDK2440”)这里S3C2440就是machine ID的代号~ 呢具体值是多少呢?~在arch/arm/tools/mach-types中s3c2440 ARCH_S3C2440 S3C2440 362原来我们的machine ID是362~呢bootloader传递进来的值是多少呢?~Error: unrecognized/unsupported machine ID (r1 = 0x000007cf).注意到没有?~ 0x7CF转换成10进制也就是1999修改mach-types中的对应项s3c2440 ARCH_S3C2440 S3C2440 1999虽然这样就和下面MINI2440的1999冲突了,但是只要不加入MINI2440的配置就没事修改后编译,再执行zImage后得下列输出zImage magic = 0x016f2818Setup linux parameters at 0x30000100linux command line is: "noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0" MACH_TYPE = 1999NOW, Booting Linux......Uncompressing Linux........................................................................................................ done, booting the kernel.失败咦?~ 啥都没有?~ 最起码也应该有个乱码吧这时候我的第一反应是会不会没有跳入到start_kernel中所以马上编辑init/main.c,在start_kernel的前部加上printk(KERN_INFO “in start_kernel \n”);但是这个时候内核还没有初始化,所以printk是没有作用的~继续得到kasim大大的指点,编辑kernel/printk.c中的printk函数{va_list args;int r;#ifdef CONFIG_DEBUG_LLextern void printascii(const char *);char buff[256];#endifva_start(args, fmt);r = vprintk(fmt, args);#ifdef CONFIG_DEBUG_LLvsprintf(buff, fmt, args);#endifva_end(args);#ifdef CONFIG_DEBUG_LLprintascii(buff);#endifreturn r;}编译后执行zImage,得下列输出zImage magic = 0x016f2818Setup linux parameters at 0x30000100linux command line is: "noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0" MACH_TYPE = 1999NOW, Booting Linux......Uncompressing Linux........................................................................................................ done, booting the kernel.<6>in start_kernel<6>Initializing cgroup subsys cpuset<6>Initializing cgroup subsys cpu<5>Linux version 2.6.30.3 (wolf@ubuntu) (gcc version 4.3.2 (Sourcery G++ Lite2008q3-72) ) #4 Wed Aug 5 16:54:49 CST 2009 ..................................................失败虽然正常输出了~ 有进入start_kernel~ 但是为什么之前每输出呢?~ 会不会是没有找到输出设备在输出中看到这行<5>Kernel command line: noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0 console=ttySAC0 会不会是没有ttySAC0这个设备呢~ 在内核中搜索ttySAC 在driver/serial/samsung.c中得到对应项目这时候我猜想会不会没有加载samsung.c , 经过一轮Makefile和Kconfig的查询, 发现对应选项在Device Drivers->Character devices->Serial drivers中一看,原来根本就没有加载Samsung SoC serial support , 选成静态编译之后又出现了Support for console on Samsung SoC serial port ,就是它了,选上, 退出的时候顺便把Kernel low-level debugging functions给取消了否则我们设置的printk会自行输出,就不知道ttySAC有没有加载成功了编译后执行,得下列输出zImage magic = 0x016f2818Setup linux parameters at 0x30000100linux command line is: "noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0" MACH_TYPE = 1999NOW, Booting Linux......Uncompressing Linux......................................................................................................... done, booting the kernel.w# DpñGpGp´ó70ÇC¼ØûÛ»›3ó•ó¸Û0ƒw#DpñGpGp´ó•tØ›•p¸›7¿³ó•\@û7¼¿[£¼Û3•¼ó;£¸ÀÛ;[7û;D°•D@GoGpGpíó•t›7•{ð#ßóÄ;›•770ÄÄ3Çß;GoDh}û7wœ´{…[ó7ûÛ›30°ôܸ‡#_sÄ;›•770Øijœ¼DG@ÁôÛ•ûÄ;•sÄ›£Ø›•DŽ³ÃÛ70ÄGpÁ4ßœ»ôGã›30³D˜ßF[s˜£ÀÛû70ÛD8ßÄ4G8ôGv£°ÇÃGpÍ´0ƒ†# DpñGš´;óC…[4¸F¸ÄÛtÜàGp}4GGÇ4tD@Ä38ÀGpGß ôØ Û›ŸÄÛD\Cûƒ£¸ƒ;7v›Ã30Ü›4Û´£ô¼;C3[;7ù³û770‡¸°[•4tD@Ä38ÀGpGß ´´p‡ƒ•ô¼Û7ŸtÛG»4œØ…Çpíƒw# .......................................失败但这说明ttySAC加载成功了~ 不过为什么是乱码呢?~这时候就需要对比友善的配置和我们的配置有什么不同了~打开友善送的linux-2.6.29,观察arch/arm/mach-s3c2440/mach-mini2440.c和我们的2.6.30.4下面的arch/arm/mach-s3c2440/mach-smdk2440.c有什么不同由于乱码主要是时钟问题,所以我们重点观察UART的设置和基本设置,其它什么NAND LCD 的就不看先修改smdk2440_uartcfgs[][2] = {.ulcon = 0x03,}修改s3c24xx_init_clocks(12000000);然后编译再运行,输出为zImage magic = 0x016f2818Setup linux parameters at 0x30000100linux command line is: "noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0" MACH_TYPE = 1999NOW, Booting Linux......Uncompressing Linux......................................................................................................... done, booting the kernel.[ 0.000000] in start_kernel[ 0.000000] Initializing cgroup subsys cpuset[ 0.000000] Initializing cgroup subsys cpu ...........................最后为Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)失败终于可以正常输出了,但是根文件系统挂载失败因为板子上的根文件系统为yaffs2 这时候内核还没有这个文件系统的支持,需要我们加上去拷贝友善的送的2.6.29下的fs/yaffs2目录到我们的fs目录下然后修改观察一下友善的送的2.6.29下的fs/Kconfig 和fs/Makefile和我们的有什么不同在我们的Kconfig中的source “fs/jffs2/Kconfig” 上面加上source “fs/yaffs2/Kconfig”在Makefile中的obj-$(CONFIG_FAT_FS) += fat/ 上面加上obj-$(CONFIG_YAFFS_FS) += yaffs2/然后在配置的File systems->Miscellaneous filesystems 中选上“YAFFS2 file system support” “Autoselect yaffs2 format” “Cache short names in RAM”然后编译运行,输出如下......................Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)失败还是不行,往上看几行VFS: Cannot open root device "mtdblock2" or unknown-block(0,0)Please append a correct "root=" boot option; here are the available partitions:Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)原来是没有可用的分区这个时候就要更正我们的NAND配置了还是对照友善送的linux-2.6.29,观察arch/arm/plat-s3c24xx/common-friendly-smdk.c来修改我们的arch/arm/plat-s3c24xx/common-smdk.c主要修改smdk_default_nand_part[]{[0] = {.name = “supervivi”,.size = 0x00060000,.offset = 0,},[1] = {.name = “Kernel”,.offset = 0x00060000,.size = 0x00200000,},[2] = {.name = “root”,.offset = 0x00260000,.size = 1024*1024*1024,},[3] = {.name = “nand”,.offset = 0x00000000,.size = 1024*1024*1024,}};编译后运行,输出VFS: Cannot open root device "mtdblock2" or unknown-block(0,0)Please append a correct "root=" boot option; here are the available partitions:Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)失败还是不行,连最起码的分区都没有看见,会不会是MTD没有加载呢?~打开配置进入Device DriversMemory Technology Device ......... 前面是个M~ 说明这个模块是动态加载的,而我们编译的zImage里面只有静态模块将MTD选为静态加载,然后进入MTD配置中看看还有什么需要选的NAND Device Support 这个也是动态,选为静态加载进入NAND Device Support原来连NAND Flash support for S3C2410/S3C2440 SoC都没选,马上选为静态加载保存配置后编译运行,再运行输出如下:NAND device: Manufacturer ID: 0xec, Chip ID: 0xf1 (Samsung NAND 128MiB 3,3V 8-bit) Scanning device for bad blocksCreating 4 MTD partitions on "NAND 128MiB 3,3V 8-bit":0x000000000000-0x000000060000 : "supervivi"0x000000060000-0x000000260000 : "Kernel"0x000000260000-0x000040260000 : "root"mtd: partition "root" extends beyond the end of device "NAND 128MiB 3,3V 8-bit" -- size truncated to 0x7da00000x000000000000-0x000040000000 : "nand"mtd: partition "nand" extends beyond the end of device "NAND 128MiB 3,3V 8-bit" -- size truncated to 0x8000000 ...............................VFS: Cannot open root device "mtdblock2" or unknown-block(0,0)Please append a correct "root=" boot option; here are the available partitions:Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)失败还是没有可用分区,虽然成功分辨了分区,但是没有加载成功,估计还是在MTD的模块选择上这时候需要对照友善的配置,经过对比,发现在友善的配置中静态编译了MTD中的下面3个模块Direct char device access to MTD devicesCommon interface to block layer for MTD …translation layers‟Caching block device access to MTD devices我们也选为静态编译保存配置后编译运行,输出如下List of all partitions:1f00 384 mtdblock0 (driver?)1f01 2048 mtdblock1 (driver?)1f02 128640 mtdblock2 (driver?)1f03 131072 mtdblock3 (driver?)No filesystem could mount root, tried: cramfsKernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(31,2)分区加载成功了,但是文件系统却不能识别,我们之前不是已经加入了yaffs2么?~回到配置中再看,原来是动态编译,并没有真正进入到内核之中,选为静态编译~保存配置后编译,输出为yaffs: dev is 32505858 name is "mtdblock2"yaffs: passed flags ""yaffs: Attempting MTD mount on 31.2, "mtdblock2"yaffs: auto selecting yaffs2yaffs_read_super: isCheckpointed 0VFS: Mounted root (yaffs filesystem) on device 31:2.Freeing init memory: 128KKernel panic - not syncing: Attempted to kill init!失败依然错误,这个时候懵了,哪里错呢~ 没办法,只能对照着友善的配置一个个大模块对着来改当改到Kernel Features的时候错误消失了,原来需要选上Use the ARM EABI to compile the kernelAllow old ABI binaries to run with thie Kernel为什么呢?~ Google了一下,原来友善的根文件系统在编译的时候也启用了EABI特性,内核和文件系统需要对上文件系统用了EABI 内核也要用EABI 内核不用EABI 也只能读取不用EABI的文件系统选上这两项之后再编译,运行,输出如下yaffs: dev is 32505858 name is "mtdblock2"yaffs: passed flags ""yaffs: Attempting MTD mount on 31.2, "mtdblock2"yaffs: auto selecting yaffs2yaffs_read_super: isCheckpointed 0VFS: Mounted root (yaffs filesystem) on device 31:2.Freeing init memory: 128Kmount: mounting none on /proc/bus/usb failed: No such file or directoryhwclock: can't open '/dev/misc/rtc': No such file or directory[01/Jan/1970:00:00:13 +0000] boa: server version Boa/0.94.13[01/Jan/1970:00:00:13 +0000] boa: server built Mar 26 2009 at 15:28:42.[01/Jan/1970:00:00:13 +0000] boa: starting server pid=845, port 80open device leds: No such file or directoryTry to bring eth0 interface up......ifconfig: SIOCGIFFLAGS: No such deviceifconfig: SIOCSIFHWADDR: No such deviceifconfig: SIOCSIFADDR: No such deviceroute: SIOCADDRT: No such processDoneifconfig: SIOCSIFADDR: No such devicePlease press Enter to activate this console.[root@FriendlyARM /]#成功了,ls后输出如下bin home lost+found proc sys vardev lib mini2440 root tmp wwwetc linuxrc opt sbin usr不过ifconfig命令没有成功,继续来配置网卡对比友善的mach-mini2440.c文件,发现我们的mach-smdk2440.c中的smdk2440_devices[]数组并没有&s3c_device_dm9k这个结构,加上,追踪发现该数据结构在arch/arm/plat-s3c24xx/devs.c中,我们的devs.c中没有该数据结构的定义,加上#include <linux/dm9000.h>static struct resource s3c_dm9k_resource[] = {[0] = {.start = S3C2410_CS4,.end = S3C2410_CS4 + 3,.flags = IORESOURCE_MEM,},[1] = {.start = S3C2410_CS4 + 4,.end = S3C2410_CS4 + 4 + 3,.flags = IORESOURCE_MEM,},[2] = {.start = IRQ_EINT7,.end = IRQ_EINT7,.flags = IORESOURCE_IRQ | IRQF_TRIGGER_RISING,},};static struct dm9000_plat_data s3c_dm9k_platdata = {.flags = DM9000_PLATF_16BITONLY,};struct platform_device s3c_device_dm9k = {.name = “dm9000”,.id = 0;.num_resources = ARRAY_SIZE(s3c_dm9k_resource),.resource = s3c_dm9k_resource,.dev = {.platform_data = &s3c_dm9k_platdata,}};EXPORT_SYMBOL(s3c_device_dm9k);编译,出错,error : s3c_device_dm9k undeclared here找不到结构?~ 打开mach-smdk2440.c看看有什么头文件比较显眼的就是<plat/s3c2410.h><plat/s3c2440.h><plat/devs.h>,我们刚才编辑的文件是devs.c呢么devs.h的可能性较高,通过搜索,这个devs.h在/arch/arm/plat-s3c/include/plat/中,打开,BINGO,里面都是devs.c的数据定义加上我们的s3c_device_dm9kextern struct platform_device s3c_device_dm9k;再编译,通过了,不过这个时候先别急,我们只添加了设备,驱动有没有静态加载呢?~ 打开配置Device Drivers->Networks device support->Ethernet(10 or 100Mbit)DM9000 support没选上,马上选为静态编译保存配置,编译后运行,输出如下Try to bring eth0 interface up......说明DM9000配置成功使用ping命令进行测试,发现丢包率高达78%是不是驱动没设置好呢?~ 比较了一下友善的driver/net/dm9000.c和2.6.30.4的dm9000.c,发现明显不同直接拷贝友善的dm9000.c和dm9000.h过来编译后运行,顺利进入终端,然后运行PING丢包改善,基本无丢包我对这次内核移植的总结是:一步步来~ 先做好终端输出再挂载好根文件系统最后才考虑其它驱动的配置到此移植就基本结束了= 3=)/ 感谢阅读。
usb枚举过程
usb枚举过程对2440的USB HOST进行初始化完毕(主要包括对符合OHCI 规范的寄存器的初始化—总线复位、中断使能、清除中断标志、电源管理、内存指针寄存器的初始化,各种数据结构的初始化等),等待USB设备的插入,当2440检测到有设备插入,就要对设备进行枚举了。
那么为什么要对设备进行枚举呢?起始枚举就相当于主机和设备建立连接的过程(接头),Host向Device询问一些东西,Device将自身的设备类型,如何进行通信报告给Host,这样Host就知道怎么着对Device进行操作了。
枚举的过程实际上用到而且只用到了总线的“控制传输(Control Transfer)”的传输方式。
这种传输方式通常用于配置/命令/状态等情形,其中的设置操作setup和状态操作status过程的数据包具有USB 协议定义的数据结构,因此,控制传输只能通过消息管道进行。
一个完整的控制传输包括三个过程:1.建立连接 2.数据过程(可选) 3.状态过程建立连接的过程都是有Host发起,它开始于一个Setup令牌包,后面紧跟一个DATA0包。
如果是控制输入传输,数据过程则为输入数据,若是控制输出传输,则数据过程是输出数据。
数据过程的可选型是指设置过程需要指定数据长度,如果指定为0,则没有数据过程。
状态过程跟在数据过程之后,状态过程恰好和数据过程的数据传输方向相反,因为此阶段主要是用来确认之前两阶段的所有数据都已经正确传输了。
好了,下面就结合我的这个实例来看看枚举的详细过程:1.控制2440向U盘发送第一个Setup包,内容是80 06 00 01 00 00 08 00,其中最后的0008表示得到DEVICE_DCESCRIPTOR 的前8个字节,因为这个包的主要目的是要获得USB Device中端点0的最大包的大小(第8个字节),所以只需要8个字节就可以了。
USB Device返回的设备标识符为12 01 10 01 00 00 00 40,下面我们需要对0x40记录下来,将其放到Endpoint Descriptor数据结构的DWORD0的MPS(bit16~bit32)块中去。
S3C2440重要资料
S3C2440与SDRAM的地址连线分析S3C2440有27根地址线ADDR[26:0],8根片选信号ngcs0-ngcs7,对应bank0-ba nk7,当访问bankx的地址空间,ngcsx引脚为低电平,选中外设。
2^27=2^7 * 2^10 * 2^10 = 128Mbyte8*128Mbyte = 1Gbyte所以S3C2440总的寻址空间是1Gbyte。
市面上很少有32位宽度的单片SDRAM,一般选择2片16位SDRAM扩展得到32位SDRAM.选择的SDARM是HY57V561620F,4Mbit * 4bank *16,共32Mbyte。
首先了解下SDRAM的寻址原理。
SDRAM内部是一个存储阵列。
可以把它想象成一个表格。
和表格的检索原理一样,先指定行,再指定列,就可以准确找到所需要的存储单元。
这个表格称为逻辑B ANK。
目前的SDRAM基本都是4个BANK。
寻址的流程就是先指定BANK地址,再指定行地址,最后指定列地址。
这就是SDRAM的寻址原理。
存储阵列示意图如下:查看HY57V561620F的资料,这个SDRAM有13根行地址线 RA0-RA129根列地址线CA0-CA82根BANK选择线 BA0-BA1SDRAM的地址引脚是复用的,在读写SDRAM存储单元时,操作过程是将读写的地址分两次输入到芯片中,每一次都由同一组地址线输入。
两次送到芯片上去的地址分别称为行地址和列地址。
它们被锁存到芯片内部的行地址锁存器和列地址锁存器。
/RAS是行地址锁存信号,该信号将行地址锁存在芯片内部的行地址锁存器中;/CAS是列地址锁存信号,该信号将列地址锁存在芯片内部的列地址锁存器中。
地址连线如下图:SDRAM的A0接S3C2440的ADDR2,很多初学者都对这里又疑问。
A0为什么不接ADDR0?要理解这种接法,首先要清楚在CPU的寻址空间中,字节(8位)是表示存储容量的唯一单位。
用2片HY57V561620F扩展成32位SDRAM,可以认为每个存储单元是4个字节。
TQ2440烧写uboot全过程
39
天 嵌 科
广州天嵌计算机科技有限公司
地址:广东省广州市天河区五山路 141 号尚德大厦 A2004 室 邮编:510000 电话:020-38921445(销售) 020-22106679 (技术支持) 传真:020-38921445 www. embedsky .net 或 http://www. www.embedsky embedsky. E-mail: support@ 官方网站:http://
技
� 烧写镜像到 Nand Flash 依次选择 “0”;“0”;“0”;如下图
等待几分钟,即可成功烧写 Nand Flash:
40
天 嵌 科
广州天嵌计算机科技有限公司
地址:广东省广州市天河区五山路 141 号尚德大厦 A2004 室 邮编:510000 电话:020-38921445(销售) 020-22106679 (技术支持) 传真:020-38921445 www. embedsky .net 或 http://www. www.embedsky embedsky. E-mail: support@ 官方网站:http://
技
等待几分钟,即可成功烧写 Nor Flash :
42
天 嵌 科
广州天嵌计算机科技有限公司
地址:广东省广州市天河区五山路 141 号尚德大厦 A2004 室 邮编:510000 电话:020-38921445(销售) 020-22106679 (技术支持) 传真:020-38921445 www. embedsky .net 或 http://www. www.embedsky embedsky. E-mail: support@ 官方网站:http://
技
步骤
win7-64位-FriendlyArm-usb-dnw-driver-解决方案
用win7+64位系统是没有友善之臂的usb驱动的,貌似是有国外给2440写过一个驱动,不过我用的是6410,找了很多帖子,偶然在国外的一个贴吧看到一种解决方案,自己测试可以用
其中是两个文件,基本思想是这样的,有一个可以在64位系统中的适用2440的驱动,但是没有数字签证,所以借助另外一个软件给他写入签证。
1、下载文件解压
2、打开dseo13b.exe
Select "enable test mode" -> next -> ok
Select "sign a system file" -> next -> location of secbulk.sys, for example : "c:\downloads\inf64\secbulk.sys"
3、重启电脑
4打开设备管理器,插入usb,给板子上电,发现未知设备,右击,更新驱动程序,选择文件夹secbulk64,自动安装结束
可以下载了!
enjoy!。
S3C2440 之USB 设备篇
S3C2440 之USB 设备篇S3C2440有2 个USB 主机接口和1 个USB 设备接口, 本篇讲述USB 设备接口。
1 USB的分类及主机接口和设备接口的区别1.1USB2.0 按照速度分为以下三类High-speed USB2.0:理论速度480Mbps ,对应之前的USB2.0 ;Full-speed USB2.0 :理论速度12Mbps ,也就是过去的USB1.1 ;Low-speed USB2.0 :理论速度1.5Mbps ,这个一般用于鼠标、键盘等对速度要求不高的外部设备。
1.2低速USB全速USB 硬件设备接口的区别USB通过D-,D+ 信号的状态判断设备的插入,如下图所示,D+ 接上拉电阻为全速设备,D- 接下拉为低速设备。
1.3 MINI2440USB 设备接口的区别Mini2440开发板只有一个USB 主机接口和一个USB 设备接口,均为USB 全速接口。
Mini2440 USB 设备的D+ 是由GPC5 来控制的,如果GPC5 输出高电平,则D+ 上相当于通过上拉电阻接到+5V ,则设备启用;如果GPC5 输出低电平,则D+ 上相当于通过下拉电阻接到GND ,则设备禁用。
2 S3C2440USB设备的固件枚举过程分析2.1 S3C2440 USB 设备的端点2440有5 个端点,EP0 ,EP1 ,EP2 ,EP3 ,EP4, 。
EP0 是用于USB 设备枚举,传输方式为control 方式。
EP1 到EP4 用于数据传输。
端点的传输方向有两种,IN 和OUT ,这个由IN_CSR2_REG来配置。
端点的传输方式,批量(bulk ),中断(interrupt )也是由IN_CSR2_REG来配置。
由上图看到,BIT6 用于配置是批量模式,BIT5 用于配置传输方向。
2.2 S3C2440 USB 程序分析整个USB 枚举过程其实是很简单的,首先进行USB 时钟的初始化,设置为48MHz ;然后GPC5使能,表示全速设备,然后设置USBD1 为USB 设备,禁止USB 挂起,这样调用UsbdMain(); 进行必要的初始化,这样就准备完成了。
JZ2440开发板使用手册
百问网·精智JZ2440使用手册提示:除了QT外,可以不看本手册,参考《嵌入式Linux应用开发完全手册》及视频即可第1章嵌入式Linux开发环境构建 (4)1.1 安装Ubuntu 9.10 (4)1.1.1 安装VMware (4)1.1.2 安装Ubuntu 9.10 (13)1.2 安装Ubuntu下的开发工具 (20)1.3 安装Windows下的开发工具 (22)第2章精智JZ2440开发板烧写程序方法 (23)2.1 使用JTAG工具烧写开发板 (23)2.1.1 Windows下并口JTAG驱动安装 (23)2.1.2 Windows下OpenJTAG驱动安装 (29)2.1.3 Ubuntu下驱动程序的安装 (29)2.1.4 JTAG烧写软件oflash的用法 (29)2.2 通过u-boot烧写整个系统 (29)2.2.1 在Windows下使用dnw和u-boot烧写系统 (30)2.2.2 在Linux下使用dnw和u-boot烧写系统 (31)第3章板上Linux系统搭建 (33)3.1 修改、编译、使用u-boot (33)3.1.1 使用补丁修改、编译u-boot (33)3.1.2 u-boot使用方法 (33)3.2 修改、编译、使用Linux内核 (36)3.2.1 使用补丁修改、编译内核 (36)3.2.2 使用uImage (36)3.3 修改、编译QT (36)3.3.1 编译依赖的软件 (36)3.3.2 使用补丁修改、编译QT (39)3.4 构造根文件系统 (39)3.4.1 基于最小根文件系统制作QT文件系统 (39)3.4.2 制作YAFFS2、JFFS2文件系统映象文件 (42)第1章 嵌入式Linux开发环境构建1.1 安装Ubuntu 9.10注意:如果使用光盘上已经制作好的虚拟机,那么1.1或1.2的内容可以忽略。
《嵌入式Linux应用开发完全手册》里使用的主机开发环境是Ubuntu 7.10,现在最新的Ubuntu版本是9.10。
USB编程器读写24、25存储器方法
我们以HW9编程器为例,HW8使用方法一样,本店其它型号,读写座位置不一样,这一点请一定要参考编程器上面的标注。
首先介绍如何读取24Cxx系列的存储器数据;常见的24CXX 有24C04、24C08(数据大写为1K)、24C16(2k)、24C32(4k)、24C64。
1先把编程器的拉杆拉起来2把24C系列的存储器安装到24读写座上如图:★千万注意,存储器缺口方向对USB接口方向。
3然后压下拉杆。
4把编程器的功能切换到存储器读写状态:按下功能切换开关,然后按一次编程器旁边的复位键,然后连接到电脑的USB接口。
(编程器的驱动安装方法看驱动安装说明书)5打开存储器读写软件(就是上位机软件)如果是HW9先打开这个软件然后点击弹出这个软件界面6如果编程器连接正确软件会显示如图所示:7 选择存储器类型点击红色位置的下拉三角形。
再选择存储器品牌再选择存储器型号8点击读取红色位置的读取读取进度条100%后,点击保存在弹出的对话框红色框里面填写自己想要的文件名填好后点击后面的保存到这里存储器的读取工作就完成了。
二:再说说如何写入数据写入工作前面的操作和读写的操作1-7是一样的,请看前面的1-7介绍,前面准备好之后,点击软件的打开按钮选择你需要写入存储器的数据选好后,点击打开,然后点击自动按钮红色框位置的自动按钮。
如果你设置的都正确,存储器写入结束后会弹出正确提示如图:表示写入成功了。
如果弹出这个表示写入失败,你要重新检查存储器的安装或者设置,当然出现失败的原因有以下几点:1存储器有质量问题2设置存储器的型号不正确3打开的数据和存储器大写不匹配。
重新核对后,再继续操作!祝你成功!!!接下来是25系列存储器的读写方法可以读写的25系列常见的有25TXX、25DXX、25FXX、25QXX、25XXX、25LXX、25LVXX、25VFXX…. 很多型号,这里不能一一列举,如果遇到有存储器只能读取不能写入的可能是存储器有写入保护.因为很多工作和24系列存储器读写是一样的,我只把不同点重点说一下: 1安装存储器位置选择25读写座缺口也是对usb方向2打开软件存储器选择25系列3到这里有一点和24系列不一样,就是25系列的存储器可以自动识别,你只要点击下图的检测按钮就可以自动识别存储器型号和容量大小:如果显示下图这个说明存储器有质量问题或者没有正确安装,请重新安装或者更换存储器.如果存储器安装都正确会正确显示存储器型号如图4接下来点击读取5完成后点击保存操作和24系列一样.25系列的存储器写入工作和24写入方法是一样的,我文字描述一下打开要写入的数据,点击自动等待效验正确取下存储器,大功告成!遇到效验失败的处理方法和24系列一样! 祝工作愉快!家电维修网。
TE2440-II用户手册
TE2440-II用户手册V2.0保定飞凌嵌入式技术有限公司网站:论坛:/bbsTE2440-II是由飞凌嵌入式技术有限公司在原有TE2440开发板的基础上修改并添加了部分功能设计生产的一款基于ARM9的嵌入式工控板,它基于三星公司的ARM处理器S3C2440A,内部带有全性能的MMU(内存处理单元),适用于设计移动手持设备类产品。
TE2440-II采用底板+核心板形式,底板为四层,核心板为六层,性能稳定可靠,具有高性能、低功耗、接口丰富和体积小等优良特性。
该开发板已将芯片S3C2440A 的功能发挥的淋漓尽致,目前已成功移植Linux,WINCE等操作系统。
在使用开发板时,请注意以下事项:1.用户在拿到开发板后,请至网站“客户服务”页面注册,并打电话通知我们您的姓名,购买时间,注册名称,开发板的编号,我们会及时为您开通会员权限,便于您及时下载更新的资料!2.第一次使用TE2440-II开发板时,请务必先阅读用户手册,按照手册上所述进行相关操作,谨防随意破坏系统程序!3.每次使用TE2440-II开发板前,请先将手接触开发板周围金属接口或者其它地方放电,避免直接用手触摸芯片造成芯片烧坏!4.需要对开发板进行物理操作时,请关闭电源,除USB以及网络接口(如果与局域网相接请使用普通网线,开发板带网线为计算机直连网线)外,其它接口均不支持热插拔,开发板工作时,请不要带电插拔。
5.本开发板硬件保修时间为三个月(人为或不可抗力原因除外),技术支持时间三个月(论坛技术支持及“客户服务”下载时间不在此限)。
最后,欢迎您使用TE2440-II开发板,并提出宝贵意见!编者:飞凌嵌入式技术有限公司地址:河北保定市七一西路165号邮编:071051QQ:93644331360189317E-mail:***************.cn网址:论坛:/bbs目录一.第一章TE2440-II开发板硬件介绍 (5)1.1开发套件包含的内容 (5)1.2用户光盘内容说明 (6)1.3TE2440-II开发板外观 (6)1.4TE2440-II开发板硬件资源 (7)1.5硬件资源分配 (8)1.5.1地址空间分配以及片选信号定义 (8)1.5.2开发板接口说明 (10)1.5.3按键说明 (10)1.5.4LED指示灯说明 (11)1.5.5跳线分配表 (11)1.6TE2440-II开发板主要硬件说明 (11)1.6.1系统存储器 (11)1.6.2JTAG及复位逻辑 (12)1.6.3LCD/触摸屏接口引脚定义 (14)1.6.4网络接口 (16)1.6.5IDE(也作为总线接口)接口引脚定义 (19)1.6.6GPIO扩展口引脚定义 (21)1.6.7SD卡接口 (21)1.6.8IIS音频输入输出接口 (23)1.6.9摄像头接口: (24)1.6.10串口电路 (24)1.6.11USB接口 (26)1.6.12功能按键及用户LED指示灯 (27)1.6.13红外接收电路 (29)1.6.14温度传感器电路 (30)1.6.15EEPROM(24C02)电路 (30)1.6.16CAN总线接口电路 (31)1.7TE2440-II支持的操作系统及其驱动 (33)1.7.1Linux操作系统 (33)1.7.2WINCE操作系统 (34)二.第二章TE2440-II开发板基本使用 (35)2.1TE2440-II外部硬件连接 (35)2.2WINDOWS下驱动的安装 (35)2.2.1安装USB驱动 (35)2.2.2安装并口驱动程序 (38)2.3调试终端使用 (41)2.3.1DWN软件的使用 (41)2.3.2超级终端的使用 (42)2.4BOOTLOADER使用全攻略 (45)2.4.1bootloader简介 (45)2.4.2功能菜单说明 (46)2.4.3选择菜单说明 (47)2.4.4参数设置说明 (48)2.4.5如何烧写程序 (49)2.4.6用sjf2440.exe烧写bootloader程序 (51)2.5ADS下的LED试验 (52)2.5.1ADS安装 (52)2.5.2使用ADS创建工程 (52)2.5.3编译和链接工程 (58)2.5.4H-JTAG的安装使用 (67)2.5.5用AXD进行代码调试 (70)一.第一章TE2440-II开发板硬件介绍TE2440-II开发板为底板+核心板形式,底板为四层,核心板为六层板,开发板的布局和走线经过专业人士精心设计,工作非常可靠,可稳定运行在400MHz。
06S3C2410系统接口操作原理及实验
第6章S3C2410 系统接口操作原理及实验在第5 章接口电路的基础上,本章讲解该系统的各接口原理,并辅以实验代码加以说明。
通过本章,读者能掌握S3C2410 处理器的常用接口开发。
本章主要内容:(1)I/O 接口实验(2)串口通信实验(3)中断实验(4)键盘控制实验(5)实时时钟实验(6)看门狗实验(7)串行通信实验(8)A/D 转换实验9)Nand Flash 读写实验I/O 接口实验实验目的(1)掌握S3C2410X 芯片的I/O 控制寄存器的配置。
(2)通过实验掌握ARM 芯片使用I/O 端口控制LED 显示。
(3)了解ARM 芯片中复用I/O 接口的使用方法。
实验设备(1)硬件:Embest ARM 教学实验系统、ULINK USB-JTAG 仿真器套件、PC 机。
(2)软件:MDK 集成开发环境,Windows 98/2000/NT/XP 。
实验内容编写程序,控制实验平台的发光二极管LED1 、LED2 、LED3 、LED4 ,使它们有规律地点亮和熄灭,具体顺序如下:LED1 亮→ LED2 亮→ LED3 亮→ LED4 亮→ LED1 灭→ LED2 灭→ LED3 灭→ LED4 灭→全亮→全灭,如此反复。
实验原理S3C2410X 芯片上共有71 个多功能的输入/ 输出引脚,它们分为7 组I/O 端口:(1)1个23 位的输出端口(端口A)。
(2)2个11 位的输入/输出端口(端口B、H)。
(3)4个16 位的输入/输出端口(端口C、D、E、G)。
(4)1个8 位的输入/输出端口(端口F)。
在运行程序之前必须对每个用到的引脚功能进行设置,如果某些引脚的复用功能没有使用,可以先将该引脚设置为I/O 端口1 .S3C2410X I/O 口常用的控制寄存器(1)端口控制寄存器(GPACON-GPHCON )。
在S3C2410X 中,大多数的引脚都复用,所以必须对每个引脚进行配置。
端口控制寄存器PnCON )定义了每个引脚的功能。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
下面就结合实例来看看枚举的详细过程:
1.控制2440向U盘发送第一个Setup包,内容是80 06 00 01 00 00 08 00,其中最后的0008表示得到DEVICE_DCESCRIPTOR的前8个字节,因为这个包的主要目的是要获得USB Device中端点0的最大包的大小(第8个字节),所以只需要8个字节就可以了。USB Device返回的设备标识符为12 01 10 01 00 00 00 40,下面我们需要对0x40记录下来,将其放到EndpointDescriptor数据结构的DWORD0的MPS(bit16~bit32)块中去。
3.发送第三个Setup包,内容是80 06 00 02 00 00 09 00,这次是为了获取配置描述符集合的大小,此位位于读回数据的第三个字节。U盘返回的数据为09 02 20 00 01 01 00 80 32,即描述符集合总大小为0x20。
4.发送第四个Setup包,内容是Байду номын сангаас0 06 00 02 00 00 20 00,和上次不同的仅仅是,这次要读回来的数据是整个配置描述符区域。U盘返回来的数据是09 02 20 00 01 01 00 80 32 09 04 00 00 02 08 06 50 00 07 05 82 02 40 00 00 07 05 02 02 40 00 00。
2.接下来2440发送第二个Setup包,内容是00 05 01 00 00 00 00 00这一个次的作用是为USB设备分配地址(相当于SD卡中的RCA)。如果USB Device接收并接受了此地址设置包,会返回一个长度为0的数据包。Host接收到长度为0的状态包之后就会返回一个ACK给Device,Device再接收到这个ACK之后,就可以启用新地址了。这样Device就得到了一个唯一的设备地址,作为主机通信的唯一表示。
对2440的USB HOST进行初始化完毕(主要包括对符合OHCI规范的寄存器的初始化—总线复位、中断使能、清除中断标志、电源管理、内存指针寄存器的初始化,各种数据结构的初始化等),等待USB设备的插入,当2440检测到有设备插入,就要对设备进行枚举了。
那么为什么要对设备进行枚举呢?起始枚举就相当于主机和设备建立连接的过(接头),Host向Device询问一些东西,Device将自身的设备类型,如何进行通信报告给Host,这样Host就知道怎么着对Device进行操作了。
建立连接的过程都是有Host发起,它开始于一个Setup令牌包,后面紧跟一个DATA0包。如果是控制输入传输,数据过程则为输入数据,若是控制输出传输,则数据过程是输出数据。
数据过程的可选是指设置过程需要指定数据长度,如果指定为0,则没有数据过程。状态过程跟在数据过程之后,状态过程恰好和数据过程的数据传输方向相反,因为此阶段主要是用来确认之前两阶段的所有数据都已经正确传输了。
至此,USB的枚举过程就完成了。
这时候我们就可以知道该设备是什么类型的设备,支持什么样的操作了。上述这两个过程也有的程序就是直接读取0xff个字符大小,当然同样可以达到读回设备描述符集合的目的。
至此,我们已经得到了所需要的设备信息,之后就可以对设备进行配置了。
5.向设备发送第五个Setup包,数据为00 09 01 00 00 00 00 00,USB Device返回一个长度为0的数据包,表明数据正确接收。(01 为Configuration Descriptor返回的bConfigurationValue字段 第6字节)
枚举的过程实际上用到而且只用到了总线的“控制传输(Control Transfer)”的传输方式。这种传输方式通常用于配置/命令/状态等情形,其中的设置操作setup和状态操作status过程的数据包具有USB协议定义的数据结构,因此,控制传输只能通过消息管道进行。
一个完整的控制传输包括三个过程:1.建立连接 2.数据过程(可选) 3.状态过程