這個需要設置get的默認目錄,linxu的命令是lcd,lcd是在本地機上改變工作目錄。
一個完整的get例子大致如下:
ftp 192.168.0.123
lcd C:\Users\user1\Desktop
binary //設置為二進制接收
get filename //獲取文件
bye //退出
Ⅱ usb hub的linux驅動問題求教,多謝
static int __init ohci_hcd_mod_init(void)
{
platform_driver_register(&ohci_hcd_s3c2410_driver);
}
其實真正注冊的是ohci_hcd_s3c2410_driver這個驅動。那我們來看一下這個結構體的具體值。
static struct platform_driver ohci_hcd_s3c2410_driver= {
.probe = ohci_hcd_s3c2410_drv_probe,
.remove = ohci_hcd_s3c2410_drv_remove,
.shutdown = usb_hcd_platform_shutdown,
.driver = {
.owner = THIS_MODULE,
.name = "s3c2410-ohci",
},
};
那我們一一來看上述的每一個函數的實現。
2.1 hcd 探測
函數很簡單其實現功能的是usb_hcd_s3c2410_probe函數。
static int ohci_hcd_s3c2410_drv_probe(structplatform_device *pdev)
{
returnusb_hcd_s3c2410_probe(&ohci_s3c2410_hc_driver, pdev);
}
ohci_s3c2410_hc_driver提供了對於ohci的操作集。對於這些函數在後面的學習中去看,在此不加擴展。我們將下面的函數剔除枝葉留其主幹。
static int usb_hcd_s3c2410_probe (const structhc_driver *driver,
struct platform_device *dev)
{
structusb_hcd *hcd = NULL;
int retval;
#if !defined(CONFIG_ARCH_2410)
usb_host_clk_en(); --使能clk
#endif
s3c2410_usb_set_power(dev->dev.platform_data,1, 1);
s3c2410_usb_set_power(dev->dev.platform_data,2, 1);
hcd =usb_create_hcd(driver, &dev->dev, "s3c24xx"); --創建一個hcd
hcd->rsrc_start= dev->resource[0].start; --獲取物理地址
hcd->rsrc_len = dev->resource[0].end -dev->resource[0].start + 1;
request_mem_region(hcd->rsrc_start,hcd->rsrc_len, hcd_name);
clk =clk_get(&dev->dev, "usb-host");
s3c2410_start_hc(dev,hcd);
hcd->regs= ioremap(hcd->rsrc_start, hcd->rsrc_len);
ohci_hcd_init(hcd_to_ohci(hcd));
retval = usb_add_hcd(hcd,dev->resource[1].start, IRQF_DISABLED);
return 0;
}
對於usb的電源管理,我們暫時不看,不看不代表不重要,電源管理是很重要的。
那依次來看上面的函數。usb_create_hcd創建和初始化一個hcd結構體。
s3c2410_start_hc啟動hc。這里有一個很奇怪的結構體就是struct s3c2410_hcd_info,在s3c6410中並沒有看到該結構體的賦值。也許有人對此很困惑,該結構體做什麼用的。那我們來看該結構體的真正面目。
struct s3c2410_hcd_info {
structusb_hcd *hcd; --保存該hcd_info所屬的hcd
structs3c2410_hcd_portport[2]; --兩個埠。
void (*power_control)(intport, int to); --電源控制
void (*enable_oc)(structs3c2410_hcd_info *, int on);
void (*report_oc)(structs3c2410_hcd_info *, int ports);
};
在usb-host.txt中對其功能進行了說明,就是一對函數,使能過流檢測和控制埠電源狀態。
power_control:使能或禁止埠電源
enable_oc :使能或禁止埠過流檢測
report_oc :當埠存在過流,則會調用該函數。
static void s3c2410_start_hc(structplatform_device *dev, struct usb_hcd *hcd)
{
structs3c2410_hcd_info *info = dev->dev.platform_data;
clk_enable(clk);
if (info !=NULL) { --在s3c6410中該info為空。
info->hcd = hcd;
info->report_oc= s3c2410_hcd_oc;
if(info->enable_oc != NULL) {
(info->enable_oc)(info,1);
}
}
}
初始化ohci_hcd
static void ohci_hcd_init(structohci_hcd *ohci)
{
ohci->next_statechange= jiffies;
spin_lock_init(&ohci->lock);
INIT_LIST_HEAD(&ohci->pending);
}
初始化並注冊usb_hcd
完成通用hcd的初始化和注冊,在這里同時完成中斷的申請和注冊。
int usb_add_hcd(struct usb_hcd *hcd,unsigned intirqnum, unsigned long irqflags)
{
int retval;
structusb_device *rhdev;
hcd->authorized_default= hcd->wireless? 0 : 1; --判斷是否為無線
set_bit(HCD_FLAG_HW_ACCESSIBLE,&hcd->flags); --設置HW_ACCESSIBLE旗標
if ((retval =hcd_buffer_create(hcd)) != 0) { --開辟hcd的緩沖區
returnretval;
}
if ((retval =usb_register_bus(&hcd->self)) < 0)
gotoerr_register_bus;
if ((rhdev =usb_alloc_dev(NULL, &hcd->self, 0)) == NULL) {
retval= -ENOMEM;
gotoerr_allocate_root_hub;
}
rhdev->speed= (hcd->driver->flags & HCD_USB2) ? USB_SPEED_HIGH :USB_SPEED_FULL;--指定根hub的speed
hcd->self.root_hub= rhdev;
device_init_wakeup(&rhdev->dev,1);
if(hcd->driver->reset && (retval = hcd->driver->reset(hcd))< 0) {--為NULL
gotoerr_hcd_driver_setup;
}
if(device_can_wakeup(hcd->self.controller)
&&device_can_wakeup(&hcd->self.root_hub->dev))
dev_dbg(hcd->self.controller,"supports USB remote wakeup\n");
if(hcd->driver->irq) { --中斷處理
if(irqflags & IRQF_SHARED)
irqflags&= ~IRQF_DISABLED;
snprintf(hcd->irq_descr,sizeof(hcd->irq_descr), "%s:usb%d",
hcd->driver->description,hcd->self.busnum);
request_irq(irqnum,&usb_hcd_irq, irqflags,hcd->irq_descr, hcd);--申請中斷線
}
hcd->irq= irqnum;
} else {
hcd->irq= -1;
}
hcd->driver->start(hcd); --調用start為 ohci_s3c2410_start
rhdev->bus_mA= min(500u, hcd->power_budget);
register_root_hub(hcd)); --注冊root hub
retval =sysfs_create_group(&rhdev->dev.kobj, &usb_bus_attr_group);
if (retval< 0) {
gotoerror_create_attr_group;
}
if(hcd->uses_new_polling && hcd->poll_rh)
usb_hcd_poll_rh_status(hcd);
returnretval;
}
那一一來看上面的函數,學習內核就要有打破砂鍋問到底的精神,唯有知道那背後的種種風光,才能領略那種種風采。閑話不說,繼續!
記住下面結構體中flag的值。那就看這幾個宏定義是什麼意思。
#defineHCD_MEMORY 0x0001 --hc的寄存器使用memory映射
#defineHCD_LOCAL_MEM 0x0002 --hc使用local memory
#defineHCD_USB11 0x0010 --usb1.1
#defineHCD_USB2 0x0020 --usb2.0
static const struct hc_driver ohci_s3c2410_hc_driver=
{
.flags = HCD_USB11 | HCD_MEMORY,
};
為hcd分配緩沖池,當hc需要使用DMA內存分配器。
int hcd_buffer_create(struct usb_hcd *hcd)
{
char name[16];
int i, size;
if(!hcd->self.controller->dma_mask &&
!(hcd->driver->flags &HCD_LOCAL_MEM))
return 0;
--#define HCD_BUFFER_POOLS 4
我們查看pool_max其實是一個全局數組。如果需要開辟的緩沖區更大的話,直接採用分配page的函數。
static const size_tpool_max[HCD_BUFFER_POOLS] = {
32,128,512,PAGE_SIZE/ 2
};
for (i = 0; i< HCD_BUFFER_POOLS; i++) {
size = pool_max[i];
if(!size)
continue;
snprintf(name,sizeof name, "buffer-%d", size);
hcd->pool[i] = dma_pool_create(name,hcd->self.controller,size, size, 0);
if(!hcd->pool [i]) {
hcd_buffer_destroy(hcd);
return-ENOMEM;
}
}
return 0;
}
dma_pool_create創建一個DMA池(生成一個dma_pool,並沒有分配相應空間,真正分配物理內存將在dma_pool_alloc()總實現)。
下面的函數是usb_bus注冊,對於該函數也許很難理解。不過參照網上http://www.su.cn/info/html/e/20080425/301909.html的說明,估計會好理解很多。
每個主機控制器擁有一個USB系統,稱為一個USB匯流排。USBD支持多個主機控制器,即多個USB匯流排。當每增加一個主機控制器時,會給他分配一個usb_bus結構。USBD動態安裝和卸載主機驅動。主機驅動安裝時,他的初始化函數一方面完成主機控制器硬體的設置和初始化工作,另一方面調用usb_alloc_bus和usb_register_bus來將自己注冊到USBD中去,供USB子系統訪問。
static int usb_register_bus(struct usb_bus *bus)
{
int result =-E2BIG;
int busnum;
mutex_lock(&usb_bus_list_lock);
busnum =find_next_zero_bit (busmap.busmap, USB_MAXBUS, 1);
--用busmap來存儲主機驅動,一個bit位代表一個主機驅動
if (busnum >=USB_MAXBUS) {
return result;
}
set_bit (busnum,busmap.busmap);
bus->busnum = busnum;
bus->dev =device_create(usb_host_class, bus->controller, MKDEV(0, 0),bus,"usb_host%d", busnum);
--在usb_host類下創建一個usb_host設備。
list_add(&bus->bus_list, &usb_bus_list);
mutex_unlock(&usb_bus_list_lock);
usb_notify_add_bus(bus);
return 0;
}
Ⅲ 為什麼linux上的時間不準
轉換誤差2. 時鍾不穩定3. 時鍾頻率不對
Ⅳ Linux系統中curl get、post請求
一:curl get請求
二:curl post請求
備註:PHP中可以使用http_build_query()函數,處理curl post參數,使其支持多維數組傳遞
轉自: www.cnblogs.com/z-books/p/6228284.html
Ⅳ c程序如何通過參數獲得linux系統啟動時間
uptime是來linux命令里獲取有關系自統時間的。他就是到/proc/uptime找出一些信息計算的。
你也可以
/proc/uptime 提供了系統最近一次啟動以來運行的時間,
讀取這個文件然後自己計算,uptime里的第一個時間是up後的seconds,自己折算為天數等。
Ⅵ 在Linux系統下,如何用get命令從一個伺服器上將一個文件或文件夾下載到另一個伺服器上
你的get命令應該是在ftp下使用的吧
如果是伺服器和伺服器之間的文件復制,可以使用scp命令
scp filename ip:/foldername